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