PCI及PCIe基本知识

目录

PCI总线结构

PCIe总线结构

配置空间

PCI信号线定义

PCI信号线定义 - 地址和数据信号

PCI信号线定义 - 接口控制信号

PCI信号线定义 - 中断请求等其他信号

 PCIe信号线定义

 PCIe信号线定义 - 数据线 Lane

PCIe信号线定义 - 控制信号线

1. PERST#信号

2.REFCLK+和REFCLK-信号

3. WAKE#信号

4. SMCKL和SMDAT信号

5. JTAG信号

6.PRSNT1#与PRSNT2#信号

PCI总线的事务

Posted和Non-Posted 传送方式

HOST 处理器访问PCI设备

PCI设备读写主存储器

PCIe总线事务

TLP格式

TLP Head 格式

TLP 的路由

基于地址的路由

基于ID的路由

隐式路由

存储器读写请求TLP

完成报文

配置读写请求TLP

消息请求TLP

 INTx中断消息报文

 错误消息报文

PCIe总线中的原子操作

1.FetchAdd 操作

2.Swap 总线事务

3.CAS总线事务(Compare And Swap)


注:1 DWORD == 2Bytes

PCI总线结构

PCI是共享总线,一个总线上可以挂接多个设备,速率越高可挂接的设备越少;

PCIe总线结构

与PCI总线不同,PCle总线使用端到端的连接方式,在一条PCle链路的两端只能各连接一个设备,这两个设备互为数据发送端和数据接收端。PCIe总线除了总线链路外,还具有多个层次,发送端发送数据时将通过这些层次,而接收端接收数据时也使用这些层次。PCIe 总线使用的层次结构与网络协议栈较为类似,但每个层次都是用硬件实现。数据报文在设备的核心层(DeviceCore)中产生,然后再经过该设备的事务层(Transaction Layer)、数据链路层(Data Link Layer)和物理层(Physical Layer),最终发送出去。

一个典型的PCIe系统框图如下:

一个典型的结构是一个root port和一个endpoint直接组成一个点对点连接对,而Switch可以同时连接几个endpoint。一个root port和一个endpoint对就需要一个单独的PCIe bus,称为一个link。而PCI是在同一个总线上的设备共享同一个bus number。过去主板上的PCI插槽都公用一个PCI bus,而现在的PCIe插槽却连在芯片组不同的root port上。


配置空间

PCI配置空间大小0x100;

PCIe配置空间大小0x1000。


PCI信号线定义


PCI信号线定义 - 地址和数据信号

PCI总线是一条共享总线,在一条PCI总线上可以挂接多个PCI设备。这些PCI设备通过一系列信号与PCI总线相连,这些信号由地址/数据信号、控制信号、仲裁信号、中断信号等多种信号组成。

PCI总线是一个同步总线,每一个设备都具有一个CLK信号,其发送设备与接收设备使用这个CLK信号进行同步数据传递。PCI总线可以使用33 MHz或者66MHz的时钟频率。

除了RST#、INTA~D#、PME#和CLKRUN#等信号之外,PCI设备使用的绝大多数信号 都使用这个CLK信号进行同步。其中RST#是复位信号,而PCI设备使用INTA~D#信号进行中断请求。

在PCI总线中,与地址和数据相关的信号如下所示。

(1)AD[31:0]信号

PCI总线复用地址与数据信号。PCI总线事务在启动后的第一个时钟周期传送地址,这个地址是PCI总线域的存储器地址或者I/O地址;而在下一个时钟周期传送数据。传送地址的时钟周期也被称为地址周期,而传送数据的时钟周期也被称为数据周期。PCI总线支持突发传送,即在一个地址周期之后,可以紧跟多个数据周期。

(2)PAR信号

PCI总线使用奇偶校验机制,保证地址和数据信号在进行数据传递时的正确性。PAR信号是AD[31:0]和C/BE[3:0]的奇偶校验信号。PCI主设备在地址周期和数据周期中,使用该信号为地址和数据信号线提供奇偶校验位。

(3)C/BE[3:0]#信号

PCI总线复用命令与字节选通引脚。在地址周期中,C/BE[3:0]#信号表示PCI总线的命令。而在数据周期中,C/BE[3:0]#引脚输出字节选通信号,其中C/BE3、C/BE2、C/BE1和C/BE0与数据的字节3、2、1和0对应。使用这组信号可以对PCI设备进行单个字节、字和双字访问。PCI总线通过C/BE[3:0]#信号定义了多个总线事务,这些总线事务如下:

0000	Interrupt Acknowledge		中断响应总线事务读取当前挂接在PCI总线上的中断控制器的中断向量号。目前大多数处理器系统的中断控制器都不挂接在PCI总线上,因此这种总线事务很少使用
0001	Special Cycle				HOST主桥可以使用Special Cycle事务在PCI总线上进行信息广播
0010	I/O Read 					HOST主桥可以使用该总线事务对PCI设备的I/O地址空间进行读操作。目前多数PCI设备都不支持IO地址空间,而仅支持存储器地址空间,但是仍有部分PCI设备同时包含I/O地址空间和存储器地址空间
0011	I/O Write					对PCI总线的I/O地址空间进行写操作
0100	Reserved					保留
0101	Reserved					保留
0110	Memory Read					HOST主桥可以使用该总线事务对PCI设备的存储器空间进行读操作。PCI设备也可以使用该总线事务读取处理器的存储器空间
0111	Memory Write				HOST主桥可以使用该总线事务对PCI设备的存储器空间进行写操作。PCI设备也可以使用该总线事务向处理器的存储器空间进行写操作
1000	Reserved					保留
1001	Reserved					保留
1010	Configuration Read			HOST主桥可以对PCI设备的配置空间进行读操作。每一个PCI设备都有独立的配置空间。在多功能PCI设备中,每一个子设备(Func—tion)也有一个独立的配置空间。该总线事务只能由HOST主桥发出,PCI桥可以转发该总线事务
1011	Configuration Write			HOST 主桥对PCI设备的配置空间进行写操作
1100	Memory Read Multiple		HOST 主桥可以使用该总线事务对PCI设备的存储器空间进行多行读操作,这种操作并不多见。该总线事务的主要用途是供PCI设备使用,读取主存储器。这个读操作与Memory Read操作(C/BE [3: 0]为0x0110时)略有不同
1101	Dual Address Cycle			PCI总线支持64位地址,处理器或者其他PCI设备访问64位PCI总线地址时,必须使用双地址周期产生64位的PCI总线地址。PCI设备使用DMA读写方式访问64位的存储器地址时,也可以使用该总线事务
1110	Memory Read Line			HOST主桥可以使用该总线事务对PCI设备的存储器空间进行单行读操作,这种操作并不多见。该总线事务的主要用途是供PCI设备使用,读取主存储器。
1111	Memory Write andInvalidate	存储器写并无效操作,与存储器写不同, PCI设备可以使用该总线事务对主存储器空间进行写操作。该总线事务将数据写人主存储器的同时,将对应Cache行中的数据“使无效”,

