nicklezhang
驱动牛犊
驱动牛犊
  • 注册日期2004-03-29
  • 最后登录2017-06-19
  • 粉丝0
  • 关注0
  • 积分24分
  • 威望145点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:1907回复:3

内核模式下如果获取pci设备挂接在哪个pci bridge下面?

楼主#
更多 发布于:2009-09-27 16:04
需要获取一个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,我该如何才能知道他们的总线关系,谁挂接在谁的下面呢?
sinister
驱动牛犊
驱动牛犊
  • 注册日期2005-03-02
  • 最后登录2013-01-24
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望38点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分1分
沙发#
发布于: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 最终都是这么实现的。
nicklezhang
驱动牛犊
驱动牛犊
  • 注册日期2004-03-29
  • 最后登录2017-06-19
  • 粉丝0
  • 关注0
  • 积分24分
  • 威望145点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2009-09-28 14:18
很有帮助,多谢,找到spec了,非常感谢你的帮助。
怎么无法给你加分,说我的权限不够,但是“今日评分上限数”却被扣掉了
sinister
驱动牛犊
驱动牛犊
  • 注册日期2005-03-02
  • 最后登录2013-01-24
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望38点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分1分
地板#
发布于:2009-09-28 15:15
恩,读 spec 是最好的。不用客气,我只是挑一些有兴趣的话题讨论而已,分不分的压根儿就
没当回过事儿。
游客

返回顶部