linux/arch/i386/pci/legacy.c
<<
>>
Prefs
   1/*
   2 * legacy.c - traditional, old school PCI bus probing
   3 */
   4#include <linux/init.h>
   5#include <linux/pci.h>
   6#include "pci.h"
   7
   8/*
   9 * Discover remaining PCI buses in case there are peer host bridges.
  10 * We use the number of last PCI bus provided by the PCI BIOS.
  11 */
  12static void __devinit pcibios_fixup_peer_bridges(void)
  13{
  14        int n, devfn;
  15
  16        if (pcibios_last_bus <= 0 || pcibios_last_bus >= 0xff)
  17                return;
  18        DBG("PCI: Peer bridge fixup\n");
  19
  20        for (n=0; n <= pcibios_last_bus; n++) {
  21                u32 l;
  22                if (pci_find_bus(0, n))
  23                        continue;
  24                for (devfn = 0; devfn < 256; devfn += 8) {
  25                        if (!raw_pci_ops->read(0, n, devfn, PCI_VENDOR_ID, 2, &l) &&
  26                            l != 0x0000 && l != 0xffff) {
  27                                DBG("Found device at %02x:%02x [%04x]\n", n, devfn, l);
  28                                printk(KERN_INFO "PCI: Discovered peer bus %02x\n", n);
  29                                pci_scan_bus(n, &pci_root_ops, NULL);
  30                                break;
  31                        }
  32                }
  33        }
  34}
  35
  36static int __init pci_legacy_init(void)
  37{
  38        if (!raw_pci_ops) {
  39                printk("PCI: System does not support PCI\n");
  40                return 0;
  41        }
  42
  43        if (pcibios_scanned++)
  44                return 0;
  45
  46        printk("PCI: Probing PCI hardware\n");
  47        pci_root_bus = pcibios_scan_root(0);
  48        if (pci_root_bus)
  49                pci_bus_add_devices(pci_root_bus);
  50
  51        pcibios_fixup_peer_bridges();
  52
  53        return 0;
  54}
  55
  56subsys_initcall(pci_legacy_init);
  57
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.