PCI信号线定义 - 接口控制信号

在PCI总线中,接口控制信号的主要作用是保证数据的正常传递,并根据PCI主从设备的状态,暂停、终止或者正常完成当前总线事务,其主要信号如下。

(1)FRAME#信号

该信号指示一个PCI总线事务的开始与结束。当PCI设备获得总线的使用权后,将置该信号有效,即置为低,启动PCI总线事务,当结束总线事务时,将置该信号无效,即置为高。PCI设备(HOST主桥)只有通过仲裁获得当前PCI总线的使用权后,才能驱动该信号。

(2)IRDY#信号

该信号由PCI主设备(包括HOST主桥)驱动,该信号有效时表示PCI主设备的数据已经准备完毕。如果当前PCI总线事务为写事务,表示数据已经在AD[31:0]上有效;如果为读事务,表示PCI主设备已经准备好接收缓冲,目标设备可以将数据发送到AD[31:0]上。 

(3)TRDY#信号

该信号由目标设备驱动,该信号有效时表示目标设备已经将数据准备完毕。如果当前PCI总线事务为写事务,表示目标设备已经准备好接收缓冲,可以将AD[31:0]上的数据写入目标设备;如果为读事务,表示目标设备需要的数据已经在AD[31:0]上有效。该信号可以和IRDY#信号联合使用,在PCI总线事务上插入等待周期,对PCI总线的数据传送进行控制。

(4)STOP#信号

该信号有效时表示目标设备请求主设备停止当前PCI总线事务。一个PCI总线事务除了可以正常结束外,目标设备还可以使用该信号终止当前PCI总线事务。目标设备可以根据不同的情况,要求主设备对当前PCI总线事务进行重试(Retry)、断连(Disconnect),也可以向主设备报告目标设备夭折(Target Abort)。

目标设备要求主设备Retry和Disconnect并不意味着当前PCI总线事务出现错误。当目标设备没有将数据准备好时,可以使用Retry周期使主设备重试当前PCI总线事务。有时目标设备不能接收来自主设备较长的Burst操作时,可以使用Disconnect周期,将一个较长的Burst操作分解为多个Burst操作。当主设备访问的地址越界时,目标设备可以使用Disconnect周期,终止主设备的越界访问。

而Target Abort表示在数据传送中出现错误。处理器系统必须对这种情况进行处理。在PCI总线中,出现Abort一般意味着当前PCI总线域出现了较为严重的错误。

(5)IDSEL 信号

PCI总线在进行配置读写总线事务时,使用该信号选择PCI目标设备。配置读写总线事务与存储器读写总线事务在实现上略有不同。在PCI总线中,存储器读写总线事务使用地址译码方式访问外部设备。而配置读写总线事务使用“ID译码方式”访问PCI设备,即通过PCI设备的总线号、设备号和寄存器号访问PCI设备的配置空间。

IDSEL信号与PCI设备的设备号相关,相当于PCI设备配置空间的片选信号。

(6)DEVSEL#信号

该信号有效时表示PCI总线的目标设备准备好,该信号与TRDY#信号的不同之处在于该信号有效仅表示目标设备已经完成了地址译码。目标设备使用该信号通知PCI主设备,其访问对象在当前PCI总线上,但是并不表示目标设备可以与主设备进行数据交换。而TRDY#信号表示数据有效,PCI主设备可以向目标设备写入或者从目标设备读取数据。

PCI总线规范根据设备的译码速度,将PCI设备分为快速、中速和慢速三种。在PCI总线上还有一种特殊的设备,即负向译码设备,在一条PCI总线上当快速、中速和慢速三种设备都不能响应PCI总线事务的地址时,负向译码设备将被动地接收这个PCI总线事务。如果在PCI主设备访问的PCI总线上,没有任何设备可以置 DEVSEL#信号为有效,主设备将使用Master Abort周期结束当前总线事务。

(7)LOCK#信号

PCI主设备可以使用该信号,将目标设备的某个存储器或者I/O资源锁定,以禁止其他PCI主设备访问此资源,直到锁定这个资源的主设备将其释放。PCI总线使用LOCK#信号实现LOCK总线事务,只有HOST主桥、PCI桥或者其他桥片可以使用LOCK#信号。在PCI总线的早期版本中,PCI Agent设备也可以使用LOCK#信号,而目前PCI总线使用LOCK#信号仅是为防止死锁和向前兼容。LOCK总线事务将严重影响PCI总线的传送效率,在实际应用中,设计者应当尽量避免使用该总线事务。


PCI信号线定义 - 中断请求等其他信号

PCI总线提供了INTA#、INTB#、INTC#和INTD#四个中断请求信号,PCI设备借助这些 中断请求信号,使用电平触发方式向处理器提交中断请求。当这些中断请求信号为低时,PCI设备将向处理器提交中断请求;当处理器执行中断服务程序清除PCI设备的中断请求12后,PCI设备将该信号置高,结束当前中断请求。

PCI总线规定单功能设备只能使用INTA#信号,而多功能设备才能使用INTB#/C#/D#信号。PCI设备的这些中断请求信号可以通过某种规则进行线与,之后与中断控制器的中断请求信号线相连。而处理器系统需要预先知道这个规则,以便正确处理来自不同PCI设备的中断请求,这个规则也被称为中断路由表。

PCI总线在进行数据传递过程时,难免会出现各种各样的错误,因此PCI总线提供了一些错误信号,如PERR#和SERR#信号。其中当PERR#信号有效时,表示数据传送过程中出现奇偶校验错(Special Cycle周期除外);而当SERR#信号有效时,表示当前处理器系统出现了三种错误可能,分别为地址奇偶校验错、在Special Cycle周期中出现数据奇偶校验错、系统出现其他严重错误。

如果PCI总线支持64位模式,还需要提供AD[63:32]、C/BE[7:4]、REQ64、ACK64和PAR64这些信号。此外PCI总线还有一些与JTAG、SMBCLK以及66MHz使能相关的信号。


 PCIe信号线定义


 PCIe信号线定义 - 数据线 Lane

PCIe使用Lane进行数据收发,一条Lane 由T+、T- 、R+、R- 共4条信号线组成,xn位宽就有n条Lane。使用差分信号,可减少外界干扰;差分信号间极性相反可减少对外干扰。


PCIe信号线定义 - 控制信号线

1. PERST#信号

