PCIe设备的这三个bus number是用于定义PCIe拓扑结构的重要参数。
Primary Bus Number:桥设备上游总线号
Secondary Bus Number:桥设备直接连接的下游总线号
Subordinate Bus Number:该桥下所有总线中最大的总线号
在PCIe配置空间中的定义如下:
struct pci_bridge_config_space {
// ... 其他字段 ...
u8 primary_bus; // 偏移 0x18
u8 secondary_bus; // 偏移 0x19
u8 subordinate_bus; // 偏移 0x1A
u8 sec_latency; // 偏移 0x1B
// ... 其他字段 ...
};
其中secondary bus number和subordinate bus number可以通过sys接口中的文件进行查看:
也可以通过lspci查看对应设备地址空间的0x18h,0x19h,0x1ah三位来对应primary bus number,secondary bus number和subordinate bus number。
代码中实际使用方式
// 检查设备是否在特定总线范围内
static bool is_device_in_range(struct pci_dev *bridge, struct pci_dev *dev) {
u8 secondary, subordinate;
pci_read_config_byte(bridge, PCI_SECONDARY_BUS, &secondary);
pci_read_config_byte(bridge, PCI_SUBORDINATE_BUS, &subordinate);
return (dev->bus->number >= secondary &&
dev->bus->number <= subordinate);
}
// 查找设备所属的桥
static struct pci_dev *find_parent_bridge(struct pci_dev *dev) {
struct pci_dev *bridge;
pci_for_each_dev(bridge) {
if (pci_is_bridge(bridge) &&
is_device_in_range(bridge, dev)) {
return bridge;
}
}
return NULL;
}
需要注意的是,只有PCIe bridge设备有对应的三个bus number。
标签:bridge,u8,bus,number,subordinate,secondary From: https://blog.csdn.net/aolitianya/article/details/144182661