pcie从bus 0开始的枚举流程

host bridge device 和 bus 0 的注册

cdns_pcie_host_setup
    struct pci_host_bridge *bridge
    bridge = pci_host_bridge_from_priv(rc);
    pci_host_probe(bridge)
        pci_scan_root_bus_bridge
            pci_register_host_bridge
                pci_alloc_bus
        		device_add(&bridge->dev); 	// 添加device(host bridge)
                pcibios_add_bus(bus)  		// 添加bus (local bus 0)
            pci_scan_child_bus/pci_scan_child_bus_extend(bus,0)
        bus = bridge->bus;
        pci_bus_add_devices(bus);

其他pcie device 和bus的注册

bus 0 的 其他设备(bridge device 和 normal device)
bus 0 下的 bridge device 拓展出的 bus 1
----------------
bus 1 的 其他设备(bridge device 和 normal device)
bus 1 下的 bridge device 拓展出的 bus 2
...
pci_scan_child_bus_extend
    for (devfn = 0; devfn < 256; devfn += 8)  // 针对每个device
        nr_devs = pci_scan_slot(bus, devfn);
		for (fn = 1; fn < 8; fn++) { // 针对每个function
            pci_scan_single_device(bus, devfn + fn); // 对一个function 枚举
            	struct pci_dev *dev = pci_scan_device
                    struct pci_dev *dev = pci_alloc_dev(bus);
            		dev->devfn = devfn;
            		// 上个语句之后,此时可以使用 pci_read_config_dword 来访问 配置空间
            		// 或者你可以提早的,用 pci_bus_read_config_dword 来访问配置空间
            		pci_set_of_node(dev);
            		pci_setup_device(dev);
                pci_device_add(dev			// 添加 device(pci bridge或者普通pci设备)
    pci_scan_bridge_extend
        pci_add_new_bus						// 添加 pci bus
        pci_scan_child_bus_extend

device(bridge device 和normal device) 和 bus 在 /sys 下的呈现

host bridge 和 normal bridge 和 normal device(pcie设备) 和 pci bus 的区别
有几个bridge,总会有对应数量的bus , bus 可以 说 是 bridge extend 出来的东西
host bridge 只有一个,对应 local bus 0 
下面简称 normal bridge 为 bridge , normal device 为 device
    
bus 对应 总线设备驱动模型中的 "bus" , 他们 在  // 关键字 /sys/device 下的 pci_bus
    /sys/devices/pci0000:00/pci_bus/0000:00 // internal bus 0
    /sys/devices/pci0000:ff/pci_bus/0000:ff // 这个是什么
    /sys/devices/pci0000:00/0000:00:01.0/pci_bus/0000:01 // internal bus 0 上拓展出的 bus 1
    /sys/devices/pci0000:00/0000:00:01.1/pci_bus/0000:02 // internal bus 0 上拓展出的 bus 2
        
bridge 和 device 都对应 总线设备驱动模型中的 "device" , 都被 pci_setup_device 枚举 ,他们都在 /sys/bus/pci/devices
    /sys/bus/pci/devices/0000:00:00.0 // host bridge device
    /sys/bus/pci/devices/0000:00:01.1 // bridge device 
    /sys/bus/pci/devices/0000:02:00.0 // normal device
    1. device 的驱动是独立的   : 例如 02:00.0 是个 nvme固态硬盘, 对应的驱动为 bus/pci/drivers/nvme
    2. host bridge 驱动   :/sys/bus/pci/devices/0000:00:00.0 没有 driver 文件,但驱动应该是 PCIE 控制器的驱动. 
        例如 drivers/pci/controller/cadence
    3. bridge 的驱动是一样的   : bus/pci/drivers/pcieport
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值