该信号为全局复位信号,由处理器系统提供,处理器系统需要为PCle插槽和PCle 设备提供该复位信号。PCle设备使用该信号复位内部逻辑。当该信号有效时,PCle设备将进行复位操作。PCle总线定义了多种复位方式,其中Cold Reset和Warm Reset 这两种复位方式的实现与该信号有关。

2.REFCLK+和REFCLK-信号

PCle设备与PCIe插槽都具有REFCLK+和REFCLK-信号,其中 PCle 插槽使用这组信号与处理器系统同步。

在一个处理器系统中,通常采用专用逻辑向PCle插槽提供 REFCLK+和REFCLK-信号,如下图所示。其中100MHz的时钟源由晶振提供,并经过一个“一推多”的差分时钟驱动器生成多个同相位的时钟源,与PCIe插槽一一对应连接。

PCIe插槽需要使用参考时钟,其频率范围为100 MHz±300ppm。处理器系统需要为每一个PCIe插槽、MCH、ICH和Switch提供参考时钟。而且要求在一个处理器系统中,时钟驱动器产生的参考时钟信号到每一个PCle插槽(MCH、ICH和Swith)的距离差在15in之内。通常信号的传播速度接近光速,约为6in/ns,由此可见,不同PCIe插槽间 REFCLK+和REFCLK—信号的传送延时差约为2.5ns。

当PCle 设备作为Add—In卡连接在PCle插槽时,可以直接使用PCle 插槽提供的REFCLK+和REFCLK—信号,也可以使用独立的参考时钟,只要这个参考时钟在100 MHz±300ppm范围内即可。内置的PCle 设备与Add-In卡在处理 REFCLK+和REFCLK- 信号时使用的方法类似,但是PCle设备可以使用独立的参考时钟,而不使用REFCLK+和REFCLK-信号。

在PCle设备配置空间的 Link Control Register中,含有一个“Common Clock Configuration”位。当该位为1时,表示该设备与PCle链路的对端设备使用“同相位”的参考时钟;如果为0,表示该设备与PCle链路的对端设备使用的参考时钟是异步的。

在PCIe设备中,“Common Clock Configuration”位的缺省值为0,此时PCle设备使用的参考时钟与对端设备没有任何联系,PCle链路两端设备使用的参考时钟可以异步设置。这个异步时钟设置方法对于使用PCle链路进行远程连接时尤为重要。

在一个处理器系统中,如果使用PCle链路进行机箱到机箱间的互连,因为参考时钟可以异步设置,机箱到机箱之间进行数据传送时仅需要差分信号线即可,而不需要参考时钟,从而极大地降低了连接难度。

3. WAKE#信号

当PCIe 设备进入休眠状态,主电源已经停止供电时,PCle 设备使用该信号向处理器系统提交唤醒请求,使处理器系统重新为该PCIe 设备提供主电源Vcc。

4. SMCKL和SMDAT信号

PCIe为SMBus协议预留的信号线,SMBus源于I2c,但由有些差别,此处不作详细讲解。

5. JTAG信号

用于芯片内部测试。

6.PRSNT1#与PRSNT2#信号

与热插拔相关,处理器系统根据插入和拔出时插槽中的该信号高低电平来做相应处理。硬件设计上应该使用长短针才能实现热拔插功能,PRSNT1#和PRSNT2#信号使用的金手指长度是其他信号的一半。


PCI总线的事务

PCI总线使用单端并行数据线,采用地址译码方式进行数据传递,而采用ID译码方式进行配置信息传递。其中地址译码方式使用地址信号,而ID译码方式使用PCI设备的ID号,包括Bus Number、Device Number、Function Number和Register Number。

存储器、IO读写事务中的地址均为PCI总线域地址,与处理器系统进行数据交互时需HOST主桥进行地址映射转换,转换方式不同的HOST主桥处理方式不一样,如飞思卡尔的PowerPC使用inbound/outbound根据软件配置来映射,多数ARM 及X86使用地址1:1的方式映射(具体实现方式不详)。

存储器、IO读写事务必须在系统软件初始化PCI设备的配置空间后才能使用。

PCI总线支持以下几类存储器读写总线事务。

(1) HOST 处理器对PCI设备的BAR空间进行数据读写, BAR空间可以使用存储器或者I/O译码方式。HOST处理器使用PCI总线的存储器读写总线事务I/O读写总线事务访问PCI设备的BAR空间。

(2) PCI设备之间的数据传递。在PCI总线上的两个设备可以直接通信,如一个PCI设备可以访问另外一个设备的BAR空间。不过这种数据传递在PC处理器系统中较少使用。

(3) PCI设备对主存储器进行读写,即DMA读写操作。DMA读写操作在所有处理器系统中都较为常用,也是PCI总线数据传送的重点。在多数情况下, DMA读写操作结束后将伴随着中断的产生。PCI设备可以使用INTA#、INTB#、INTC#和INTD#信号提交中断请求,也可以使用MSI机制提交中断请求。PCIe中引入MSI-X中断机制。

PCI总线支持突发周期,因此在地址周期之后可以有多个数据周期,可以传送多组数据。而目标设备并不知道突发周期的长度,如果目标设备不能继续接收数据时,可以dis-connect(断连)当前总线事务。值得注意的是,只有存储器读写总线事务可以使用突发周期。


Posted和Non-Posted 传送方式

PCI总线规定了两类数据传送方式,分别是Posted和Non-Posted 数据传送方式。其中使用Posted数据传送方式的总线事务也被称为Posted总线事务;而使用Non-Posted数据传送方式的总线事务也被称为Non-Posted总线事务。

其中Posted 总线事务指PCI主设备向PCI目标设备进行数据传递时,当数据到达PCI桥后,即由PCI桥接管来自上游总线的总线事务,并将其转发到下游总线。采用这种数据传送方式,在数据还没有到达最终的目的地之前,PCI总线就可以结束当前总线事务,从而在一定程度上解决了PCI总线的拥塞问题。

而Non-Posted 总线事务是指PCI主设备向PCI目标设备进行数据传递时,数据必须到达最终目的地之后,才能结束当前总线事务的一种数据传递方式。

显然采用Posted传送方式,当这个Posted 总线事务通过某条PCI总线后,就可以释放PCI总线的资源;而采用Non-Posted传送方式,PCI总线在没有结束当前总线事务时必须等待。这种等待将严重阻塞当前PCI总线上的其他数据传送,因此PCI总线使用Delayed 总线事务处理Non-Posted数据请求,使用Delayed总线事务可以相对缓解PCI总线的拥塞。

PCI总线规定只有存储器写请求(包括存储器写并无效请求)可以采用Posted总线事务,而存储器读请求、 I/O读写请求、配置读写请求只能采用Non-Posted总线事务。

有如下图拓扑,根据此拓扑对Posted过程进行分析:

图 基于PCI总线的处理器系统

