阅读:1986回复:3
内核模式下如果获取pci设备挂接在哪个pci bridge下面?
需要获取一个pci设备挂接在哪个pci bridge-to-bridge下面,并且读出这个pci bridge-to-bridge的config space。通过HalGetBusData()这个函数只能扫描出系统总共有多少pci device,pci bridge-to-bridge也会以pci device的形式出现,也就是说通过HalGetBusData()无法得知该设备是否是pci bridge-to-bridge,我该如何才能知道他们的总线关系,谁挂接在谁的下面呢?
|
|
沙发#
发布于:2009-09-28 02:18
你用 HalGetBusData() 返回后的第四个参数即是 PCI_COMMON_CONFIG 结构,其中的
HeaderType 字段不就代表了 PCI DEVICE 的类型么。 为 1 时即 PCI_BRIDGE_TYPE 不 就是 PCI-PCI bridge 了么。 还有这类老的 HAL API 在 2K 后就已经废弃不用了,如果要读写 PCI Configuration Space 的话,是建议直接通过 PNP MGR 发送 IRP_MJ_PNP->IRP_MN_READ_CONFIG 或 IRP_MJ_PNP->IRP_MN_QUERY_INTERFACE 来完成。后者返回一个 BUS_INTERFACE_STANDARD 结构,其中的 GetBusData / SettBusData 回调函数与你 现在用的那个区别不大,同样是为读/写 PCI Configuration Space 的。不同的是它可以在 IRQL = DISPATCH_LEVEL 上进行读/写。 其次就是你要枚举层次关系的话, PCI-PCI bridge 中的 Primary Bus, Secondary Bus, Subordinate Bus 是关键,这是与一般 PCI DEVICE 不同的。这些确定了,要针对每个 PCI DEVICE 获取信息就容易多了,无非就是根据 PCI BAR 最后一位判断 Port I/O or MMIO 和得到 Interrupt Pin, Interrupt Line 等。 最后索性还有一种在 x86 平台上与系统无关的方法,那就是直接从 BUS 0 开始依次将 BDF 写到 0xCF8 - 0xCF8 + OFFSET 并从 0xCFF 中获取,这样可以得到整个的 PCI 树 以及相关信息,并可为之分配资源。其实不论是 BIOS 或者 OS 最终都是这么实现的。 |
|
板凳#
发布于:2009-09-28 14:18
很有帮助,多谢,找到spec了,非常感谢你的帮助。
怎么无法给你加分,说我的权限不够,但是“今日评分上限数”却被扣掉了 |
|
地板#
发布于:2009-09-28 15:15
恩,读 spec 是最好的。不用客气,我只是挑一些有兴趣的话题讨论而已,分不分的压根儿就
没当回过事儿。 |
|