free website counter

PCI Express基本概念

1. PCIe设备BAR空间的初始化:

   PCIe设备进行数据传输之前,系统软件使用DFS算法遍历并完成BAR0~BAR5寄存器初始化,即分配这些设备在PCI总线域的地址空间,之后,PCI设备可以使用PCI总线地址进行数据传递;BAR0~5寄存器保存的都是PCI设备的地址空间,x86处理器中,没有存储器域和PCI总线域地址空间的转换机制,两个域的地址相等,也是一种简单映射,地址隔离的概念仍然存在;假设在一个32位处理器中,其存储器域的0xF000-0000~0xF7FF-FFFF总共128M的物理地址空间与PCI总线的地址空间映射;当处理器访问这段存储器地址空间,HOST主桥认领这个存储器访问,并将其使用的物理地址空间转换为PCI总线地址空间,并与PCI总线地址空间0xF000-0000~0xF7FF-FFFF对应;

   当PCI设备使用DMA机制访问存储器域地址空间,处理器同样需要将存储器域地址空间反向映射;假设一个处理器系统中,主存储器大小为2GB,其在存储器域的地址范围为0x0000-0000~0x7FFF-FFFF,而这段地址在PCI总线域中对应的“PCI总线地址空间”为0x8000-0000~0xFFFF-FFFF。则PCI设备进行DMA操作时,必须使用0x8000-0000~0xFFFF-FFFF这段PCI总线域的地址,HOST主桥才能认领这个PCI总线事务;PCI设备的BAR寄存器中,包含该设备使用的PCI总线域的地址范围,6个BAR寄存器,因此一个PCI设备最多可以使用6组32位的PCI总线地址空间,或者33组64位的PCI总线地址空间;这些BAR空间保存PCI总线域的存储器地址空间或者I/O地址空间;大多数设备仅使用存储器地址空间,而通常一个设备使用2~3个BAR寄存器就足够;

2. PCIe设备的数据传递:

  • 地址译码方式,存储器读写总线事务到达PCI总线时,在这条总线上的所有PCI设备将进行地址译码,如果当前总线事务使用的地址在某个PCI设备的BAR空间中时,该PCI设备将使能DEVSEL#信号,认领这个总线事务;
  • 处理器到PCI设备的数据传送:
  • PCI设备11在PCI总线域的地址范围是0x7300-0000~0x73FF-FFFF,在存储器域中对应的地址范围是0xF300-0000~0xF3FF-FFFF;我们假设处理器使用存储器写指令,访问0xF300-0008这个存储器地址;
  • 存储器域将0xF300-0008这个地址发向HOST主桥,0xF000-0000~0xF7FF-FFFF这段地址已经由HOST主桥映射到PCI总线域地址空间,所以HOST主桥认为这是一个对PCI设备的访问。因此HOST主桥将首先接管这个存储器写请求;
  • HOST主桥将存储器域的地址0xF300-0008转换为PCI总线域的地址0x7300-0008,并通过总线仲裁获得PCI总线0的使用权,启动PCI存储器写周期,并将这个存储器写总线事务发送到PCI总线0上;
  • PCI总线0的PCI桥1发现0x7300-0008在自己管理的地址范围内,接管这个存储器写请求,并通过总线仲裁逻辑获得PCI总线1的使用权,将请求转发到PCI总线1上;PCI总线1的PCI设备11发现0x7300-0008在自己的BAR0寄存器中命中,接收这个PCI写请求,并完成存储器写总线事务;
  • 假定PCI设备11需要将一组数据,发送到0x1000-0000~0x1000-FFFF这段存储器域的地址空间中;
  • PCI设备11需要对PCI总线域的地址空间0x9000-0000~0x9000-FFFF进行写操作;
  • PCI设备11通过总线仲裁逻辑获得PCI总线1的使用权,将存储器写总线事务发送到PCI总线1上;值得注意的是,这个存储器写总线事务的目的地址是PCI总线域的地址空间0x9000-0000~0x9000-FFFF,这个地址是主存储器在PCI总线域的地址映像;
  • PCI总线1上的设备,包括PCI桥2和PCI桥1,进行地址译码,确定这个写请求是不是发送到自己的BAR空间;
  • PCI桥1发现自己并不能处理当前这个存储器写总线事务,首先通过总线仲裁逻辑获得PCI总线0的使用权后,然后将这个总线事务转发到上游;
  • HOST主桥发现0x9000-0000~0x9000-FFFF这段PCI总线地址空间与存储器域的存储器地址空间0x1000-0000~0x1000-FFFF对应,于是将这段PCI总线地址空间转换成为存储器域的存储器地址空间,并完成对这段存储器的写操作;
  • 存储器控制器将从HOST主桥接收数据,并将其写入到主存储器;