PCI设备11进行DMA写操作时使用存储器写总线事务,当PCI设备11获得PCI总线x1的使用权后,将发送存储器写总线事务到PCI总线x1。当PCI桥1发现这个总线事务的地址不在该桥管理的地址范围内将首先接收这个总线事务,并结束PCI总线x1的总线事务。

此时PCI总线x1使用的资源已被释放,PCI设备11和PCI设备12可以使用PCI总线x1进行通信。PCI桥1获得PCI总线x0的使用权后,将转发这个存储器写总线事务到PCI总线x0,之后HOST主桥x将接收这个存储器写总线事务,并最终将数据写入主存储器。

由以上过程可以发现,Posted数据请求在通过PCI总线之后,将逐级释放总线资源,因此PCI总线的利用率较高。而使用Non-Posted方式进行数据传送的处理过程与此不同,Non-Posted数据请求在通过PCI总线时,并不会及时释放总线资源,从而在某种程度上影响PCI总线的使用效率和传送带宽。


HOST 处理器访问PCI设备

HOST处理器对PCI设备的数据访问主要包含两方面内容,一方面是处理器向PCI设备发起存储器和I/O读写请求;另一方面是处理器对PCI设备进行配置读写。

在PCI设备的配置空间中,共有6个BAR寄存器。每一个BAR寄存器都与PCI设备使用的一组PCI总线地址空间对应,BAR寄存器记录这组地址空间的基地址。将与BAR寄存器对应的PCI总线地址空间称为BAR空间,在BAR空间中可以存放I/O地址空间,也可以存放存储器地址空间。

PCI设备可以根据需要,有选择地使用这些BAR空间。值得注意的是,在BAR寄存器中存放的是PCI设备使用的“PCI总线域”的物理地址,而不是“存储器域”的物理地址。

HOST处理器访问PCI设备I/O地址空间的过程,与访问存储器地址空间略有不同。有些处理器,如x86处理器,具有独立的I/O地址空间。x86处理器可以将PCI设备使用的I/O地址映射到存储器域的I/O地址空间中,之后处理器可以使用IN、OUT等指令对存储器域的I/O地址进行访问,然后通过HOST主桥将存储器域的I/O地址转换为PCI总线域的I/O地址,最后使用PCI总线的I/O总线事务对PCI设备的I/O地址进行读写访问。在x86处理器中,存储器域的I/O地址与PCI总线域的I/O地址相同;在ARM64处理器中,存储器域的I/O地址与PCI总线域的I/O地址相同;在飞思卡尔的PowerPC处理器中,存储器域的I/O地址与PCI总线域的I/O地址不相同,根据inbound/outbound配置而定。

对于有些没有独立I/O地址空间的处理器,如PowerPC、ARM处理器,需要在HOST主桥初始化时,将PCI设备使用的I/O地址空间映射为处理器的存储器地址空间。PowerPC、ARM处理器对这段“存储器域”的存储器空间进行读写访问时,HOST主桥将存储器域的这段存储器地址转换为PCI总线域的I/O地址,然后通过PCI总线的I/O总线事务对PCI设备的I/O地址进行读写操作。

在PCI总线中,存储器读写事务与I/O读写事务的实现较为类似。首先HOST处理器在初始化时,需要将PCI设备使用的BAR空间映射到“存储器域”的存储器地址空间。之后处理器通过存储器读写指令访问“存储器域”的存储器地址空间,HOST主桥将“存储器域”的读写请求翻译为PCI总线的存储器读写总线事务之后,再发送给目标设备。

值得注意的是存储器域和PCI总线域的概念,点击此处了解。PCI设备能够直接使用的地址是PCI总线域的地址,在PCI总线事务中出现的地址也是PCI总线域的地址;而处理器能够直接使用的地址是存储器域的地址。理解存储器域与PCI总线域的区别对于理解PCI总线至关重要。

如果将PCI桥考虑进来,情况将略微复杂

下面根据如下处理器系统介绍处理器如何通过HOST主桥和PCI桥1对PCI设备11进行存储器读写操作:

图 基于PCI总线的处理器系统

当处理器对PCI设备11进行存储器操作时 

这些数据需要通过HOST主桥x和PCI桥x1,最终到达PCI设备11,其访问步骤如下。值得注意的是,以下步骤忽略PCI总线的仲裁过程。
(1)首先处理器将要传递的数据放入通用寄存器中,之后向PCI设备11映射到的存储器域的地址进行写操作。值得注意的是,处理器并不能直接访问PCI设备11的PCI总线地址空间,因为这些地址空间是属于PCI总线域的,处理器所能直接访问的空间是存储器域的地址空间。处理器必须通过HOST主桥将存储器域的数据访问转换为PCI总线事务才能对PCI总线地址空间进行访问。
(2)HOST主桥x接收来自处理器的存储器写请求,之后处理器结束当前存储器写操作,释放系统总线。HOST主桥x将存储器域的存储器地址转换为PCI总线域的PCI总线地址。并向PCI总线x0发起PCI写请求总线事务。值得注意的是,虽然在许多处理器系统中,存储器地址和PCI总线地址完全相等,但其含义完全不同。
(3)PCI总线x0上的PCI设备01、PCI设备02和PCI桥x1将同时监听这个PCI写总线事务。最后PCI桥x1接收这个写总线事务,并结束来自PCI总线x0的PCI总线事务。之后PCI桥x1向PCI总线x1发起新的PCI总线写总线事务。
(4)PCI总线x1上的PCI设备11和PCI设备12同时监听这个PCI写总线事务。最后PCI设备11通过地址译码方式接收这个写总线事务,并结束来自PCI总线x1上的PCI总线事务。

由以上过程可以发现,由于存储器写总线事务使用Posted传送方式,因此数据通过PCI桥后都将结束上一级总线的PCI总线事务,从而上一级PCI总线可以被其他PCI设备使用。如果使用Non—Posted传送方式,直到数据发送到PCI设备11之后,PCI总线x1和x0才能依次释放,从而在某种程度上将造成PCI总线的拥塞。

 处理器对PCI设备11进行存储器

这个读请求需要首先通过HOST主桥x和PCI桥x1到达PCI设备11,之后PCI设备11将读取的数据再次通过PCI桥x1和HOST主桥x传递给HOST处理器,其步骤如下所示。我们首先假设PCI总线没有使用Delayed 传送方式处理Non-Posted 总线事务,而是使用纯粹的Non-Posted方式。

