pci设备的初始化
这里讨论系统上电时的情况, 热插拔的情况应该差不多.
首先是从根总线开始, 然后就是扫描这个根总线上的每一条子BUS, 如下:
unsigned int pci_scan_child_bus(struct pci_bus *bus)
{
unsigned intdevfn, pass, max = bus->secondary;
structpci_dev *dev;
pr_debug("PCI: Scanning bus x:x\n", pci_domain_nr(bus),bus->number);
这里循环256(0x100)/8 = 32次的意思是, 每个总线可能有32个设备,
而每个设备可能是多功能的, 且最多有8个功能.
for (devfn =0; devfn < 0x100; devfn += 8)
pci_scan_slot(bus, devfn);
//下面在递归扫描PCI桥,不是我们要关心的.
pr_debug("PCI: Fixups for bus x:x\n", pci_domain_nr(bus),bus->number);
pcibios_fixup_bus(bus);
for (pass=0;pass < 2; pass++)
list_for_each_entry(dev, &bus->devices, bus_list) {
if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE ||
dev->hdr_type == PCI_HEADER_TYPE_CARDBUS)
max = pci_scan_bridge(bus, dev, max, pass);
}
pr_debug("PCI: Bus scan for x:x returning with max=x\n",
pci_domain_nr(bus), bus->number, max);
returnmax;
}
int pci_scan_slot(struct pci_bus *bus, int devfn)
{
int func, nr= 0;
intscan_all_fns;
//空函数
scan_all_fns= pcibios_scan_all_fns(bus, devfn);
//每个设备可能有8个功能
for (func =0; func < 8; func++, devfn++) {
struct pci_dev *dev;
//分配并初始化找到的设备
dev = pci_scan_single_device(bus, devfn);
if (dev) {
nr++;
if (!dev->multifunction) {
if (func > 0) {
dev->multifunction = 1;
} else {