快速回忆
pci-ids 快速查询Mellanox PCIe的device的网址
PCIe设备id表:mlx5_core_pci_table
iseg是Initialization segment的意思,初始化字段,处于bar空间,BAR0的前几个字段,偏移是BAR0的0开始的。
背景
Mellanox网卡驱动主要是PCIe的驱动,驱动mlx5_core.ko主要负责PCIe驱动的管理,他会注册一个PCIe驱动到Linux内核的PCIe框架中,然后如果有PCIe设备热插拔或者rescan触发热插后就会调用。本文主要分析mlx5_core.ko如何利用PCIe的配置空间来获取他的Firmware版本号。
触发时机和关联key
首先,PCIe设备在BIOS阶段会被扫描枚举到PCIe设备并且放在ACPI(Advanced Configuration and Power Interface,高级配置与电源接口)模块中的acpi_pci中管理,并且会给PCIe设备根据bar空间的内容预留物理内存的地址空间。BIOS加载Linux系统会将相关资源信息高速Linux系统,并且PCIe设备就会在PCIe框架中创建对应设备,如果此时存在与之绑定的驱动,就会触发加载PCIe驱动的probe函数。其中PCIe驱动是根据pci_register_driver的时候注册的驱动描述结构中的id_table(pci_device_id的结构)来决定该驱动绑定什么PCIe设备的。这里决定绑定的PCIe设备主要是通过PCIe设备的vendorID和deviceID。 这两个信息在PCIe设备中会存储在PCIe的配置空间中,在BIOS扫描阶段会读取这些配置信息并且存下来。
pci_device_id的结构:
struct pci_device_id {
__u32 vendor, device; /* Vendor and device ID or PCI_ANY_ID*/
__u32 subvendor, subdevice; /* Subsystem ID's or PCI_ANY_ID */
__u32 class, class_mask;

最低0.47元/天 解锁文章
632

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



