PCI 初始化过程一 :总线拓扑结构的建立

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总线序号分配中将进行详细讨论。

配置PCI-PCIBridge- 指定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-PCI Bridge序号分配:第二步

由于扫描配置算法使用深度优先算法,初始化代码将继续扫描PCI总线1。在此处它将发现一个PCI-PCI Bridge2。除此Bridge2外再没有其它Bridge存在,因此它被分配给从属总线序号2,这正好和其二级接口序号相同。上图画出了此处的PCI-PCIBridge与总线的编号情况


步骤三

PCI-PCI Bridge序号分配:步骤三

当Bridge 2下面的总线都扫描完成之后,算法返回到Bridge2所在的总线1,将继续扫描总线1并发现另外一个PCI-PCIBridge,Bridge 3。Bridge 3的主干总线接口序号被设置成1,二级总线接口序号为3,同时从属总线序号为0xff。如上图所示。 在访问PCI总线的时候,总线序号1、2或者3的type 1 PCI配置周期将被发送到正确的PCI总线。


步骤四

PCI-PCI Bridge序号分配:步骤四

继续沿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!


注:所有图片来自网络,由于年代久远,找不到当时截图的网址了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值