//pci的初始化顺序可以从System.map文件中看出来:
$grep "initcall" System.map | grep pci
ffffffff8170fdb8 t __initcall_pci_reboot_init1
ffffffff8170fe68 t __initcall_pcibus_class_init2 //pcibus_class_init():注册一个名为"pci_bus"的class结构
ffffffff8170fe70 t __initcall_pci_driver_init2 //pci_driver_init()
ffffffff8170fec8 t __initcall_acpi_pci_init3 //acpi_pci_init()
ffffffff8170fed8 t __initcall_pci_arch_init3 //pci_arch_init()
ffffffff8170ff50 t __initcall_pci_slot_init4 //pci_slot_init()在sysfs文件系统中建立slots目录及其kobject结构
ffffffff8170ff68 t __initcall_acpi_pci_root_init4 //acpi_pci_root_init()
ffffffff8170ff70 t __initcall_acpi_pci_link_init4 //acpi_pci_link_init()
ffffffff8170ffb8 t __initcall_pci_subsys_init4 //pci_subsys_init()
ffffffff817100b0 t __initcall_pcibios_assign_resources5 //pcibios_assign_resources()
ffffffff817100d0 t __initcall_pci_apply_final_quirks5s
ffffffff817100e0 t __initcall_pci_iommu_initrootfs
ffffffff81710440 t __initcall_pci_proc_init6 //pci_proc_init()
ffffffff817104b8 t __initcall_serial8250_pci_init6
ffffffff81710568 t __initcall_ide_scan_pcibus6
ffffffff81710748 t __initcall_pci_resource_alignment_sysfs_init7
ffffffff81710750 t __initcall_pci_sysfs_init7 //pci_sysfs_init()
//pci_arch_init()@
static __init int pci_arch_init(void)
+-- type = pci_direct_probe();
+-- if (!(pci_probe & PCI_PROBE_NOEARLY))
pci_mmcfg_early_init();
+-- if (x86_init.pci.arch_init && !x86_init.pci.arch_init())
return 0;
+-- pci_pcbios_init();
+-- pci_direct_init(type);
+-- dmi_check_pciprobe();
+-- dmi_check_skip_isa_align();
//在sysfs文件系统中建立slots目录及其kobject结构
static int pci_slot_init(void)
+-- pci_bus_kset = bus_get_kset(&pci_bus_type);
+-- pci_slots_kset = kset_create_and_add("slots", NULL, &pci_bus_kset->kobj);
//
static int __init acpi_pci_root_init(void)
+-- acpi_hest_init();
+-- acpi_hest_init();
+-- acpi_bus_register_driver(&acpi_pci_root_driver)
//
static int __init acpi_pci_link_init(void)
+-- acpi_bus_register_driver(&acpi_pci_link_driver);
//
int __init pci_subsys_init(void)
+-- if (x86_init.pci.init())
pci_legacy_init();
+-- pcibios_fixup_peer_bridges();
+-- x86_init.pci.init_irq();
+-- pcibios_init();
//对PCI设备使用的存储器和IO资源进行设置.
//对于x86 BIOS已经将PCI设备使用的存储器和IO资源设置完毕,
//而对于power PC,则需要使用该函数设置PCI设备使用的存储器和IO资源
static int __init pcibios_assign_resources(void)
+-- for_each_pci_dev(dev) {
r = &dev->resource[PCI_ROM_RESOURCE];
if (!r->flags || !r->start)
continue;
if (pci_claim_resource(dev, PCI_ROM_RESOURCE) < 0) {
r->end -= r->start;
r->start = 0;
}
}
+-- pci_assign_unassigned_resources();
+-- pcibios_fw_addr_list_del();
//pci_proc_init()函数的主要功能是在proc文件系统中建立/bus/pci目录
//并将proc_fs默认提供的file_operations更换为proc_bus_pci_dev_operations.
static int __init pci_proc_init(void)
+-- proc_bus_pci_dir = proc_mkdir("bus/pci", NULL);
+-- proc_create("devices", 0, proc_bus_pci_dir, &proc_bus_pci_dev_operations);
+-- proc_initialized = 1;
+-- for_each_pci_dev(dev)
pci_proc_attach_device(dev);
linux pci
最新推荐文章于 2022-08-15 17:57:55 发布
4069

被折叠的 条评论
为什么被折叠?