3. PCIe概述:

  • PCIe总线由包括事务层、数据链路层、物理层组成,使用数据报文进行数据传递;使用硬件实现了交换、路由、仲裁机制的协议栈;
  • PCIe体系结构中出现的RC(Root Complex),RC主要功能与PCI总线中的HOST主桥类似,但增加了很多功能;
  • Intel没有使用PCIe总线控制器,而是RC管理PCIe总线;x86中,RC除了管理PCIe设备的数据访问,还包括访问控制、错误处理、虚拟化等;
  • 在互连领域,使用高速差分总线代替并行总线,与单端并行总线相比,可以使用更高的时钟频率,从而减少信号线,提高总线带宽;
  • 每一条PCIe链路只能连接两个设备,端到端的连接方式,两个设备互为发送端和接收端;两端都含有TX(发送逻辑)和RX(接收逻辑);
  • PCIe总线物理链路的一个数据通路(lane)中,由两组差分信号,共4根信号线组成;一个PCIe链路可以包涵多个lane;
  • 目前PCIe链路可以由多个lane组成,x1、x2、x4、x8、x12、x16、x32,每一个lane使用的频率与PCIe总线使用的版本相关;
  • PCIe各个规范的总线频率: 1.x - 1.25GHz; 2.x - 2.5GHz; 3.0 - 4GHz; 单Lane峰值带宽:1.x - 2.5GT/s; 2.x - 5GT/s; 3.0 - 8GT/s; 编码方式:1.x - 8/10b编码; 2.x - 8/10b编码; 3.0 - 128/130b编码;即PCIe链路上,130bit含有128bit有效数据;
  • PCIe链路能够提供的峰值带宽:x1 - 5GT/s; x2 - 10GT/s; x4 - 20GT/s; x8 - 40GT/s; x12 - 60GT/s; x16 - 80GT/s; x32 - 160GT/s; GT计算PCIe链路的峰值带宽:GT(Gigatransfer) = 总线频率 x 数据位宽 x 2;
  • PCIe的延时严重:芯片内外的串并转换、数据报文经过多层模型;
  • 处理器系统中,一般提供x16的PCIe插槽,即16对差分信号组成发送链路,16对差分信号组成接收链路;
  • PCIe设备之间的数据传输:PCIe Device A -> Transaction Layer -> Data Link Layer -> Physical Layer -RX/TX -> Physical Layer -> Data Link Layer -> Transaction Layer -> PCIe Device B;
  • 事务层:封装来自PCIe设备核心的数据成TLP包,发送给数据链路层;从数据链路层接收报文,转发给设备核心;数据链路层:来自事务层的数据到来,被添加Sequence Number前缀和CRC后缀,使用ACK/NAK协议保证报文的可靠传递;物理层:定义了LTSSM状态机,管理链路状态,并进行链路训练、链路恢复和电源管理;
  • PCIe链路必须使用Switch才能连接多个设备,Switch由1个上游端口和2~n个下游端口组成,RC端口位于上方,下游端口一般和EP相连;

