[PATCH] i386/x86-64: PCI: split probing and initialization of type 1 config space...
authorAndi Kleen <ak@suse.de>
Tue, 26 Sep 2006 08:52:40 +0000 (10:52 +0200)
committerAndi Kleen <andi@basil.nowhere.org>
Tue, 26 Sep 2006 08:52:40 +0000 (10:52 +0200)
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>
arch/i386/pci/direct.c
arch/i386/pci/init.c
arch/i386/pci/mmconfig.c
arch/i386/pci/pci.h
arch/x86_64/pci/mmconfig.c

index 5d81fb51037551b9ede92c2f0f7f785a2a6e4e2e..5acf0b4743cfc74ba1cc04e34e708449a3d03ecc 100644 (file)
@@ -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;
 }
index 51087a9d91720153178dcdc876357101d2387cb8..d028e1b05c3697e56e64631b0863cb3d90819fd3 100644 (file)
@@ -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;
 }
index 972180f738d9ae0d15fe059953fe2985cf454c09..44155c5e85d1f4a1b93f8a97f015653970a0a681 100644 (file)
@@ -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;
index bf4e79335388b533b6149dcf403533b6ce687c7e..8a7cf1f23684dc4b39b42255f35957ec8b542952 100644 (file)
@@ -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);
+
index dd78f4d18df1e281ec15188c1927107e62e5d4f3..d6b90d08476b1d5f836ff3079b898d86fb69a8f5 100644 (file)
@@ -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;