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