(1)首先处理器准备接收数据使用的通用寄存器,之后向PCI设备11映射到的存储器域的地址进行读操作。
(2)HOST主桥x接收来自处理器的存储器读请求。HOST主桥x进行存储器地址到PCI总线地址的转换,之后向PCI总线x0发起存储器读总线事务。
(3)PCI总线x0上的PCI设备01、PCI设备02和PCI桥x1将监听这个存储器读请求,之后PCI桥1接收这个存储器读请求。然后PCI桥x1向PCI总线x1发起新的PCI总线读请求。
(4)PCI总线x1上的PCI设备11和PCI设备12监听这个PCI读请求总线事务。最后PCI设备11接收这个存储器读请求总线事务,并将这个读请求总线事务转换为存储器读完成总线事务之后,将数据传送到PCI桥x1,并结束来自PCI总线x1上的PCI总线事务。
(5)PCI桥x1将接收到的数据通过PCI总线x0,继续上传到HOST主桥x,并结束PCI总线x0上的PCI总线事务。
(6)HOST主桥x将数据传递给处理器,最终结束处理器的存储器读操作。

显然这种方式与Posted传送方式相比,PCI总线的利用率较低。因为只要HOST处理器没有收到来自目标设备的“回应”,那么HOST处理器到目标设备的传送路径上使用的所有PCI总线都将被阻塞。因而PCI总线x0和x1并没有被充分利用,因此PCI总线使用Delayed 传送方式解决这个总线拥塞问题。


PCI设备读写主存储器

PCI设备与存储器直接进行数据交换的过程也被称为DMA。与其他总线的DMA过程类似,PCI设备进行DMA操作时,需要获得数据传送的目的地址和传送大小。支持DMA传递的PCI设备可以在其BAR空间中设置两个寄存器,分别保存这个目标地址和传送大小。这两个寄存器也是PCI设备DMA控制器的组成部件。

值得注意的是,PCI设备进行DMA操作时,使用的目的地址是PCI总线域的物理地址,而不是存储器域的物理地址,因为PCI设备并不能识别存储器域的物理地址,而仅能识别PCI总线域的物理地址。

HOST 主桥负责完成PCI总线地址到存储器域地址的转换。HOST主桥需要进行合理设置,将存储器的地址空间映射到PCI总线之后,PCI设备才能对这段存储器空间进行DMA操作。PCI设备不能直接访问没有经过主桥映射的存储器空间。

许多处理器允许PCI设备访问所有存储器域地址空间(如ARM64处理器),但是有些处理器可以设置PCI设备所能访问的存储器域地址空间(如PowerPC),从而对存储器域地址空间进行保护。例如PowerPC处理器的HOST主桥可以使用Inbound 寄存器组,设置PCI设备访问的存储器地址范围和属性,只有在Inbound 寄存器组映射的存储器空间才能被PCI设备访问。

综上所述,在一个处理器系统中,并不是所有存储器空间都可以被PCI设备访问,只有在PCI总线域中有映像的存储器空间才能被PCI设备访问。经过HOST主桥映射的存储器,具有两个“地址”,一个是在存储器域的地址,一个是在PCI总线域的PCI总线地址。当处理器访问这段存储器空间时,使用存储器地址;而PCI设备访问这段内存时,使用PCI总线地址。在多数处理器系统中,存储器地址与PCI总线地址相同,但是系统程序员需要正确理解这两个地址的区别。

下面以PCI设备11向主存储器数据为例,说明PCI设备如何进行DMA写操作。

(1)首先PCI设备11将存储器写请求发向PCI总线x1,注意这个写请求使用的地址是PCI总线域的地址。

(2)PCI总线x1上的所有设备监听这个请求,因为PCI设备11是向处理器的存储器写数据,所以PCI总线x1上的PCI Agent 设备都不会接收这个数据请求。

(3)PCI桥x1发现当前总线事务使用的PCI总线地址不是其下游设备使用的PCI总线地址,则接收这个数据请求。此时PCI桥x1将结束来自PCI设备11的Posted存储器写请求,并将这个数据请求推到上游PCI总线上,即PCI总线x0上。

(4)PCI总线x0上的所有PCI设备包括HOST主桥将监听这个请求。PCI总线x0上的PCI Agent 设备也不会接收这个数据请求,此时这个数据请求将由HOST主桥x接收,并结束PCI桥x1的Posted存储器写请求。

(5)HOST主桥x发现这个数据请求发向存储器,则将来自PCI总线x0的PCI总线地址转换为存储器地址,之后通过存储器控制器将数据写入存储器,完成PCI设备的DMA写操作。

PCI设备进行DMA过程与DMA写过程较为类似。不过PCI总线的存储器读总线事务只能使用Non-Posted总线事务,其过程如下。

(1)首先PCI设备11将存储器读请求发向PCI总线x1。

(2)PCI总线x1上的所有设备监听这个请求,因为PCI设备11是从存储器中读取数据,所以PCI总线x1上的设备,如PCI设备12,不会接收这个数据请求。PCI桥x1发现下游PCI总线没有设备接收这个数据请求,则接收这个数据请求,并将这个数据请求推到上游PCI总线上,即PCI总线x0上。

(3)PCI总线x0上的设备将监听这个请求。PCI总线x0上的设备也不会接收这个数据请求,最后这个数据请求将由HOST主桥x接收。

(4)HOST主桥x发现这个数据请求是发向主存储器的,则将来自PCI总线x0的PCI总线地址转换为存储器地址,之后通过存储器控制器将数据读出,并转发到HOST主桥x。

(5)HOST主桥x将数据经由PCI桥x1传递到PCI设备11,PCI设备11接收到这个数据后结束DMA读。

以上过程仅是PCI设备向存储器读写数据的一个简单流程。如果考虑处理器中的Cache,这些存储器读写过程较为复杂。

PCI总线还允许PCI设备之间进行数据传递,PCI设备间的数据交换较为简单。在实际应用中,PCI设备间的数据交换并不常见。下面简要介绍PCI设备11将数据写入 PCI设备01的过程;请读者自行考虑PCI设备11从PCI设备01读取数据的过程。

(1)首先PCI设备11将PCI写总线事务发向PCI总线x1上。PCI桥x1和PCI设备12同时监听这个写总线事务。

(2)PCI桥x1将接收这个PCI写请求总线事务,并将这个PCI写总线事务上推到PCI总线x0。

(3)PCI总线x0上的所有设备将监听这个PCI写总线事务,最后由PCI设备01接收这个数据请求,并完成PCI写事务。


PCIe总线事务

先介绍下PCIe总线的三个主要层。

事务层:

事务层接收来自PCIe设备核心层的数据,并将其封装为TLP(Transaction Layer Packet) 后,发向数据链路层。事务层的一个重要工作是处理PCIe总线的“序”。

数据链路层:

数据链路层保证来自发送端事务层的报文可以可靠、完整地发送到接收端的数据链路层。来自事务层的报文TLP在通过数据链路层时,将被添加 Sequence Number 前缀和CRC后缀。数据链路层使用ACK/NAK协议保证报文的可靠传递。

