前面两个小节大致总结了下PCIE的基本知识,算是扫盲篇吧。本文主要总结PCIE设备的枚举扫描过程,此部分才是PCIE模块的重点,无论是在BIOS下还是系统驱动下都会用到。
按照国际惯例,先列问题:
1. 系统如何判断PCIE设备是否在位?
2. 设备中的配置空间的数据一开始就有嘛?谁写的?
3. Bus号,Dev号,和Fun号与硬件有关系嘛?P
4. Bridge和Device的区别?
5. Device和Function的区别?
6. 枚举的流程是怎么样的?
系统如何判断PCIE设备是否在位
BIOS代码在枚举设备的时候,会去读每个设备的VID,如果读到的是不是FFFF,则表示此位置有设备存在,若为FFFF,则表示设备不存在。DID&VID是出厂时就固定在PCIE设备配置空间中的数据,表示每个不同的设备,同理,我们在BIOS中也可通过判断这个ID值来寻找指定的PCIE设备。
设备中的配置空间的数据一开始就有嘛?谁写的?
每个设备在出厂时,其配置空间中的值都有一些default值,枚举该设备时为每个设备分配BDS号和内存资源时,会再写入部分值。
Bus号,Dev号,和Fun号与硬件有关系嘛?硬件链接与BDS号的分配是否有关?
这个问题很关键,我想应该大部分的同学都会弄得不是很清楚,笔者一直以为BDS号是在枚举过程中全部由软件分配的,但实际应该不是这样的。与多个同事讨论后,基本断定:Dev和Fun号应该是和硬件设计有关系,也就是硬件就已经固定,软件的枚举过程是更多的是在分配Bus号。为什么这么说呢?这里要着重讲解下:
PCI是总线结构,而PCIE已经是点对点机构,这个点对点结构很重要,待会重点讲到。首先先来看下一个典型的Pcie系统框图如下:
从CPU出来,有一个Root Compe