今天给大侠带来PCI-Express transaction Layer specification(处理层协议),本次PCIE TLP 学习经验分享分为三篇,今天带来第二篇,i/o,memory,configuration Configuration Request包 configuration request包采用ID寻址方式,包头(Tlp Header长度是3DW)。
今天给大侠带来PCI-Express transaction Layer specification(处理层协议),本次PCIE TLP 学习经验分享分为三篇,今天带来第三篇,也就是最后一篇,请求和应答处理机制 四、 请求和应答处理机制 处理机制就是对接收到的经Data Link Layer进行数据完整性验证的Tlp进行处理。无效的包将被抛弃,保留字(reserved)将被忽略。以下是处理流程: ? TC/VC映射 每个TLP包并不包含具体的VC信息,VC是由TC映射得到的。每个器件的TC/VC映射是不同的,TC0/VC0是固定的。 总的来说,流程控制是由数据交易层(Transaction Layer)搭配了数据链路层(Data Link Layer)来处理的,只是,处理层通常是针对接收到的TLP打包,生成TC,再由TC映射到VC。 为了确保数据端对端的可靠性在Transaction层的TLp Digest域还选择性的做一ECRC校验,ECRC的初值是FFFF FFFF,算法实现如下: ?
TLP的路由方式指的是TLP经过Switch或者PCIe桥片时采用哪条路径,最终到达EP或RC的方法。 PCIe总线继承了PCI总线的地址路由和ID路由方式,并新增了“隐式路由”方式。 存储器和IO读写操作请求TLP使用基于地址的路由方式,这种方式使用TLP中的Address字段进行路由选径,最终到达目的地。 基于地址的路由 在PCIe总线中,存储器读写和I/O读写TLP使用基于地址的路由方式。 当一个TLP进行数据传递时,可能会经过多级Switch,最终到达目的地。 如果RC接收到一个使用隐式路由的TLP时,将根据Route字段而分别处理这些TLP,如果该Route字段为3’b000 or 3’b101,RC将接收该TLP,并作相应的处理;如果为3’b100,RC将接收该报文 ,并结束该TLP报文的传递。
今天给大侠带来PCI-Express transaction Layer specification(处理层协议),本次PCIE TLP 学习经验分享分为三篇,今天带来第一篇TLP概况(四种空间、三种处理类型 、两种属性、主要包格式、TLP通用包头)和TLP打包地址和路由导向方式(Address寻址、ID寻址方式、处理层描述符),话不多说,上货。 TLP通用包头 二、TLP打包地址和路由导向方式 1. Address寻址 2. ID寻址方式 3. 每种类型的包都有一定格式的包头(Tlp Header),根据不同的包的特性,还包括有效数据负荷(Data Payload)和tlp开销块(Tlp Digest)。包头中的数据用于对包的管理和控制。 ID包括Bus number、Divce number、function number为TLP定位目标接收器。ID寻址的TLP包头长度也有4DW和3DW两种,ID在TLP中位置见下图。 ? ?
今天给大侠汇总一下PCI-Express transaction Layer specification(处理层协议)学习经验分享,本次PCIE TLP 学习经验分享分为三篇。 为了方便各位大侠浏览,下面列出三篇分享的大概内容目录介绍以及三篇文章的超链接: 一、TLP概况 1. 四种空间 2. 三种处理类型 3. 两种属性 4. 主要包格式 5. TLP通用包头 二、TLP打包地址和路由导向方式 1. Address寻址 2. ID寻址方式 3. Flow Control 六、Data Integrity数据完整性 PCI-E TLP(处理层协议)学习经验分享 I PCI-E TLP(处理层协议)学习经验分享 II PCI-E TLP(处理层协议
上一讲说道:“一个完整的TLP由1个或多个TLP Prefix、TLP头、Data Payload和TLP Digest构成”,那么本讲将就谈一谈TLP的头,具体几种事务(存储器读写、配置读写、IO读写 如果存储器读写 TLP 支持 64 位地址模式时,TLP 头长度为 4DW,否则为 3DW。 而完成报文的 TLP 头不含有地址信息,使用的 TLP 头长度为 3DW,其中 Byte4~Byte15 格式与 TLP 类型有关。 有时一个 PCIe 设备发出的 TLP,其目的地址并不相同,可能先进入发送队列的 TLP 在某种情况下无法发送,但这并不影响后续 TLP 的发送,因为这两个 TLP 的目的地址并不相同,发送条件也不相同 TH 位于 Byte1 的位 0,表示该 TLP 是否含有 TPH(TLP Processing Hint,TLP 处理信息提示)信息。
DLLP不是TLP加上前缀和后缀形成的。 一个完整的TLP由1个或多个TLP Prefix、TLP头、Data Payload和TLP Digest构成。 其中TLP头是TLP最重要的标志,不同类型的TLP头的定义并不相同,TLP头包含了当前TLP的总线事务类型、路由信息等一系列信息,在一个TLP中,Data Payload的长度可变,最小为0,最大为1024 TLP = 帧前缀 + 帧头 + 数据 + 摘要 帧前缀:TLP Prefix由PCIe V2.1 Spec总线规范引入,分为Local TLP Prefix和EP-EP TLP Prefix,主要目的是扩展 是一个可选项,一个TLP是否需要TLP Digest由TLP头决定。一般Digest段由IP核填充,所以PCIe的处理在用户层表现为处理层TLP中的头标和数据段。
) for { select { case <-tlp.ctx.Done(): return default: readString, = append(tlp.outputList, line) } }}// 命令执行的封装func (tlp *TgzLinuxPacker) exec(cmdStr string) error { // 方法退出时触发cancel方法的调用,通知readLog和shell子进程退出 defer tlp.cancel() c := exec.CommandContext(tlp.ctx = nil { return err } // read stdout stderr tlp.wg.Add(2) go tlp.readLog(stdout) go tlp.readLog = nil { return errors.New(strings.Join(tlp.outputList, "\n") + err.Error()) } if !
发送方的重传缓存保存着每个被发送的 TLP 的副本,直到对端确认成功收到了这个 TLP。 当发送方收到这个 Ack DLLP,它将会把里面序列号所对应的 TLP、以及这个 TLP 之前的所有 TLP,都从重传缓存内清除。 如果接收方检测到了一个 TLP 错误,它将会把这个 TLP 丢弃,并向发送方返回一个 Nak DLLP,以期望发送方能对未确认成功接收的 TLP 进行重传,并通过重传获得一个完好的 TLP。 完成方的数据链路层将对接收到的 TLP 进行 LCRC 错误校验,并检查 TLP 序列号以确定是否存在 TLP 丢失或 TLP 失序。 和之前一样,数据链路层对 CplD TLP 进行 LCRC 校验,并检查序列号以确定是否存在 TLP 丢失或出现 TLP 失序。
存储器、I/O和配置读写请求TLP 本篇讲述PCIe总线定义的各类TLP,并详细介绍这些TLP的格式。在这些TLP中,有些格式对于初学者来说较难理解。 存储器写请求TLP原子操作请求和完成报文I/O读写请求TLP和读写完成TLP配置读写请求TLP和配置读写完成TLP消息报文 与PCI总线相比,PCIe总线增加了消息请求事务。 存储器读写请求TLP 存储器读写请求TLP的格式如图5-8所示。 ? 在PCIe总线中,存储器写请求TLP使用Posted数据传送方式。 4 I/O读写请求TLP的规则 I/O读写请求与存储器读写请求TLP的格式基本类似,只是I/O读写请求TLP只能使用32位地址模式和基于地址的路由方式,而且I/O读写请求TLP只能使用Non-Posted 配置请求TLP的格式如图5-12所示。 ? 配置请求TLP的第4~7字节与存储器请求TLP类似。
TLP的路由 TLP的路由是指TLP通过Switch或者PCIe桥片时采用哪条路径,最终到达EP或者RC的方法。 1 TLP1的传送过程 当TLP1从RC发向EP1时,这个TLP1为I/O或者存储器报文,其中TLP1目的地址在EP1的BAR空间中。当处理器访问EP的BAR空间时,需要使用该类TLP。 TLP,否则不接收该TLP。 3 TLP3的传送过程 TLP3的传递方式与TLP2的传递方式有些类似,当TLP3传递到PCI Bus1时,P-P2桥片将接收TLP3,并将TLP3传递到PCI Bus2上的EP1中。 如果TLP的PCI Bus Number为2时,P-P2桥片将接收该TLP,并将该Type 01h类型TLP转换为Type 00h类型的TLP,然后发送给EP1,并由EP1处理该TLP。
= new TableLayoutPanel(); tlp.RowCount = 3; tlp.ColumnCount = 0; tlp.Dock = System.Windows.Forms.DockStyle.Fill; tlp.RowStyles.Add(new System.Windows.Forms.RowStyle ; tlp.Padding = new Padding(2, 5, 2, 2); // 标题 frmTitle = new Label (frmTitle); tlp.Controls.Add(tlpMessagePanel); tlp.Controls.Add(flpButtons); newMessageBox.Controls.Add(tlp); }
一个完整的TLP由1个或者多个TLP Prefix、TLP头、Data Payload(数据有效负载)和TLP Digest组成。TLP头是TLP最重要的标志,不同的TLP其头的定义并不相同。 TLP Digest是一个可选项, 一个TLP是否需要TLP Digest由TLP头决定。 TLP Prefix由PCIe V2.1总线规范引入,分为Local TLP Prefix和EP-EP TLP Prefix两类。 如果存储器读写TLP支持64位地址模式时,TLP头的长度为4DW,否则为3DW。而完成报文的TLP头不含有地址信息,使用的TLP头长度为3DW。 EP或者RC通过调整其发出TLP的TC字段,可以调整TLP使用的VC,从而调整TLP的优先级。
图1.1 3DW_TLP包 ? 数据链路层:在接收来自事务层的TLP时候,会给其分配一个序列号,并且计算该TLP的链路CRC(包含序列号),然后将TLP传送到物理层。 1.2.2 TLP头的格式 ? 上图中标准的TLP包中包含TLP头、TLP数据(DATA)和TLP Digest(摘要)。R表示reserved,保留。 在使用强序模型时,在数据的整个传送路径中,PCIe设备在处理相同类型的TLP时,如PCIe设备发送两个存储器写TLP时,后面的写TLP必须等待前一个存储器写TLP完成后才能被处理,几遍当前报文在传输过程中阻塞 但是对于不同类型的TLP间可以乱序通过同一条PCIe链路。 在使用Realaxed Ordering模型时,后一个写TLP可以越过前一个存储器写TLP提前执行,从而能提高PCIe总线利用率。
1)、ACK/NAK接收逻辑 2)、Replay Buffer 3)、TLP发送逻辑 在数据链路层中,TLP的格式: {Sequence , TLP Header , TLP Datapayload , TLP Digest , LCRC} 其中,Sequence为前缀,存放当前TLP的序列号;LCRC为当前TLP的CRC校验和。 2、 NAK DLLP:由数据接收方发送给数据发送方,该DLLP表示哪些TLP没有被正确接收,在接收到该TLP时,接收方“Replay Buffer”加释放已经被正确接收的TLP。 4.5 发送端如何使用ACK/NAK协议 数据链路层在发送TLP之前,首先要给这个TLP添加一个Sequence前缀和LCRC后缀,之后再将TLP放入“Replay Buffer”中。 4.6 接收端如何使用ACK/NAK协议 接收端首先从物理层获得TLP,此时这个TLP中包含Sequence前缀和LCRC后缀,接收端收到这个TLP后,首先将这个报文放入receive buffer中,
图1.1 3DW_TLP包 ? 数据链路层:在接收来自事务层的TLP时候,会给其分配一个序列号,并且计算该TLP的链路CRC(包含序列号),然后将TLP传送到物理层。 1.2.2 TLP头的格式 ? 上图中标准的TLP包中包含TLP头、TLP数据(DATA)和TLP Digest(摘要)。R表示reserved,保留。 在使用强序模型时,在数据的整个传送路径中,PCIe设备在处理相同类型的TLP时,如PCIe设备发送两个存储器写TLP时,后面的写TLP必须等待前一个存储器写TLP完成后才能被处理,几遍当前报文在传输过程中阻塞 但是对于不同类型的TLP间可以乱序通过同一条PCIe链路。 在使用Realaxed Ordering模型时,后一个写TLP可以越过前一个存储器写TLP提前执行,从而能提高PCIe总线利用率。
Root Complex通常会生成具有适当MMIO位置地址的存储器读TLP包和字节使能。Endpoint在收到“内存读取” TLP后会生成“数据TLP完成包”。 TLP包的结构可见PCIe的事务处包(TLP)的组成,则在数据手册PG054上也是详细描述的。 type决定了TLP包的类型: ? TLP包,还有存储器写TLP包, PIO_RX_MEM_WR32_FMT_TYPE : begin tlp_type 另一个就是指定下一个状态:PIO_RX_MEM_WR32_DW1DW2; 上面已经列举了读存储器TLP以及写存储器TLP,且都是3DW情况。
Apache CarbonData (TLP) 。Apache Eagle (TLP) 。Apache HAWQ (TLP) 。Apache Kylin (TLP) 。 Apache RocketMQ (TLP) 。Apache ServiceComb (TLP) Incubating: 。Apache Doris (原 Palo) 。Apache Dubbo 。
TLP中与数据负载相关的参数 在PCIe总线中,有些TLP含有Data Payload,如存储器写请求、存储器读完成TLP等。 当PCIe设备接收TLP时,该TLP的最大有效负载也不能超过Max_Payload_Size参数,如果接收的TLP,其Length字段超过Max_Payload_Size参数,该PCIe设备将认为该TLP RC或者EP在发送存储器读完成TLP时,这个存储器读完成TLP的最大Payload也不能超过Max_Payload_Size参数,如果超过该参数,PCIe设备需要发送多个读完成报文。 当一个EP向RC或者其他EP读取数据时,这个EP首先向RC或者其他EP发送存储器读请求TLP;之后由RC或者其他EP发送存储器读完成TLP,将数据传递给这个EP。 TLP完成数据传递。
本将着重讲述TLP的存储器、配置、IO读写请求和原子操作、消息报文几种操作请求,其中主要从其结构和特点进行分析。 存储器读写请求TLP 存储器读请求:non-posted类型读请求,主设备接收到目标设备返回的读完成TLP后,一次存储器读请求完成。 存储器写请求:posted类型事务,主设备(RC、EP)发出存储器写请求TLP给存储器。 ? 使用zero-length,该请求时length为1,Fisrt Data Be和Last Data BE为全0,此时表示这个存储器读请求TLP对应的读完成TLP中不包含任何有效数据。 TLP对应的所有报文。