PCle总线的数据链路层还定义了多种 DLLP(Data Link Layer Packet),DLLP产生于数 据链路层,终止于数据链路层。值得注意的是,TLP与DLLP并不相同,DLLP并不是由TLP加上Sequence Number前缀和CRC后缀组成的。

物理层

物理层是PCIe总线的最底层,将PCle 设备连接在一起。PCIe总线的物理电气特性决定了PCle链路只能使用端到端的连接方式。若要连接多个设备,需使用Switch扩展PCIe链路,使用方式如下图。

PCle总线的物理层为PCIe 设备间的数据通信提供传送介质,为数据传送提供可靠的物理环境。

物理层是PCIe体系结构最重要,也是最难以实现的组成部分。PCIe总线的物理层定义了LTSSM(Link Training and Status State Machine)状态机,PCle链路使用该状态机管理链路状态,并进行链路训练、链路恢复和电源管理。

PCIe总线的物理层还定义了一些专门的“序列”,有的书籍将物理层这些“序列”称为PLP(Physical Layer Packet),这些序列用于同步PCle链路,并进行链路管理。值得注意的是PCIe 设备发送PLP与发送TLP的过程有所不同。

PCIe包含的事务包括,存储器读写、I/O读写、配置读写、Message、原子操作等总线事务。PCIe的事务报文称为TLP。

PCIe中不同的事务采用不同的路由方式,继承了PCI的地址路由和ID路由方式,并添加了“隐式路由”方式。


TLP格式

TLP格式如下:

TLP Prefix:可选字段,可以有多个,在PCIe V2.1总线规范中引入,以扩展TLP Head;

TLP Head:是TLP最重要的标志,不同的TLP其TLP Head不同;

Data Payload:数据载荷,存放事务中的有效数据,可选字段,与TLP Head有关,最大4096Bytes;

TLP Digest:可选字段,与TLP Head有关;

TLP Head 格式

TLP头由3个或者4个双字(DW)组成。其中第一个双字中保存通用TLP头,其他字段与通用TLP头的Type字段相关。一个通用TLP头由Fmt、Type、TC、Length等字段组成, 如下图所示。

 Fmt 与 Type:确认当前TLP使用的具体总线事务。 

TC字段:表示当前TLP的传输类型,TC0 ~ TC7,与VC通路相关,不同VC通道仲裁优先级不同。不同TC的TLP可以选择同一个VC通道,同一个TC的TLP选定VC通道后不可修改。

Attr字段:由三位组成:

TH字段:表示当前TLP中是否含有TPH信息。

TD字段:表示TLP Digest是否有效。

EP字段:表示TLP Payload是否有效。

AT字段:与PCIe的地址转换相关,在支持IOMMU技术的处理器系统中,PCIe设备才能使用该字段。可以用作PCI总线域与存储器域之间的地址转换。

Length字段:描述Payload字段长度,范围1 ~ 1024DW,以DW为单位,其最小单位为1个DW,即载荷长度范围为4~4096,且必须为4的整数倍。若传送的单位小于1DW或不是DW边界对齐,则需要使用DW BE字段。


TLP 的路由

 TLP的路由是指TLP通过 Switch 或者PCle桥片时采用哪条路径,最终到达EP或者 RC的方法。PCle总线一共定义了三种路由方法,分别是基于地址(Address)的路由,基于ID的路由和隐式路由(Implicit)方式。

存储器 和 I/O读写 请求TLP使用基于地址的路由方式,这种方式使用TLP中的 Address字段进行路由选径,最终到达目的地。

而配置读写报文、“Vendor_Defined Messages”报文、Cpl和CplD报文使用基于ID的路由方式,这种方式使用PCI总线号(Bus Number)进行路由选径。在Switch或者多端口RC的虚拟PCI-to-PCI桥配置空间中,包含如何使用PCI总线号进行路由选径的信息。

而隐式路由方式主要用于Message报文的传递。在PCIe总线中定义了一系列消息报文,包括“INTx Interrupt Signaling”,“Power Management Messages”和“Error Signal Messages” 等报文。在这些报文中,除了“Vendor_Defined Messages”报文,其他所有消息报文都使用隐式路由方式,隐式路由方式是指从下游端口到上游端口进行数据传递的使用路由方式,或者用于RC向EP发出广播报文。


基于地址的路由

在系统软件进行枚举时,会将某一个桥管理的子树中所有设备的基地址及地址大小保存到该桥的配置空间的Limit 和 Base中。TLP报文经过该桥时,该桥根据TLP目标地址与自身配置空间的Limit和Base决定是否接收或转发。Switch原理类似,PCIe的Switch每个端口都是一个虚拟桥。

基于ID的路由

在PCIe总线中,基于ID的路由方式主要用于配置读写请求TLP、Cpl和CplD报文,此外Vendor_Defined 消息报文也可以使用这种基于ID的路由方式。而在PCI总线中,只有配置读写周期才使用ID进行数据传递。

基于ID的路由方式与基于地址的路由方式有较大的不同,基于ID路由方式的TLP头格式也与基于地址路由方式的头格式不同,其报文格式如图所示。

使用ID路由方式的TLP头,其Byte8~Byte11字段与基于地址路由的TLP不同。基于ID路由的TLP,使用 Bus Number、Device Number和Function Number进行路由寻址。

路由原理与基地地址的路由类似,在系统软件进行枚举时,会将某一个桥管理的子树中所有总线编号及上游总线编号存放到桥配置空间的Subordinate Bus Number、Secondary Bus Number、Primary Bus Number三个寄存器中。TLP报文经过该桥时,该桥根据TLP的Bus Number决定如何转发。在Switch内部有一条虚拟总线,此Switch的端口即为该虚拟总线的虚拟卡槽,Switch根据TLP的Device Number决定发送哪个端口。

隐式路由

在PCIe总线中,有许多消息是直接发向RC或者来自RC的广播报文,这些报文不使用地址或者ID进行路由,而是使用Msg和MsgD报文的Route(r2r1r0字段)字段进行路由,这种路由方式称为隐式路由。

 PCle 总线定义了一些用于中断请求、错误状态处理、锁定总线事务、热插拔信号处理和“Vendor_Defined Messages”消息报文。这些消息报文需要使用隐式路由方式进行传递。消息报文的Route字段的含义如下表所示。

 使用隐式路由方式的TLP,其Route字段为“000”,“011”,“100”或者“101”。当一个报文使用隐式路由向EP发送时,EP将对Route字段进行检查,如果这个报文是“来自RC的广播报文”,或者是“本地报文”,EP将接收此报文。

