接口技术【5】PCIe入门简介 -- PCIe配置

总线,设备和功能的定义

就像PCI一样,每个PCIe功能都是由设备device和其相连的总线bus定义的。这个唯一的ID被叫做BDF(bus device function)。配置软件要负责检测总线拓扑中的所有BDF。下面要介绍它们的细节,下图是一个例子
BDF

PCIe总线bus

配置软件可以有最多256个总线。最初的总线号码是0,一般分配给root总线。0号总线包含虚拟PCI总线,它连接着集成终端和虚拟PCI桥接PCI-to-PCI Bridge (P2P),这些虚拟PCI桥接也有自己的设备号码和功能号码。每个P2P桥接会新建一个总线号码,可以连接其他PCIe设备。每个总线要有一个唯一的总线编号。配置软件从BDF号码000开始搜索,每发现一个新的桥接就新建一个总线号,新的总线号必须比其连接的总线号大,软件在发现新的总线时会优先深入搜索新总线,然后才回去搜索原来的总线,可以把这个过程理解为深度优先遍历。

PCIe设备device

PCIe允许每个总线bus搭载32个device,然而PCIe的结构决定了每个总线bus只能搭载一个设备device,自然拿到的是设备号码0.root和switch可以有虚拟PCI总线,允许“搭载”多个设备。每个设备必须拥有功能号0,用来包含所有8个功能的集合。当一个设备有超过1个功能时,它被称作多功能设备。

PCIe功能function

就像前面介绍的一样,每个设备device都有功能function。这些功能包括硬件驱动接口,显示控制,局域网控制,USB控制等等。多功能设备的功能号不需要按顺序编排。比如一个设备可以有功能号0,2和7。因此当系统探测到一个多功能设备时,每个设备号都会检查一遍是否存在。每个功能还有自己的配置地址空间用来设置和功能相关的资源

配置地址空间

最初的PC要求使用者用开关和跳接口给每张卡配置资源,但这经常导致存储空间、IO和中断配置上的冲突。随后的IO架构开始使用热插拔结构。在这种架构中给每个插入的卡发送配置文件,允许系统为其配置基础资源。PCI通过标准化配置寄存器来拓展了热插拔能力,让压缩操作系统OS可以实际管理系统资源。由于有了标准的错误报告、中断传输、地址分配和其他能力,配置软件可以在没有资源冲突的情况下分配系统资源。

PCI给每个功能都分配了一个特定的配置地址空间。大多数基础功能配置都在配置寄存器空间的开头,但PCI架构工程师意识到提供可选特征配置会很有用,这被称为能力架构。PCI兼容功能的配置空间有256 bytes

PCI兼容空间

pci config
上图所示是兼容PCI的配置空间,大小是256 bytes。开头的64 btytes是配置header,根据device和bridge分为type 0和type 1.剩下的192 bytes是用作可选PCI能力寄存器。

扩展配置空间

PCIe config
最初PCIe的256 bytes空间不够用,因此配置空间被扩充到4kb,被称作扩展配置空间。多出来的3840 bytes只能通过扩展配置机制来使用,因此它无法被过去的PCI软件识别。它包含高级错误报告、虚拟信道、设备序列号、功率配置等功能,如上图所示。

Host-to-PCI桥接配置寄存器

Host-to-PCI桥接配置寄存器不一定要用前面的方式配置,因为一般来说都是由存储空间中的特定寄存器来实现的。

只有root可以生成配置请求,它就像系统处理器用来和PCIe总线拓扑联系的接口,如此就能防止一些设备修改其他设备的配置。

由于只有root可以生成这些请求,他们只能从root顺着拓扑树往下流,同时一个设备对另一个设备的配置也被禁止。这些请求根据其BDF号路由到指定设备

配置传输

处理器一般不能直接读写配置因为它们只能生成存储和IO请求。因此root需要把配置请求翻译成形式来进行这个流程。这可以通过传统PCI的间接IO读写机制,也可以用存储读写机制

传统PCI机制

