Linux 核心--7.PCI设备(3)

2008-02-23 07:23:46来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折



如果这个PCI设备是一个PCI-PCI桥接器则建立一个pci_bus结构并将其连接到由pci_root指向的pci_dev结构和pci_bus树中。PCI初始化代码通过类别代码0x060400来判断此PCI设备是否是一个PCI-PCI桥接器。然后Linux 核心代码将配置此PCI-PCI桥接器下方的PCI设备。如果有更多的桥接器被找到则进行同样的配置。显然这个过程使用了深度优先搜索算法;系统中PCI拓扑将在进行广度映射前先进行深度优先映射。图6.1中Linux将在配置PCI总线0上的视频设备前先配置PCI设备1上的以太与SCSI设备。 

由于Linux优先搜索从属的PCI总线,它必须处理PCI-PCI桥接器二级总线与从属总线序号。在下面的pci-pci总线序号分配中将进行详细讨论。 


配置PCI-PCI桥接器 - 指定PCI总线序号





图6.6 配置PCI系统:第一部分 

为了让PCI-PCI桥接器可以传递PCI I/O、PCI内存或PCI配置地址空间,它们需要如下内容: 


Primary Bus Number:主干总线序号 
位于PCI-PCI桥接器上方的总线序号 
Secondary Bus Number:二级总线序号 
位于PCI-PCI桥接器下方的总线序号 
Subordinate Bus Number:从属总线序号 
在桥接器下方可达的最大总线序号 
PCI I/O and PCI Memory Windows:PCI I/O与PCI内存窗口 
对于PCI-PCI桥接器下方所有PCI I/O地址空间与PCI内存地址空间的窗口基址和大小。 
配置任一PCI-PCI桥接器时我们对此桥接器的从属总线序号一无所知。不知道是否还有下一级桥接器存在,同时也不知道指派给它们的序号是什么。但可以使用深度优先遍历算法来对扫描出指定PCI-PCI桥接器连接的每条总线,同时将它们编号。当找到一个PCI-PCI桥接器时,其二级总线被编号并且将临时从属序号0xff指派给它以便对其所有下属PCI-PCI桥接器进行扫描与指定序号。以上过程看起来十分复杂,下面将提供一个实例以帮助理解。 


PCI-PCI 桥接器序号分配:步骤1 
考虑图6.6所显示的拓扑结构,第一个被扫描到的桥接器将是桥1。所以桥1下方的总线将被编号成总线1,同时桥1被设置为二级总线1且拥有临时总线序号0xff。这意味着所有PCI总线序号为1或以上的类型1 PCI配置地址将被通过桥1传递到PCI总线1上。如果其总线序号为1则此配置循环将被转换成类型0 配置循环,对于其它序号不作转换。这正是Linux PCI初始化代码所需要的按序访问及扫描 PCI总线1。 



图6.7 配置PCI系统:第二部分 



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





图6.8 配置PCI系统:第三部分 


PCI-PCI 桥接器序号分配:步骤三 
PCI初始化代码将继续扫描总线1并发现另外一个PCI-PCI桥接器,桥3。桥3的主干总线接口序号被设置成1,二级总线接口序号为3,同时从属总线序号为0xff。图6.8给出了系统现在的配置情况。 带总线序号1、2或者3的类型1 PCI配置循环将被发送到正确的PCI总线。 





图6.9 配置PCI系统:第四部分 


PCI-PCI 桥接器序号分配:步骤四 
Linux开始沿PCI总线3向下扫描PCI-PCI桥接器。PCI总线3上有另外一个PCI-PCI桥接器(桥4), 桥4的主干总线序号被设置成3,二级总线序号为4。由于它是此分支上最后一个桥接器所以它的从属总线接口序号为4。初始化代码将重新从PCI-PCI桥接器3开始并将其从属总线序号设为4。 最后PCI初始化代码将PCI-PCI桥接器1的从属总线序号设置为4。图6.9给出了最后的总线序号分配情况。 

6.6.3  PCI BIOS 函数
PCI BIOS函数是一组适用于所有平台的标准过程。在Intel和Alpha AXP系统上没有区别。虽然在CPU控制下可以用它们对所有PCI地址空间进行访问。但只有Linux核心代码和设备驱动才能使用它们。 

  


6.6.4  PCI 补丁代码
在Alpha AXP平台上的PCI补丁代码所作工作量要大于Intel平台。 

基于Intel的系统在系统启动时就已经由系统BIOS完成了PCI系统的配置。Linux只需要完成简单的映射配置. 非Intel系统将需要更多的配置: 


为每个设备分配PCI I/O及PCI内存空间。 
为系统中每个PCI-PCI桥接器配置PCI I/O和PCI内存地址窗口。 
为这些设备产生中断连线值;用来控制设备的中断处理。 
下一节将描叙这些代码的工作过程。 


确定设备所需PCI I/O和PCI内存空间的大小
系统要查询每个PCI设备需要多少PCI I/O于PCI内存地址空间。为了完成这项工作,每个基地址寄存器将被写上全1并读取出来。设备将把不必要的地址位设为0从而有效的定义所需地址空间。 





图6.10 PCI配置头:基地址寄存器 

有两类基本的基地址寄存器,一类标识设备寄存器必须驻留的地址空间;另一类是PCI I/O或PCI内存空间。此寄存器的0位来进行类型的区分。图6.10给出了对应于PCI内存和PCI I/O两种不同类型的基地址寄存器。 

确定某个基地址寄存器所需地址空间大小时,先向此寄存器写入全1再读取此寄存器,设备将在某些位填上0来形成一个二进制数表示所需有效地址空间。 

以初始化DEC 21142 PCI快速以太设备为例,它将告诉系统需要0x100字节的PCI I/O空间或者PCI内存空间。于是初始化代码为其分配空间。空间分配完毕后,就可以在那些地址上看到21142的控制与状态寄存器。 


为PCI-PCI桥接器与设备分配PCI I/O与PCI内存
象所有内存一样,PCI I/O和PCI内存空间是非常有限甚至匮乏。非Intel系统的PCI补丁代码(或者Intel 系统的BIOS代码)必须为每个设备分配其所要求的内存。PCI I/O和PCI内存必须以自然对齐方式分配给每个设备。比如如果一个设备要求0xB0大小的PCI I/O空间则它必须和一个0xB0倍数的地址对齐。除此以外,对于任何指定桥接器,其PCI I/O和PCI内存基址必须以在1M字节边界上以4K字节方式对齐。所以在桥接器下方的设备的地址空间必须位于任意指定设备上方的PCI-PCI桥接器的内存范围内。进行有效的空间分配是一件比较困难的工作。 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Linux 核心--9.设备驱动

下一篇:Linux 核心--6.进程间通讯机制