如果 Switch收到一条使用隐式路由的TLP时,将根据报文 Route字段的不同而分别处理。如果Switch的上游端口接收了一条来自RC的广播消息,则将该报文发向所有的下游端口;如果Switch接收了一条来自下游端口发向RC的消息报文时,Switch将此报文直接转发到上游端口,直至RC;如果Switch接收了一条使用隐式路由方式的本地消息报文,则Switch 接收并终结此报文,不再上传或下推。

如果RC收到一个使用隐式路由的TLP时,将根据报文Route字段而分别处理这些TLP。如果该 Route字段为0b000和0b101,RC将接收该TLP,并作相应的处理;如果为0b100,RC将接收该TLP,并结束该TLP报文的传递。


存储器读写请求TLP

 地址有两种,32位和64位。

Length:在读请求中,表示读的长度,单位DW。

DW BE:表示第一个或最后一个DW多少个字节有效。

Requester ID 和Tag:Requester ID 和Tag合称为Transaction ID,用于匹配Non-Posted请求与响应报文。如果一个设备一直没收到响应,则该Transaction ID不能被再次使用,直到一次数据传送结束。在同一个时间段内,PCI总线中的所有TLP的Transaction ID不能重复。

I/O读写请求TLP

I/O读写请求与存储器读写请求TLP的格式基本类似,只是I/O读写请求TLP只能使用32位地址模式和基于地址的路由方式,而且I/O读写请求TLP只能使用Non-Posted 方式进行传递。PCIe总线不建议PCIe设备支持I/O地址空间。


完成报文

PCle 总线支持Split传送方式,目标设备使用完成报文向源设备主动发送数据。完成报文使用ID路由方式,由TLP Predix、报文头和Data Payload组成,但是某些完成报文可以不含有Data Payload,如I/O或者配置写完成和Zero-Length读完成报文

1. Requester ID和Tag字段

完成报文使用ID路由方式,ID路由方式详见第6.2.2节。完成报文头的长度为3DW,完成报文头中包含 Transaction ID信息,由 Requester ID和Tag字段组成,这个ID必须与源 设备发送的数据请求报文的 Transaction ID对应,完成报文使用 Transaction ID进行ID路由, 并将数据发送给源设备。

当PCle设备收到存储器读、1/0读写或者配置读写请求TLP时,需要首先保存这些报文的Transaction ID,之后当该设备准备好完成报文后,将完成报文的Requester ID和Tag字 段赋值为之前保存的Transaction ID字段。

2.Completer ID字段

Completer ID字段的含义与Requester ID字段较为相似,只是该字段存放“发送完成报文”的PCle设备的ID号。PCle设备进行数据请求时需要在TLP字段中包含 Requester ID字段;而使用完成报文结束数据请求时,需要提供Completer ID字段。

3.Status 字段

Status字段保存当前完成报文的完成状态,表示当前TLP是正确地将数据传递给数据请求端;还是在数据传递过程中出现错误;或者要求数据请求方进行重试。PCle总线规定了几类完成状态,如下表所示。

4. Lower Address 字段

如果当前完成报文为存储器读完成TLP,该字段存放在存储器读完成TLP中第一个数据所对应地址的最低位。值得注意的是,在完成报文中,并不存在First DW BE和Last DW BE字段,因此接收端必须使用存储器读完成TLP的Low Address字段,识别一个TLP中包含数据的起始地址。


配置读写请求TLP

配置读写请求TLP由 RC发起,用来访问PCIe设备的配置空间。配置请求报文使用基于ID的路由方式。PCle总线也支持两种配置请求报文,分别为Type 00h和Type 01h配置请求。配置请求TLP的格式下如图所示。 

配置请求TLP的第4~7字节与存储器请求TLP类似。而第8~11字节的Bus、Device和Function Number中存放该TLP访问的目标设备的相应的号码,而Ext Register和 Reigister Number存放寄存器号。


消息请求TLP

在PCIe总线中,多数消息报文使用隐式路由方式,其格式如下图所示。其中 Byte 0字段为通用TLP头,而Byte4的第3字节中存放 Message Code字段。

PCIe总线规定了以下几类消息报文。

INTx中断消息报文(INTx Interrupt Signaling)。

电源管理消息报文(Power Management)。

错误消息报文(Error Signaling)。

锁定事务消息报文(Locked Transaction Support)。

插槽电源限制消息报文(Slot Power Limit Support)。

Vendor-Defined Messages。

 INTx中断消息报文

PCIe推荐使用MSI、MSI-X中断。

MSI最早在PCI规范中提出,但由于MSI在PCI中会占用总线带宽而几乎没人使用。

PCIe也支持PCI传统INTA~D#中断方式以支持系统中的PCI设备,称为Legacy中断方式,使用INTx中断消息报文来实现,PCIe桥负责INTx中断消息报文与INTx信号之间的转换。

在PCIe总线中,有8中INTx中断消息报文,如下,Routing_r=0b100表示本地消息,在接收端结束。assert与deassert模仿的是INTx信号的电平触发方式。

 错误消息报文

如果PCIe设备支持AER Capability结构,当PCle设备出现某种错误时,将向RC或者RC Event Collector发送错误消息报文,之后RC或者RC Event Collector将根据错误类型分别进行处理。但是绝大多数PCle设备并不支持AER机制

PCIe总线规范定义了两大类错误类型,分别是可恢复错误(Correctable Errors)和不可恢复错误(Uncorrectable Errors),不可恢复错误又细分为致命错误(Fatal)和非致命错误(Nonfatal)。当PCIe设备出现这些错误时,将使用ERR_COR、ERR_NONFATAL 和ERR_FATAL错误消息报文向RC或者RC Event Collector发送错误消息报文。

当PCIe设备出现某种错误后,首先将这些错误信息保留在设备的AER Capability结构中,之后RC或者RC Event Collector从PCIe设备发来的错误信息报文中获得相应的错误信息。为此在RC中设置了一个“Error Source Identification”寄存器保存究竟是哪个PCle设备发出的错误信息报文,之后RC或者RC Event Collector向处理器系统提交中断请求,由相应的中断服务例程统一处理所有PCIe设备的错误信息。


PCIe总线中的原子操作

1.FetchAdd 操作

相加后返回原始值,支持32bit与64bit的操作数,执行过程如下所示。

(1)PCle设备从TLP的指定PCI总线地址中获得原始数据。

(2)将原始数据与TLP中的操作数相加,并得到一个新的数据。相加的结果忽略进位与溢出位。

(3)将这个新的数据写入TLP指定的PCI总线地址中。

(4)使用完成报文返回指定PCI总线地址中的原始数据。

2.Swap 总线事务

赋值后返回原始值,支持32bit与64bit的操作数,执行过程如下所示。

(1)PCIe 设备从TLP指定的PCI总线地址中读取原始数据。

(2)将TLP中的操作数写人TLP指定的PCI总线地址。