PCI标准定义了一个IO间接读写机制来实现PCI配置。在当时主流的PC处理器只配置了很有限的64kb IO地址空间。按照当时PCI设计,这有限的地址空间又被乱糟糟的分配了,导致只剩下两个地址段可用:0800h-08FFh和0C00h-0CFFh,不可能把一个功能的所有配置寄存器放入IO空间。同时存储地址空间有限,因此标准的设计者选择了常见解决方案:间接地址映射。简单来说,一个寄存器放地址,另一个放数据,就像这个系列第一篇介绍的那样。它解决了地址空间有限的问题,但是需要两次IO读写来完成一次配置。

PCI兼容机制在Host-to-PCI bridge使用两个32位IO接口,它们分别是配置地址接口,对应IO地址0CF8h-0CFBh;配置数据接口,对应IO地址0CFCh-0CFFh。

读写一个功能的PCI兼容配置寄存器是通过两部完成的,先把目标设备的BDF和寄存器指针写入配置地址接口;之后把最多4 byte的IO读写信息送入配置数据接口。在root的Host桥接会比较规定的总线号码和其下辖的总线号码,决定其向谁发送,这也是深度优先搜索算法的体现

地址配置接口

写入地址配置接口的信息必须遵循下面的模式
在这里插入图片描述

  1. [1:0]锁定为0,只读
  2. [7:2]是目标寄存器编号,指向目标功能的PCI兼容配置空间中的寄存器位置,限定在头256 bytes
  3. [10:8]是目标功能编号,限定0-7
  4. [15:11]是目标设备编号,限定0-31
  5. [23:16]是目标总线编号,限定0-255
  6. [30:24]锁定为0,保留区域
  7. [31]必须设置为1来表示地址配置接口,如果设置为0则表示数据配置接口

总线选择

如下图所示,Root中的host-to-PCI桥接中有次要总线编号寄存器(Sec)和下属总线编号寄存器(Sub)。次要总线编号是桥接下直接连接的总线编号,而下属总线数目是其下设备树中最大编号。

简单来说就是表示自己下属设备号的范围,当收到配置数据时,只要搜索直接连接的设备的sec和sub就知道需要把数据传到哪里。
single processor

单核系统

写到配置地址接口的数据被Host-to-PCI桥接锁定保存,如果数位[31]是1,并且目标总线号在sec和sub范围内,则桥接会把它翻译成针对相应设备的配置请求。接着处理器会在地址0CFCh启动一个IO读写,这会生成一个配置请求,根据配置数据接口中是要读还是要写来决定是写请求还是读请求。如果目标是总线0,则是type 0配置传输,如果目标是总线1,则是type 1配置传输,如果超出范围则不传输

多核系统

如果有多个root,如同下图所示,那配置地址接口和配置数据接口会被重复到相应Host-to-PCI的相同IO地址。为了防止冲突,只有一个桥接会回应处理器的配置请求。

  1. 当处理器发起一个对配置地址接口的IO写时,Host-to-PCI桥接需要配置好相应编码,使配置传输只能传到一个终端
  2. 软件驱动会先把当前总线及其下属的设备全部编号后,会跳到下一个未被使用的总线,从之前编号的末尾开始接着编号。所有的host桥接都能看到配置请求,但只有一个目标设备会回应
  3. 在这之后,送到桥接的地址配置会被检查是否有下属编号符合要求,有就传下去,否则舍弃
    multi proc

配置请求

配置请求有两种,0型和1型,根据目标设备编号来区分

0型配置请求

如果目标设备编号匹配上的是当前总线的下属的最小编号,则使用0型配置请求。

直接和终端设备相连的总线都只有唯一的下属编号,因此传送到终端的都是0型配置请求,相应的,switch会接触到1型配置请求。其配置内容如下
type 0

1型配置请求

当桥接发现一个配置请求针对的总线编号不匹配其下属的最小编号,但却是在其下属编号范围内的,它会把这个请求以1型请求转送给相应的下属总线。终端设备如果看到1型请求会忽略它,但桥接会把它传递到相应范围的下属总线。

如果接到1型配置请求的总线发现其匹配上其下属的最小编号,则将其转换成0型请求接着下传,其具体组成如下
type 1

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值