Index: linux-2.6.26-source/arch/x86/Kconfig =================================================================== --- linux-2.6.26-source.orig/arch/x86/Kconfig +++ linux-2.6.26-source/arch/x86/Kconfig @@ -1524,6 +1524,9 @@ direct access method and falls back to the BIOS if that doesn't work. If unsure, go with the default, which is "Any". +config PCI_GOCO + bool "Cooperative" + config PCI_GOBIOS bool "BIOS" @@ -1542,6 +1545,11 @@ endchoice +config PCI_COOPERATIVE + bool + depends on PCI && PCI_GOCO && COOPERATIVE + default y + config PCI_BIOS def_bool y depends on X86_32 && !X86_VISWS && PCI && (PCI_GOBIOS || PCI_GOANY) @@ -1603,6 +1611,7 @@ # x86_64 have no ISA slots, but do have ISA-style DMA. config ISA_DMA_API + depends on !COOPERATIVE def_bool y if X86_32 Index: linux-2.6.26-source/arch/x86/kernel/cpu/cyrix.c =================================================================== --- linux-2.6.26-source.orig/arch/x86/kernel/cpu/cyrix.c +++ linux-2.6.26-source/arch/x86/kernel/cpu/cyrix.c @@ -231,6 +231,7 @@ case 4: /* MediaGX/GXm or Geode GXM/GXLV/GX1 */ #ifdef CONFIG_PCI +#ifndef CONFIG_COOPERATIVE { u32 vendor, device; /* @@ -263,6 +264,7 @@ mark_tsc_unstable("cyrix 5510/5520 detected"); } #endif +#endif c->x86_cache_size = 16; /* Yep 16K integrated cache thats it */ /* GXm supports extended cpuid levels 'ala' AMD */ Index: linux-2.6.26-source/arch/x86/pci/init.c =================================================================== --- linux-2.6.26-source.orig/arch/x86/pci/init.c +++ linux-2.6.26-source/arch/x86/pci/init.c @@ -11,6 +11,9 @@ type = pci_direct_probe(); #endif +#ifdef CONFIG_PCI_COOPERATIVE + pci_cooperative_init(); +#endif pci_mmcfg_early_init(); Index: linux-2.6.26-source/arch/x86/pci/pci.h =================================================================== --- linux-2.6.26-source.orig/arch/x86/pci/pci.h +++ linux-2.6.26-source/arch/x86/pci/pci.h @@ -99,6 +99,7 @@ extern struct pci_raw_ops pci_direct_conf1; extern int pci_direct_probe(void); +extern void pci_cooperative_init(void); extern void pci_direct_init(int type); extern void pci_pcbios_init(void); extern int pci_olpc_init(void); Index: linux-2.6.26-source/arch/x86/pci/Makefile_32 =================================================================== --- linux-2.6.26-source.orig/arch/x86/pci/Makefile_32 +++ linux-2.6.26-source/arch/x86/pci/Makefile_32 @@ -1,5 +1,6 @@ obj-y := i386.o init.o +obj-$(CONFIG_PCI_COOPERATIVE) += copci.o obj-$(CONFIG_PCI_BIOS) += pcbios.o obj-$(CONFIG_PCI_MMCONFIG) += mmconfig_32.o direct.o mmconfig-shared.o obj-$(CONFIG_PCI_DIRECT) += direct.o @@ -21,4 +22,8 @@ # Necessary for NUMAQ as well pci-$(CONFIG_NUMA) += mp_bus_to_node.o -obj-y += $(pci-y) common.o early.o +pci-$(CONFIG_COOPERATIVE) := legacy.o irq_cooperative.o +obj-y += $(pci-y) common.o +ifndef CONFIG_COOPERATIVE +obj-y += early.o +endif Index: linux-2.6.26-source/drivers/pci/pci.c =================================================================== --- linux-2.6.26-source.orig/drivers/pci/pci.c +++ linux-2.6.26-source/drivers/pci/pci.c @@ -1694,7 +1694,9 @@ EXPORT_SYMBOL_GPL(pci_intx); EXPORT_SYMBOL(pci_set_dma_mask); EXPORT_SYMBOL(pci_set_consistent_dma_mask); +#ifndef CONFIG_COOPERATIVE EXPORT_SYMBOL(pci_assign_resource); +#endif EXPORT_SYMBOL(pci_find_parent_resource); EXPORT_SYMBOL(pci_select_bars); Index: linux-2.6.26-source/include/asm-x86/pci.h =================================================================== --- linux-2.6.26-source.orig/include/asm-x86/pci.h +++ linux-2.6.26-source/include/asm-x86/pci.h @@ -67,7 +67,7 @@ int write_combine); -#ifdef CONFIG_PCI +#if defined(CONFIG_PCI) && !defined(CONFIG_COOPERATIVE) extern void early_quirks(void); static inline void pci_dma_burst_advice(struct pci_dev *pdev, enum pci_dma_burst_strategy *strat,