PCI 初始化过程一 :总线拓扑结构的建立
系统对PCI总线的初始化过程比较复杂,要做的事情比较多。其中关键的一个环节就是总线拓扑结构的建立。这里通过文字描述拓扑结构的建立的算法,详细的故事还得看code。
算法从总线0开始搜索PCI系统并定位系统中所有的PCI设备与Bridge。它将建立起一个描叙系统拓扑结构的数据结构链表。另外它还为所有的Bridge进行编号。
PCI数据结构
PCI初始化代码将扫描PCI总线0开始,扫描系统中所有的PCI总线以找到系统中所有的PCI设备(包括PCI-PCIBridge)。
通过PCI BIOS代码来检查当前PCI总线的每个slot是否有设备存在。如果存在则它建立一个pci device数据结构来描叙此设备并将其连接到已知PCI设备链表中。
如果这个PCI设备是一个PCI-PCIBridge则建立一个pci_bus结构并将其连接到PCI device的结构树中。同时,接着继续搜寻和配置该Bridge下的总线,直到没有设备为止,再返回到上层Bridge所在的总线搜寻PCI device。显然这个过程使用了深度优先遍历算法。
在下面的pci-pci总线序号分配中将进行详细讨论。
步骤1
为了让PCI-PCI Bridge可以传递PCI I/O、PCI memory或PCI配置地址空间,它们需要如下内容:
Primary Bus Number:主干总线序号
位于PCI-PCI Bridge上侧的总线号BusNO
Secondary Bus Number:二级总线序号
位于PCI-PCI Bridge下侧的总线号BusNO
Subordinate Bus Number:从属总线序号
该Bridge下面所有级联总线上最大的总线号BusNO
PCI I/O and PCI Memory Windows:PCI I/O与PCI内存窗口
对于PCI-PCIBridge下方所有PCI I/O地址空间与PCI内存地址空间的窗口基址和大小总和。
最开始的时候,配置任何PCI2PCI Bridge时我们对此Bridge的从属总线序号一无所知。不知道是否还有下一级Bridge存在,同时也不知道指派给它们的序号是什么。但可以使用深度优先遍历算法来对扫描出指定PCI-PCI Bridge连接的每条总线,同时将它们编号。当找到一个PCI-PCI Bridge时,其二级总线被编号并且将临时从属序号0xff(在Award code中使用0xFE)指派给它以便对其所有下属PCI-PCI Bridge进行扫描与指定序号。以上过程看起来十分复杂,下面将提供一个实例以帮助理解。
PCI-PCI Bridge序号分配:步骤1
如下图的拓扑结构,所有PCI总线都是挂着在HOST Bridge上的,出来就是Bus0.第一个被扫描到的Bridge将是Bridge 1,所以Bridge 1下方的总线将被编号成总线1,同时Bridge 1被设置为二级总线1且拥有临时总线序号0xff。这意味着所有PCI总线序号为1或以上的type1 PCI配置地址将被通过Bridge 1传递到PCI总线1上。如果其总线序号为1则此配置循环将被转换成type0 配置,对于其它序号不作转换。
步骤一和步骤二
由于扫描配置算法使用深度优先算法,初始化代码将继续扫描PCI总线1。在此处它将发现一个PCI-PCI Bridge2。除此Bridge2外再没有其它Bridge存在,因此它被分配给从属总线序号2,这正好和其二级接口序号相同。上图画出了此处的PCI-PCIBridge与总线的编号情况
步骤三
当Bridge 2下面的总线都扫描完成之后,算法返回到Bridge2所在的总线1,将继续扫描总线1并发现另外一个PCI-PCIBridge,Bridge 3。Bridge 3的主干总线接口序号被设置成1,二级总线接口序号为3,同时从属总线序号为0xff。如上图所示。 在访问PCI总线的时候,总线序号1、2或者3的type 1 PCI配置周期将被发送到正确的PCI总线。
步骤四
继续沿PCI总线3向下扫描PCI-PCI Bridge。PCI总线3上有另外一个PCI-PCI Bridge--Bridge 4, Bridge 4的主干总线序号被设置成3,二级总线序号为4。由于它是此分支上最后一个Bridge所以它的从属总线接口序号为4。初始化代码将重新从PCI-PCI Bridge 3开始并将其从属总线序号设为4。 最后PCI初始化代码将PCI-PCI Bridge1的从属总线序号设置为4。上图拓扑图给出了最后的总线序号分配情况。
算法看起来比较简单,但code还是需要去看的。这种算法的实现依然还是使用函数嵌套的方式。当然初始化过程中,不仅仅是初始化总线序号,最终的目的还是合理分配系统资源,包括memory 、io和irq资源。还是那句话:Read the fuck source code!
注:所有图片来自网络,由于年代久远,找不到当时截图的网址了。