small hacks for running on current hardware This patch is not meant for inclusion in a generic kernel, but is currently needed to support the available HW. Most of the things done in here are workarounds for deficiencies in the present hardware or firmware that will be solved there in later releases. Index: linux-2.6.13/arch/ppc64/Kconfig =================================================================== --- linux-2.6.13.orig/arch/ppc64/Kconfig +++ linux-2.6.13/arch/ppc64/Kconfig @@ -221,6 +221,12 @@ config SMP If you don't know what to do here, say Y. +config BE_DD2 + bool "BE DD2.x Errata Workaround Support" + depends on PPC_BPA + ---help--- + This support enables BE DD2.x errata workarounds. + config NR_CPUS int "Maximum number of CPUs (2-128)" range 2 128 Index: linux-2.6.13/arch/ppc64/kernel/Makefile =================================================================== --- linux-2.6.13.orig/arch/ppc64/kernel/Makefile +++ linux-2.6.13/arch/ppc64/kernel/Makefile @@ -33,7 +33,7 @@ obj-$(CONFIG_PPC_PSERIES) += pSeries_pci pSeries_nvram.o rtasd.o ras.o pSeries_reconfig.o \ pSeries_setup.o pSeries_iommu.o -obj-$(CONFIG_PPC_BPA) += bpa_setup.o bpa_iommu.o bpa_nvram.o \ +obj-$(CONFIG_PPC_BPA) += bpa_setup.o bpa_iommu.o bpa_nvram.o bpa_pci.o \ bpa_iic.o spider-pic.o obj-$(CONFIG_KEXEC) += machine_kexec.o Index: linux-2.6.13/arch/ppc64/kernel/bpa_iommu.c =================================================================== --- linux-2.6.13.orig/arch/ppc64/kernel/bpa_iommu.c +++ linux-2.6.13/arch/ppc64/kernel/bpa_iommu.c @@ -245,8 +245,6 @@ set_iocmd_config(void __iomem *base) } /* FIXME: get these from the device tree */ -#define ioc_base 0x20000511000ull -#define ioc_mmio_base 0x20000510000ull #define ioid 0x48a #define iopt_phys_offset (- 0x20000000) /* We have a 512MB offset from the SB */ #define io_page_size 0x1000000 @@ -278,12 +276,22 @@ static void bpa_map_iommu(void) void __iomem *base; ioste ioste; unsigned long index; - + struct device_node *node; + unsigned long *handle, ioc_mmio_base, ioc_base; + int nodelen; + + for(node = of_find_node_by_type(NULL, "cpu"); + node; + node = of_find_node_by_type(node, "cpu")) { + handle = (unsigned long *) get_property(node, "ioc-translation", &nodelen); + ioc_base = *handle + 0x1000; + base = __ioremap(ioc_base, 0x1000, _PAGE_NO_CACHE); pr_debug("%lx mapped to %p\n", ioc_base, base); set_iocmd_config(base); iounmap(base); + ioc_mmio_base = *handle; base = __ioremap(ioc_mmio_base, 0x1000, _PAGE_NO_CACHE); pr_debug("%lx mapped to %p\n", ioc_mmio_base, base); @@ -302,6 +310,7 @@ static void bpa_map_iommu(void) map_iopt_entry(address)); } iounmap(base); + } } Index: linux-2.6.13/arch/ppc64/kernel/bpa_pci.c =================================================================== --- /dev/null +++ linux-2.6.13/arch/ppc64/kernel/bpa_pci.c @@ -0,0 +1,83 @@ +/* + * BPA specific PCI code + * + * Copyright (C) 2005 IBM Corporation, + Arnd Bergmann + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include + +#include +#include +#include + +#include "pci.h" +#include "bpa_iic.h" + +void __init bpa_final_fixup(void) +{ + struct pci_dev *dev = NULL; + + phbs_remap_io(); + + for_each_pci_dev(dev) { + // FIXME: fix IRQ numbers for devices on second south bridge + } +} + +static void fixup_spider_ipci_irq(struct pci_dev* dev) +{ + int irq_node_offset; + pr_debug("fixup for %04x:%04x at %02x.%1x: ", dev->vendor, dev->device, + PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn)); + switch (dev->devfn) { + case PCI_DEVFN(3,0): + /* ethernet */ + dev->irq = 8; + break; + case PCI_DEVFN(5,0): + /* OHCI 0 */ + dev->irq = 10; + break; + case PCI_DEVFN(6,0): + /* OHCI 1 */ + dev->irq = 11; + break; + case PCI_DEVFN(5,1): + /* EHCI 0 */ + dev->irq = 10; + break; + case PCI_DEVFN(6,1): + /* EHCI 1 */ + dev->irq = 11; + break; + } + + irq_node_offset = IIC_NODE_STRIDE * (pci_domain_nr(dev->bus)-1); + dev->irq += irq_node_offset; + + pr_debug("irq %0x\n", dev->irq); +} + +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TOSHIBA_2, + PCI_DEVICE_ID_TOSHIBA_SPIDER_NET, fixup_spider_ipci_irq); +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TOSHIBA_2, + PCI_DEVICE_ID_TOSHIBA_SPIDER_OHCI, fixup_spider_ipci_irq); +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TOSHIBA_2, + PCI_DEVICE_ID_TOSHIBA_SPIDER_EHCI, fixup_spider_ipci_irq); Index: linux-2.6.13/arch/ppc64/kernel/bpa_setup.c =================================================================== --- linux-2.6.13.orig/arch/ppc64/kernel/bpa_setup.c +++ linux-2.6.13/arch/ppc64/kernel/bpa_setup.c @@ -54,6 +54,8 @@ #define DBG(fmt...) #endif +extern void bpa_final_fixup(void); + void bpa_get_cpuinfo(struct seq_file *m) { struct device_node *root; @@ -129,6 +131,7 @@ struct machdep_calls __initdata bpa_md = .setup_arch = bpa_setup_arch, .init_early = bpa_init_early, .get_cpuinfo = bpa_get_cpuinfo, + .pcibios_fixup = bpa_final_fixup, .restart = rtas_restart, .power_off = rtas_power_off, .halt = rtas_halt, Index: linux-2.6.13/arch/ppc64/kernel/head.S =================================================================== --- linux-2.6.13.orig/arch/ppc64/kernel/head.S +++ linux-2.6.13/arch/ppc64/kernel/head.S @@ -312,6 +312,38 @@ label##_pSeries: \ RUNLATCH_ON(r13); \ EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common) +#define WORKAROUND_EXCEPTION_PSERIES(n, label) \ + . = n; \ + .globl label##_pSeries; \ +label##_pSeries: \ + mtspr SPRG1,r21; /* save r21 */ \ + mfspr r21, SPRN_CTRLF; \ + oris r21, r21, 0x00C0; \ + mtspr SPRN_CTRLT, r21; \ + mfspr r21,SPRG1; /* restore r21 */ \ + mtspr SPRG1,r13; /* save r13 */ \ + EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common) + +#define RES_EXCEPTION_PSERIES(n, label) \ + . = n; \ + .globl label##_pSeries; \ +label##_pSeries: \ + mtspr SPRG2,r20; /* use SPRG2 as scratch reg */ \ + mtspr SPRG1,r21; /* use SPRG1 as scratch reg */ \ + mfspr r20,SPRG3; /* get paca virtual address */ \ + cmpdi r20,0x0; /* if SPRG3 zero,thread */ \ + bne 20f; /* shouldn't run */ \ +18: /* Stop current Thread */ \ + andi. r21,0,0; \ + mtspr SPRN_CTRLT,r21; \ +19: \ + b 19b; /* Thread should be stopped */ \ +20: \ + HMT_MEDIUM; \ + mtspr SPRG1,r13; /* save r13 */ \ + RUNLATCH_ON(r13); \ + EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common) + #define STD_EXCEPTION_ISERIES(n, label, area) \ .globl label##_iSeries; \ label##_iSeries: \ @@ -391,7 +423,11 @@ label##_common: \ .globl __start_interrupts __start_interrupts: +#ifdef CONFIG_BE_DD2 + RES_EXCEPTION_PSERIES(0x100, system_reset) +#else STD_EXCEPTION_PSERIES(0x100, system_reset) +#endif . = 0x200 _machine_check_pSeries: @@ -459,11 +495,19 @@ instruction_access_slb_pSeries: mfspr r3,SRR0 /* SRR0 is faulting address */ b .do_slb_miss /* Rel. branch works in real mode */ +#ifdef CONFIG_BE_DD2 + WORKAROUND_EXCEPTION_PSERIES(0x500, hardware_interrupt) +#else STD_EXCEPTION_PSERIES(0x500, hardware_interrupt) +#endif STD_EXCEPTION_PSERIES(0x600, alignment) STD_EXCEPTION_PSERIES(0x700, program_check) STD_EXCEPTION_PSERIES(0x800, fp_unavailable) +#ifdef CONFIG_BE_DD2 + WORKAROUND_EXCEPTION_PSERIES(0x900, decrementer) +#else STD_EXCEPTION_PSERIES(0x900, decrementer) +#endif STD_EXCEPTION_PSERIES(0xa00, trap_0a) STD_EXCEPTION_PSERIES(0xb00, trap_0b) Index: linux-2.6.13/arch/ppc64/kernel/prom_init.c =================================================================== --- linux-2.6.13.orig/arch/ppc64/kernel/prom_init.c +++ linux-2.6.13/arch/ppc64/kernel/prom_init.c @@ -1365,6 +1365,8 @@ static int __init prom_find_machine_type return PLATFORM_POWERMAC; if (strstr(p, RELOC("Momentum,Maple"))) return PLATFORM_MAPLE; + if (strstr(p, RELOC("IBM,CPB"))) + return PLATFORM_BPA; i += sl + 1; } } Index: linux-2.6.13/arch/ppc64/kernel/spider-pic.c =================================================================== --- linux-2.6.13.orig/arch/ppc64/kernel/spider-pic.c +++ linux-2.6.13/arch/ppc64/kernel/spider-pic.c @@ -84,10 +84,11 @@ static void __iomem *spider_get_irq_conf static void spider_enable_irq(unsigned int irq) { + int nodeid = (irq / IIC_NODE_STRIDE) * 0x10; void __iomem *cfg = spider_get_irq_config(irq); irq = spider_get_nr(irq); - out_be32(cfg, in_be32(cfg) | 0x3107000eu); + out_be32(cfg, in_be32(cfg) | 0x3107000eu | nodeid); out_be32(cfg + 4, in_be32(cfg + 4) | 0x00020000u | irq); } @@ -150,13 +151,17 @@ int spider_get_irq(unsigned long int_pen void spider_init_IRQ(void) { int node; +#if 0 struct device_node *dn; unsigned int *property; +#endif long spiderpic; + long pics[] = { 0x24000008000, 0x34000008000 }; int n; /* FIXME: detect multiple PICs as soon as the device tree has them */ - for (node = 0; node < 1; node++) { + for (node = 0; node < num_present_cpus()/2; node++) { +#if 0 dn = of_find_node_by_path("/"); n = prom_n_addr_cells(dn); property = (unsigned int *) get_property(dn, @@ -166,11 +171,14 @@ void spider_init_IRQ(void) continue; for (spiderpic = 0; n > 0; --n) spiderpic = (spiderpic << 32) + *property++; +#endif + spiderpic = pics[node]; printk(KERN_DEBUG "SPIDER addr: %lx\n", spiderpic); spider_pics[node] = __ioremap(spiderpic, 0x800, _PAGE_NO_CACHE); for (n = 0; n < IIC_NUM_EXT; n++) { int irq = n + IIC_EXT_OFFSET + node * IIC_NODE_STRIDE; get_irq_desc(irq)->handler = &spider_pic; + } /* do not mask any interrupts because of level */ out_be32(spider_pics[node] + TIR_MSK, 0x0); @@ -184,8 +192,6 @@ void spider_init_IRQ(void) /* Enable the interrupt detection enable bit. Do this last! */ out_be32(spider_pics[node] + TIR_DEN, - in_be32(spider_pics[node] +TIR_DEN) | 0x1); - - } + in_be32(spider_pics[node] + TIR_DEN) | 0x1); } } Index: linux-2.6.13/include/asm-ppc64/processor.h =================================================================== --- linux-2.6.13.orig/include/asm-ppc64/processor.h +++ linux-2.6.13/include/asm-ppc64/processor.h @@ -438,7 +438,7 @@ struct thread_struct { .fs = KERNEL_DS, \ .fpr = {0}, \ .fpscr = 0, \ - .fpexc_mode = MSR_FE0|MSR_FE1, \ + .fpexc_mode = 0, \ } /* Index: linux-2.6.13/include/linux/pci_ids.h =================================================================== --- linux-2.6.13.orig/include/linux/pci_ids.h +++ linux-2.6.13/include/linux/pci_ids.h @@ -1612,6 +1612,8 @@ #define PCI_DEVICE_ID_TOSHIBA_TX4927 0x0180 #define PCI_DEVICE_ID_TOSHIBA_TC86C001_MISC 0x0108 #define PCI_DEVICE_ID_TOSHIBA_SPIDER_NET 0x01b3 +#define PCI_DEVICE_ID_TOSHIBA_SPIDER_OHCI 0x01b6 +#define PCI_DEVICE_ID_TOSHIBA_SPIDER_EHCI 0x01b5 #define PCI_VENDOR_ID_RICOH 0x1180 #define PCI_DEVICE_ID_RICOH_RL5C465 0x0465 Index: linux-2.6.13/arch/ppc64/configs/bpa_defconfig =================================================================== --- linux-2.6.13.orig/arch/ppc64/configs/bpa_defconfig +++ linux-2.6.13/arch/ppc64/configs/bpa_defconfig @@ -1,7 +1,7 @@ # # Automatically generated make config: don't edit -# Linux kernel version: 2.6.13-rc6 -# Mon Aug 8 14:12:19 2005 +# Linux kernel version: 2.6.13 +# Wed Sep 28 14:55:58 2005 # CONFIG_64BIT=y CONFIG_MMU=y @@ -86,6 +86,7 @@ CONFIG_KEXEC=y # CONFIG_POWER4_ONLY is not set # CONFIG_IOMMU_VMERGE is not set CONFIG_SMP=y +CONFIG_BE_DD2=y CONFIG_NR_CPUS=4 CONFIG_ARCH_SELECT_MEMORY_MODEL=y CONFIG_ARCH_FLATMEM_ENABLE=y @@ -108,7 +109,7 @@ CONFIG_HZ=250 CONFIG_GENERIC_HARDIRQS=y CONFIG_PPC_RTAS=y CONFIG_RTAS_PROC=y -CONFIG_RTAS_FLASH=y +CONFIG_RTAS_FLASH=m CONFIG_SECCOMP=y CONFIG_ISA_DMA_API=y @@ -118,7 +119,7 @@ CONFIG_ISA_DMA_API=y CONFIG_PCI=y CONFIG_PCI_DOMAINS=y CONFIG_BINFMT_ELF=y -# CONFIG_BINFMT_MISC is not set +CONFIG_BINFMT_MISC=y CONFIG_PCI_LEGACY_PROC=y CONFIG_PCI_NAMES=y # CONFIG_PCI_DEBUG is not set @@ -456,16 +457,17 @@ CONFIG_MII=y # # CONFIG_ACENIC is not set # CONFIG_DL2K is not set -CONFIG_E1000=m +CONFIG_E1000=y # CONFIG_E1000_NAPI is not set # CONFIG_NS83820 is not set # CONFIG_HAMACHI is not set # CONFIG_YELLOWFIN is not set # CONFIG_R8169 is not set -CONFIG_SKGE=m +# CONFIG_SKGE is not set # CONFIG_SK98LIN is not set # CONFIG_TIGON3 is not set # CONFIG_BNX2 is not set +CONFIG_SPIDER_NET=m # CONFIG_MV643XX_ETH is not set # @@ -577,6 +579,7 @@ CONFIG_SERIAL_CORE_CONSOLE=y # CONFIG_SERIAL_JSM is not set CONFIG_UNIX98_PTYS=y # CONFIG_LEGACY_PTYS is not set +CONFIG_RTASCONS=y # # IPMI @@ -800,6 +803,7 @@ CONFIG_TMPFS_XATTR=y # CONFIG_TMPFS_SECURITY is not set CONFIG_HUGETLBFS=y CONFIG_HUGETLB_PAGE=y +CONFIG_SPU_FS=m CONFIG_RAMFS=y # Index: linux-2.6.13/arch/ppc64/kernel/bpa_iic.c =================================================================== --- linux-2.6.13.orig/arch/ppc64/kernel/bpa_iic.c +++ linux-2.6.13/arch/ppc64/kernel/bpa_iic.c @@ -205,6 +205,18 @@ static struct iic_regs __iomem *find_iic } #ifdef CONFIG_SMP + +/* Use the highest interrupt priorities for IPI */ +static inline int iic_ipi_to_irq(int ipi) +{ + return IIC_IPI_OFFSET + IIC_NUM_IPIS - 1 - ipi; +} + +static inline int iic_irq_to_ipi(int irq) +{ + return IIC_NUM_IPIS - 1 - (irq - IIC_IPI_OFFSET); +} + void iic_setup_cpu(void) { out_be64(&__get_cpu_var(iic).regs->prio, 0xff); @@ -212,18 +224,20 @@ void iic_setup_cpu(void) void iic_cause_IPI(int cpu, int mesg) { - out_be64(&per_cpu(iic, cpu).regs->generate, mesg); + out_be64(&per_cpu(iic, cpu).regs->generate, (IIC_NUM_IPIS - 1 - mesg) << 4); } static irqreturn_t iic_ipi_action(int irq, void *dev_id, struct pt_regs *regs) { - - smp_message_recv(irq - IIC_IPI_OFFSET, regs); + smp_message_recv(iic_irq_to_ipi(irq), regs); return IRQ_HANDLED; } -static void iic_request_ipi(int irq, const char *name) +static void iic_request_ipi(int ipi, const char *name) { + int irq; + + irq = iic_ipi_to_irq(ipi); /* IPIs are marked SA_INTERRUPT as they must run with irqs * disabled */ get_irq_desc(irq)->handler = &iic_pic; @@ -233,10 +247,10 @@ static void iic_request_ipi(int irq, con void iic_request_IPIs(void) { - iic_request_ipi(IIC_IPI_OFFSET + PPC_MSG_CALL_FUNCTION, "IPI-call"); - iic_request_ipi(IIC_IPI_OFFSET + PPC_MSG_RESCHEDULE, "IPI-resched"); + iic_request_ipi(PPC_MSG_CALL_FUNCTION, "IPI-call"); + iic_request_ipi(PPC_MSG_RESCHEDULE, "IPI-resched"); #ifdef CONFIG_DEBUGGER - iic_request_ipi(IIC_IPI_OFFSET + PPC_MSG_DEBUGGER_BREAK, "IPI-debug"); + iic_request_ipi(PPC_MSG_DEBUGGER_BREAK, "IPI-debug"); #endif /* CONFIG_DEBUGGER */ } #endif /* CONFIG_SMP */ Index: linux-2.6.13/arch/ppc64/kernel/nvram.c =================================================================== --- linux-2.6.13.orig/arch/ppc64/kernel/nvram.c +++ linux-2.6.13/arch/ppc64/kernel/nvram.c @@ -81,80 +81,74 @@ static loff_t dev_nvram_llseek(struct fi static ssize_t dev_nvram_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) { - ssize_t len; - char *tmp_buffer; - int size; + ssize_t ret; + char *tmp = NULL; + ssize_t size; + + ret = -ENODEV; + if (!ppc_md.nvram_size) + goto out; - if (ppc_md.nvram_size == NULL) - return -ENODEV; + ret = 0; size = ppc_md.nvram_size(); + if (*ppos >= size || size < 0) + goto out; - if (!access_ok(VERIFY_WRITE, buf, count)) - return -EFAULT; - if (*ppos >= size) - return 0; - if (count > size) - count = size; - - tmp_buffer = (char *) kmalloc(count, GFP_KERNEL); - if (!tmp_buffer) { - printk(KERN_ERR "dev_read_nvram: kmalloc failed\n"); - return -ENOMEM; - } - - len = ppc_md.nvram_read(tmp_buffer, count, ppos); - if ((long)len <= 0) { - kfree(tmp_buffer); - return len; - } - - if (copy_to_user(buf, tmp_buffer, len)) { - kfree(tmp_buffer); - return -EFAULT; - } + count = min_t(size_t, count, size - *ppos); + count = min(count, PAGE_SIZE); - kfree(tmp_buffer); - return len; + ret = -ENOMEM; + tmp = kmalloc(count, GFP_KERNEL); + if (!tmp) + goto out; + + ret = ppc_md.nvram_read(tmp, count, ppos); + if (ret <= 0) + goto out; + + if (copy_to_user(buf, tmp, ret)) + ret = -EFAULT; + +out: + kfree(tmp); + return ret; } static ssize_t dev_nvram_write(struct file *file, const char __user *buf, - size_t count, loff_t *ppos) + size_t count, loff_t *ppos) { - ssize_t len; - char * tmp_buffer; - int size; + ssize_t ret; + char *tmp = NULL; + ssize_t size; + + ret = -ENODEV; + if (!ppc_md.nvram_size) + goto out; - if (ppc_md.nvram_size == NULL) - return -ENODEV; + ret = 0; size = ppc_md.nvram_size(); + if (*ppos >= size || size < 0) + goto out; - if (!access_ok(VERIFY_READ, buf, count)) - return -EFAULT; - if (*ppos >= size) - return 0; - if (count > size) - count = size; - - tmp_buffer = (char *) kmalloc(count, GFP_KERNEL); - if (!tmp_buffer) { - printk(KERN_ERR "dev_nvram_write: kmalloc failed\n"); - return -ENOMEM; - } - - if (copy_from_user(tmp_buffer, buf, count)) { - kfree(tmp_buffer); - return -EFAULT; - } + count = min_t(size_t, count, size - *ppos); + count = min(count, PAGE_SIZE); - len = ppc_md.nvram_write(tmp_buffer, count, ppos); - if ((long)len <= 0) { - kfree(tmp_buffer); - return len; - } + ret = -ENOMEM; + tmp = kmalloc(count, GFP_KERNEL); + if (!tmp) + goto out; + + ret = -EFAULT; + if (copy_from_user(tmp, buf, count)) + goto out; + + ret = ppc_md.nvram_write(tmp, count, ppos); + +out: + kfree(tmp); + return ret; - kfree(tmp_buffer); - return len; } static int dev_nvram_ioctl(struct inode *inode, struct file *file, Index: linux-2.6.13/arch/ppc64/kernel/spu_base.c =================================================================== --- linux-2.6.13.orig/arch/ppc64/kernel/spu_base.c +++ linux-2.6.13/arch/ppc64/kernel/spu_base.c @@ -603,6 +603,10 @@ static void __iomem * __init map_spe_pro prop = p; + /* FIXME: Firmware bug */ + if (strcmp (name, "priv2") == 0 && prop->len < 0x20000) + return ioremap(prop->address, 0x20000); + return ioremap(prop->address, prop->len); } Index: linux-2.6.13/drivers/ide/pci/siimage.c =================================================================== --- linux-2.6.13.orig/drivers/ide/pci/siimage.c +++ linux-2.6.13/drivers/ide/pci/siimage.c @@ -1015,7 +1015,9 @@ static unsigned int __devinit ata66_siim return (ata66 & 0x01) ? 1 : 0; } - return (hwif->INB(addr) & 0x01) ? 1 : 0; +// return (hwif->INB(addr) & 0x01) ? 1 : 0; + + return 1; } /** @@ -1082,7 +1084,7 @@ static void __devinit init_hwif_siimage( .fixup = siimage_fixup, \ .channels = 2, \ .autodma = AUTODMA, \ - .bootable = ON_BOARD, \ + .bootable = OFF_BOARD, \ } static ide_pci_device_t siimage_chipsets[] __devinitdata = { --