linux查看pci设备枚举,PCI 设备枚举流程

//0、pci子系统首先注册pci bus

struct bus_type pci_bus_type = {

.name = "pci",

.match = pci_bus_match,

.uevent = pci_uevent,

.probe = pci_device_probe,

.remove = pci_device_remove,

.shutdown = pci_device_shutdown,

.dev_groups = pci_dev_groups,

.bus_groups = pci_bus_groups,

.drv_groups = pci_drv_groups,

.pm = PCI_PM_OPS_PTR,

.num_vf = pci_bus_num_vf,

};

EXPORT_SYMBOL(pci_bus_type);

static int __init pci_driver_init(void)

{

return bus_register(&pci_bus_type);

}

postcore_initcall(pci_driver_init);/* 将初始化函数放到内核代码特殊段,内核启动将会自动调用初始化函数 */

/* 设备的枚举流程和设备的驱动的调用过程 */

//1、pci控制器 设备树节点将会配转换成platform device

pcie@3400000 {

compatible = "fsl,ls1021a-pcie", "snps,dw-pcie";

....

//2、pci控制器匹配platform driver

static const struct of_device_id ls_pcie_of_match[] = {

{ .compatible = "fsl,ls1021a-pcie", .data = &ls1021_drvdata },

..

}

static struct platform_driver ls_pcie_driver = {

.driver = {

.name = "layerscape-pcie",

.of_match_table = ls_pcie_of_match,

.suppress_bind_attrs = true,

},

};

builtin_platform_driver_probe(ls_pcie_driver, ls_pcie_probe);

//3、执行pci控制器驱动函数ls_pcie_probe函数将被调用,直到pci_bus_type.pci_device_probe被调用

ls_add_pcie_port

pci_bus_add_devices

pci_bus_add_device

device_attach

__device_attach

__device_attach_driver

driver_probe_device

really_probe

dev->bus->probe//将调用pci_bus_type.pci_device_probe

//4、枚举pci设备调用设备驱动

pci_device_probe

__pci_device_probe

pci_call_probe

local_pci_probe

pci_drv->probe//设备的驱动的probe将被调用。

©著作权归作者所有:来自51CTO博客作者昵称真难改的原创作品,如需转载,请注明出处,否则将追究法律责任

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值