(3)使用完成报文返回PCI总线地址中的原始数据。

3.CAS总线事务(Compare And Swap)

原始值与Compare比较,相等则用Swap赋值,最后返回原始值,支持32bit、64bit及128bit的操作数。执行过程如下所示。

(1)PCle设备从TLP指定的PCI总线地址中获得原始数据。

(2)将原始数据与“Compare”操作数进行比较。

(3)如果结果相等,则将“Swap”操作数写入TLP指定的位置。

(4)使用完成报文返回PCI总线地址中的原始数据。


PCIe总线的数据链路层

PCle总线的数据链路层处于事务层和物理层之间,主要功能是保证来自事务层的TLP在PCle链路中的正确传递,为此数据链路层定义了一系列数据链路层报文,即DLLP。数据链路层使用了容错和重传机制保证数据传送的完整性与一致性,此外数据链路层还需要对PCle链路进行管理与监控。数据链路层将从物理层中获得报文,并将其传递给事务层;同时接收事务层的报文,并将其转发到物理层。

与事务层不同,数据链路层主要处理端到端的数据传送。在事务层中,源设备与目标设备间的传送距离较长,设备之间可能经过若干级Switch;而在数据链路层中,源设备与目标设备在一条PCle链路的两端。因此本章在描述数据链路层时,将使用发送端接收端的概念,而不再使用源设备与目标设备。

物理层是PCle 总线的最底层,也是PCIe总线体系结构的核心。在物理层中涉及许多与差分信号传递有关的模拟电路知识。PCle总线的物理层由逻辑层和电气层组成,其中电气层更为重要。在PCle总线的物理层中,使用LTSSM状态机维护PCIe链路的正常运转,该状态机的迁移过程较为复杂。


数据链路层的组成结构

 

当PCle设备进行数据传递时,首先在事务层中产生TLP,然后通过事务层将这个TLP发送给数据链路层,数据链路层将这个TLP加上 Sequence 前缀和LCRC后缀后,首先将这个TLP放入到 Replay Buffer中,然后再发送到物理层。

目标设备(Device B)从物理层接收TLP时,将首先获得带前后缀的TLP,该TLP经过数据链路层传递给事务层时,将被去掉Sequence 前缀和 LCRC后缀。在数据链路层中,TLP的格式如下图所示。

 数据链路层使用ACK/NAK协议保证TLP的正确传送,来自事务层的TLP首先暂存在Replay Buffer中,源设备的数据链路层根据来自目标设备的ACK/NAK DLLP报文决定是重发这些TLP,还是清除保存在Replay Buffer 中的TLP。


数据链路层的状态

数据链路层需要通过物理层监控PCle链路的状态,并维护数据链路层的“控制与管理状态机”(Data Link Control and Management State Machine,DLCMSM)。DLCMSM状态机可以 从物理层获得以下与当前PCle链路相关的状态。

·DL_Inactive 状态。物理层通知数据链路层当前PCle链路不可用。在当前PCle链路的对端没有连接任何PCIe设备,或者没有检测到对端设备的存在时,数据链路层处于该状态。

·DL_Init状态。物理层通知数据链路层当前PCle链路可用,且物理层正处于链路初始化状态,此时数据链路层不能接收或者发送TLP和DLLP。此时PCle链路首先需要初始化VCO的流量控制机制,然后再对其他虚通路进行流量控制的初始化。

·DL_Active状态。当前PCle链路处于正常工作模式。此时物理层已完成PCle链路训练或者重训练。

DLCMSM状态机的迁移模型如图所示。

DLCMSM状态机除了可以使用上述状态位,从物理层获得当前PCle链路状态外,还可以使用以下状态位,向事务层通知数据链路层所处的状态。事务层通过这些状态位获知数据链路层所处的工作状态。

·DL_Down。数据链路层处于该状态时,表示在PCle链路的对端没有发现其他设备。当数据链路层处于DL_Inactive状态时,该状态位有效。值得注意的是DL_Down 有效时,并不意味着对端不存在物理设备。数据链路层仅是使用该状态位通知事务层,暂时没有从对端中发现PCle 设备,需要进一步检测。

·DL_Up。数据链路层处于该状态表示在PCle链路的对端连接了其他设备。当数据链路层处于DL_Active状态时,该状态位有效。


DLLP的格式

DLLP与TLP的概念并不相同,DLLP产生于数据链路层,终止于数据链路层,这些报文不会出现在事务层中,而且对系统软件透明。设置DLLP的目的是为了保证TLP的正确传送和管理PCle链路。

值得注意的是,DLLP并不是由TLP加上 Sequence 前缀和LCRC后缀组成的,而具有单独的格式。一个DLLP由6个字节组成,其中第1个字节存放DLLP的类型,第2~4个字节存放的数据与DLLP类型相关,而最后两个字节存放当前DLLP的CRC校验。DLLP的格式如图所示。

 

 大多数DLLP由PCle设备自动产生,而与事务层没有直接联系。PCle总线定义了以下几类DLLP报文,如下。

这些DLLP报文的描述如下。

·ACK DLLP。该DLLP由接收端发向发送端。接收端收到TLP报文后,将根据数据链路层的阈值设置,向对端设备发送ACK DLLP,而不是每接收到一个TLP,都向对端发送一个ACK DLLP。该DLLP表示接收端正确收到来自对端的TLP。

·NAK DLLP。该DLLP由接收端发向发送端。该DLLP表示接收端有哪些TLP没有被正确接收,发送端收到NAK DLLP后,将重传没有被正确接收的TLP,同时释放已经被正确接收的TLP。ACK和NAK DLLP与ACK/NAK协议相关,是数据链路层的两个重要DLLP。

·Power Management DLLPs。PCle 设备使用该组DLLP进行电源管理,并向对端设备通 知当前PCle链路的状态。PCle总线还定义了一组与电源管理相关的TLP,这些TLP与这组DLLPs有一定的联系,但是其作用并不相同。PCIe总线使用该组DLLP保证电源管理状态机的正确运行。

·Flow Control Packet DLLPs。该组 DLLP包括 InitFC1、InitFC2、UpdateFC DLLP,PCle 总线使用这些DLLPs进行流量控制。在PCle总线中,数据传送由三大类组成,分别为Posted、Non-Posted和Completion。这三种数据传送方式有些细微区别,PCle 设备 为这三种数据传送设置了不同的数据缓冲。流量控制是PCIe总线的一个重要特性,第9章将重点介绍这些内容。

·Vendor-specific DLLP。一些定制的DLLP,PCle总线规范并未对此约束。这些DLLP由 用户自定义使用。

ACK DLLPNAK DLLP有一个AckNak_Seq_Num字段,用于表示成功或失败的报文序号。

  • 6
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值