4. PCIe组成部件:

  • 大多数处理器系统,都使用了RC、Switch、PCIe-to-PCIe 桥这些基本模块连接PCIe和PCI设备;基于PCIe总线的设备,称为EP(Endpoint);
  • 之前介绍的PCI设备基本配置空间由64Bytes组成,地址范围为0x00~0x3F,这是PCI设备必须支持的;PCIe设备还拓展了0x40~0xFF这段配置空间,主要存放与MSI中断机制和电源管理相关的Capabilities结构,可以提交中断请求的PCIe设备,必须支持MSI Capabilities结构;
  • PCIe设备还支持0x100~0xFFF这段扩展配置空间,PCIe总线的扩展配置空间中,存放PCIe设备独有的一些Capabilities结构;
  • x86中,使用CONFIG_ADDRESS寄存器和CONFIG_DATA寄存器访问PCIe的0x00~0xFF,使用ECAM方式访问0x100 ~ 0xFFF;

5. TLP的路由:

  • TLP的路由指TLP通过Switch或者PCIe桥片时采用哪条路径,最终到达EP或者RC的方法;PCIe总线定义了三种路由方法:基于地址、基于ID和隐性路由;
  • 存储器I/O读写采用基于地址的路由方式;配置读写报文采用基于ID的路由方式;

6. MSI中断机制:

  • PCIe总线中,PCIe设备必须支持MSI/MSI-X中断请求机制,可以不支持INTx中断信息;
  • MSI中断机制使用存储器写请求TLP向处理器提交中断请求;
  • PCIe设备提交MSI中断请求时,向MSI Capabilities结构中的Message Address结构写Message Data数据,从而组成存储器写TLP,向处理器提交中断请求;
  • 目前大多数PCIe设备使用MSI或者MSI-X中断机制提交中断请求,其中MSI中断机制最多支持32个中断请求,并且要求中断向量连续;而MSI-X中断机制可以支持更多中断请求,并且不要求中断向量连续;MSI-X中断机制更合理;
  • Message Address和Message Data寄存器应该是位于PCIe设备的配置空间中;而MSI-X机制使用的这两寄存器位于BAR空间,因此可以由用户决定使用MSI-X中断请求的数目;

7. Message Address和Message Data字段:

  • PCIe设备使用Message Address字段保存PCI总线域地址,其中[31:20]存放FSB Interrupt存储器空间基地址,值为0xFEE,PCIe设备向0xFEEX-XXXX这段“PCI总线域”地址空间进行写操作,首先进行PCI总线域到存储器域的地址转换,之后写操作翻译成FSB总线的Interrupt Message总线事务,从而向CPU内核提交中断请求;
  • FSB总线事务提交PCIe设备使用的中断向量,从而CPU不需要使用中断响应周期从寄存器获得中断向量;
  • Message Data的[7:0]为Vector字段,表示中断请求使用的中断向量,FSB将中断向量也通知处理器;
  • PCIe设备发送MSI/MSI-X中断请求之前,系统软件需要合理设置PCIe设备的MSI/MSI-X Capabilities寄存器,使得Message Address寄存器的值为0xFEExx00y(什么意思?),同时设置Message Data寄存器的Vector字段;Message Address寄存器在存储器域和PCI总线域中的地址都为0xFEC00020;
  • PCI设备使用的irq号存放在pdev->irq中,该参数在Linux设备驱动程序初始化时,由pci_enable_device函数设置;irq号给系统软件使用,之后PCI设备的驱动程序可以使用request_irq函数将中断服务例程与irq号建立映射关系;
  • PCIe设备需要使用MSI中断机制时,将调用pci_enable_msi函数,该函数返回值为0时,表示成功返回,此时函数更新pci_dev -> irq参数;函数在纯软件层面进行一些全局变量的参数检查,硬件层面上检查上游的PCI桥等是否支持MSI报文的转发,PCI设备是否具有Capabilities表等;
Published 28 November 2014
分享按钮