Commit 5e544d61 authored by Andi Kleen's avatar Andi Kleen Committed by Andi Kleen

[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: default avatarAndi Kleen <ak@suse.de>
parent a15da49d
...@@ -254,7 +254,16 @@ static int __init pci_check_type2(void) ...@@ -254,7 +254,16 @@ static int __init pci_check_type2(void)
return works; 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; struct resource *region, *region2;
...@@ -264,19 +273,16 @@ void __init pci_direct_init(void) ...@@ -264,19 +273,16 @@ void __init pci_direct_init(void)
if (!region) if (!region)
goto type2; goto type2;
if (pci_check_type1()) { if (pci_check_type1())
printk(KERN_INFO "PCI: Using configuration type 1\n"); return 1;
raw_pci_ops = &pci_direct_conf1;
return;
}
release_resource(region); release_resource(region);
type2: type2:
if ((pci_probe & PCI_PROBE_CONF2) == 0) if ((pci_probe & PCI_PROBE_CONF2) == 0)
return; return 0;
region = request_region(0xCF8, 4, "PCI conf2"); region = request_region(0xCF8, 4, "PCI conf2");
if (!region) if (!region)
return; return 0;
region2 = request_region(0xC000, 0x1000, "PCI conf2"); region2 = request_region(0xC000, 0x1000, "PCI conf2");
if (!region2) if (!region2)
goto fail2; goto fail2;
...@@ -284,10 +290,11 @@ void __init pci_direct_init(void) ...@@ -284,10 +290,11 @@ void __init pci_direct_init(void)
if (pci_check_type2()) { if (pci_check_type2()) {
printk(KERN_INFO "PCI: Using configuration type 2\n"); printk(KERN_INFO "PCI: Using configuration type 2\n");
raw_pci_ops = &pci_direct_conf2; raw_pci_ops = &pci_direct_conf2;
return; return 2;
} }
release_resource(region2); release_resource(region2);
fail2: fail2:
release_resource(region); release_resource(region);
return 0;
} }
...@@ -6,8 +6,13 @@ ...@@ -6,8 +6,13 @@
in the right sequence from here. */ in the right sequence from here. */
static __init int pci_access_init(void) static __init int pci_access_init(void)
{ {
int type = 0;
#ifdef CONFIG_PCI_DIRECT
type = pci_direct_probe();
#endif
#ifdef CONFIG_PCI_MMCONFIG #ifdef CONFIG_PCI_MMCONFIG
pci_mmcfg_init(); pci_mmcfg_init(type);
#endif #endif
if (raw_pci_ops) if (raw_pci_ops)
return 0; return 0;
...@@ -21,7 +26,7 @@ static __init int pci_access_init(void) ...@@ -21,7 +26,7 @@ static __init int pci_access_init(void)
* fails. * fails.
*/ */
#ifdef CONFIG_PCI_DIRECT #ifdef CONFIG_PCI_DIRECT
pci_direct_init(); pci_direct_init(type);
#endif #endif
return 0; return 0;
} }
......
...@@ -187,7 +187,7 @@ static __init void unreachable_devices(void) ...@@ -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) if ((pci_probe & PCI_PROBE_MMCONF) == 0)
return; return;
......
...@@ -81,7 +81,9 @@ extern int pci_conf1_write(unsigned int seg, unsigned int bus, ...@@ -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, extern int pci_conf1_read(unsigned int seg, unsigned int bus,
unsigned int devfn, int reg, int len, u32 *value); 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_pcbios_init(void);
extern void pci_mmcfg_init(void); extern void pci_mmcfg_init(int type);
extern void pcibios_sort(void); extern void pcibios_sort(void);
...@@ -163,7 +163,7 @@ static __init void unreachable_devices(void) ...@@ -163,7 +163,7 @@ static __init void unreachable_devices(void)
} }
} }
void __init pci_mmcfg_init(void) void __init pci_mmcfg_init(int type)
{ {
int i; int i;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment