[PATCH] PCI detection in 2.2.x and 2.4.0

From: Rasmus Andersen (rasmus@jaquet.dk)
Date: Sat Sep 30 2000 - 14:03:06 EST


Hi.

I recently had a problem with linux 2.2.x and 2.4.0 oopsing early
in the boot process on a old pentium I had gotten hold of. printk
investigation showed the problem to be in the PCI detection code,
specifically the part where linux tries to go through the BIOS to
get the PCI settings. Picking 'Direct' (CONFIG_PCI_GODIRECT) make
the boot succeed where 'Any' had not.

This stumped me since the help text had led me to believe
otherwise: The help text states that if CONFIG_PCI_GOANY is set
linux will first try to detect the settings directly and go
through BIOS if this fails. The code first goes through BIOS to
get the settings, then gets them directly and then pick the
direct settings (if valid) otherwise the BIOS settings (if
valid).

The following patches fixes the code to follow the help text. I
am not sure if this is the correct fix, but I prefer it since it
makes my machine boot :)

Patches for both 2.4.0-test9-pre7 and 2.2.18pre10. Please comment.

2.4.0-test9-pre7:

--- linux-240test9-pre7-clean/arch/i386/kernel/pci-pc.c Mon Jul 31 21:03:10 2000
+++ linux/arch/i386/kernel/pci-pc.c Sat Sep 30 20:36:10 2000
@@ -962,15 +962,15 @@
         struct pci_ops *bios = NULL;
         struct pci_ops *dir = NULL;
 
+#ifdef CONFIG_PCI_DIRECT
+ if (pci_probe & (PCI_PROBE_CONF1 | PCI_PROBE_CONF2))
+ dir = pci_check_direct();
+#endif
 #ifdef CONFIG_PCI_BIOS
- if ((pci_probe & PCI_PROBE_BIOS) && ((bios = pci_find_bios()))) {
+ if ((pci_probe & PCI_PROBE_BIOS) && (!dir) && ((bios = pci_find_bios()))) {
                 pci_probe |= PCI_BIOS_SORT;
                 pci_bios_present = 1;
         }
-#endif
-#ifdef CONFIG_PCI_DIRECT
- if (pci_probe & (PCI_PROBE_CONF1 | PCI_PROBE_CONF2))
- dir = pci_check_direct();
 #endif
         if (dir)
                 pci_root_ops = dir;

2.2.18-pre10:

--- linux-2.2.18pre10/arch/i386/kernel/bios32.c.org Mon Sep 25 16:37:03 2000
+++ linux-2.2.18pre10/arch/i386/kernel/bios32.c Mon Sep 25 16:39:28 2000
@@ -1267,15 +1267,15 @@
         struct pci_access *bios = NULL;
         struct pci_access *dir = NULL;
 
+#ifdef CONFIG_PCI_DIRECT
+ if (pci_probe & (PCI_PROBE_CONF1 | PCI_PROBE_CONF2))
+ dir = pci_check_direct();
+#endif
 #ifdef CONFIG_PCI_BIOS
- if ((pci_probe & PCI_PROBE_BIOS) && ((bios = pci_find_bios()))) {
+ if ((pci_probe & PCI_PROBE_BIOS) && (!dir) ((bios = pci_find_bios()))) {
                 pci_probe |= PCI_BIOS_SORT;
                 pci_bios_present = 1;
         }
-#endif
-#ifdef CONFIG_PCI_DIRECT
- if (pci_probe & (PCI_PROBE_CONF1 | PCI_PROBE_CONF2))
- dir = pci_check_direct();
 #endif
         if (dir)
                 access_pci = dir;

-- 
Regards,
        Rasmus(rasmus@jaquet.dk)

A great many people think they are thinking when they are merely rearranging their prejudices. -- William James - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Sat Sep 30 2000 - 21:00:27 EST