diff options
author | Andi Kleen <ak@suse.de> | 2006-09-26 08:52:40 (GMT) |
---|---|---|
committer | Andi Kleen <andi@basil.nowhere.org> | 2006-09-26 08:52:40 (GMT) |
commit | 5e544d618f0fb21011f36f28d5e3952b9dc109d2 (patch) | |
tree | a91d6e5c640da473204bc48eb7b310fd3d82cd91 /arch/i386/pci | |
parent | a15da49debaf7f09460a886b0ecd08588410715e (diff) | |
download | linux-5e544d618f0fb21011f36f28d5e3952b9dc109d2.tar.xz |
[PATCH] i386/x86-64: PCI: split probing and initialization of type 1 config space access
First probe if type1/2 accesses work, but then only initialize them at the end.
This is useful for a later patch that needs this information inbetween.
Signed-off-by: Andi Kleen <ak@suse.de>
Diffstat (limited to 'arch/i386/pci')
-rw-r--r-- | arch/i386/pci/direct.c | 25 | ||||
-rw-r--r-- | arch/i386/pci/init.c | 9 | ||||
-rw-r--r-- | arch/i386/pci/mmconfig.c | 2 | ||||
-rw-r--r-- | arch/i386/pci/pci.h | 6 |
4 files changed, 28 insertions, 14 deletions
diff --git a/arch/i386/pci/direct.c b/arch/i386/pci/direct.c index 5d81fb5..5acf0b4 100644 --- a/arch/i386/pci/direct.c +++ b/arch/i386/pci/direct.c @@ -254,7 +254,16 @@ static int __init pci_check_type2(void) return works; } -void __init pci_direct_init(void) +void __init pci_direct_init(int type) +{ + printk(KERN_INFO "PCI: Using configuration type %d\n", type); + if (type == 1) + raw_pci_ops = &pci_direct_conf1; + else + raw_pci_ops = &pci_direct_conf2; +} + +int __init pci_direct_probe(void) { struct resource *region, *region2; @@ -264,19 +273,16 @@ void __init pci_direct_init(void) if (!region) goto type2; - if (pci_check_type1()) { - printk(KERN_INFO "PCI: Using configuration type 1\n"); - raw_pci_ops = &pci_direct_conf1; - return; - } + if (pci_check_type1()) + return 1; release_resource(region); type2: if ((pci_probe & PCI_PROBE_CONF2) == 0) - return; + return 0; region = request_region(0xCF8, 4, "PCI conf2"); if (!region) - return; + return 0; region2 = request_region(0xC000, 0x1000, "PCI conf2"); if (!region2) goto fail2; @@ -284,10 +290,11 @@ void __init pci_direct_init(void) if (pci_check_type2()) { printk(KERN_INFO "PCI: Using configuration type 2\n"); raw_pci_ops = &pci_direct_conf2; - return; + return 2; } release_resource(region2); fail2: release_resource(region); + return 0; } diff --git a/arch/i386/pci/init.c b/arch/i386/pci/init.c index 51087a9..d028e1b 100644 --- a/arch/i386/pci/init.c +++ b/arch/i386/pci/init.c @@ -6,8 +6,13 @@ in the right sequence from here. */ static __init int pci_access_init(void) { + int type = 0; + +#ifdef CONFIG_PCI_DIRECT + type = pci_direct_probe(); +#endif #ifdef CONFIG_PCI_MMCONFIG - pci_mmcfg_init(); + pci_mmcfg_init(type); #endif if (raw_pci_ops) return 0; @@ -21,7 +26,7 @@ static __init int pci_access_init(void) * fails. */ #ifdef CONFIG_PCI_DIRECT - pci_direct_init(); + pci_direct_init(type); #endif return 0; } diff --git a/arch/i386/pci/mmconfig.c b/arch/i386/pci/mmconfig.c index 972180f..44155c5 100644 --- a/arch/i386/pci/mmconfig.c +++ b/arch/i386/pci/mmconfig.c @@ -187,7 +187,7 @@ static __init void unreachable_devices(void) } } -void __init pci_mmcfg_init(void) +void __init pci_mmcfg_init(int type) { if ((pci_probe & PCI_PROBE_MMCONF) == 0) return; diff --git a/arch/i386/pci/pci.h b/arch/i386/pci/pci.h index bf4e793..8a7cf1f 100644 --- a/arch/i386/pci/pci.h +++ b/arch/i386/pci/pci.h @@ -81,7 +81,9 @@ extern int pci_conf1_write(unsigned int seg, unsigned int bus, extern int pci_conf1_read(unsigned int seg, unsigned int bus, unsigned int devfn, int reg, int len, u32 *value); -extern void pci_direct_init(void); +extern int pci_direct_probe(void); +extern void pci_direct_init(int type); extern void pci_pcbios_init(void); -extern void pci_mmcfg_init(void); +extern void pci_mmcfg_init(int type); extern void pcibios_sort(void); + |