PCIe总线-事物层之TLP请求和完成报文格式介绍(六)

1.概述

TLP报文按照类型,可以大致分为4中类型,分别是IO请求报文、存储器请求报文、配置请求报文、完成报文和消息请求报文。IO请求报文可分为IO读请求(不携带数据)和IO写请求(携带数据)。存储器请求报文可分为存储器读请求(不携带数据)、带锁的存储器读请求(不携带数据)和存储器写请求(携带数据)。配置请求报文可分为配置0读请求(不携带数据)、配置0写请求(携带数据)、配置1读请求(不携带数据)和配置1写请求(携带数据)。完成报文可分为携带数据(带锁和不带锁)、不携带数据(带锁和不带锁)。消息请求可分为携带数据和不携带数据两种类型。

2.IO Requests

在早期的PCI总线中,CPU访问PCI设备的IO地址空间,使用IO请求,而在较新的PCIe总线中,CPU使用memory map方式访问PCIe设备的IO地址空间,很少使用IO请求。为了保持对PCI总线的兼容性,PCIe总线中也保留了IO请求。IO请求可以访问16位和32位IO地址空间,具体位宽根据设备的BAR确定。IO请求TLP报文的格式如下图所示。

IO请求

位域意义
FmtIO请求报文格式。000b = IO Read(3DW without data),010b = IO Write(3DW with data)
TypeIO请求报文类型(00010b)
TCIO请求通常为0,确保IO请求报文不干扰任何高优先级的报文
Attr不适用于IO请求,保持为0
TH不适用于IO请求,保持为0
AT不适用于IO请求,保持为0
LengthIO请求的数据长度最大为1DW,所以设置为1
Requester ID发出IO请求Function的BDF
Tag确保一段时间内同一个Function发出的IO请求不重复,通常使用低5位,若使用扩展tag和PF选项,可以扩展到11位,最大允许2048个IO请求不重复
Last DW BEIO请求的数据长度最大为1DW,所以为0
1st DW BE确认1DW数据负载中的有效位,可能同时为0
AddressIO请求读写的地址,低2位为0,地址按DW对齐

3.Memory Requests

存储器请求有3DW和4DW两种报文类型,3DW对应32位地址,4DW对应64位地址。需要注意的是,若存储器请求及其完成报文携带数据,则不能越过4KB地址边界。具体的报文格式如下图所示。

存储器请求

存储器请求的位域意义如下表所示,没有列出的参考TLP通用格式章节。

位域意义
Fmt存储器请求报文格式。000b = Memory Read (3DW w/o data),010b = Memory Write (3DW w/ data),001b = Memory Read (4DW w/o data),011b = Memory Write (4DW w/ data),1xxb = TLP Prefix
Type存储器请求报文类型,00000b = Memory Read or Write,00001b = Memory Read Locked
Address [63:32]存储器请求使用64位地址时,保存高32位地址
Address [31:2]32位地址,低2位为0,地址按DW对齐

4.Configuration Requests

配置请求分为Type0和Type1类型。Type0配置请求可以直接访问PCIe设备。Type1配置请求不能直接访问PCIe设备,需要至少穿越一个PCIe桥,当访问的PCIe设备没有与PCIe桥直接相连时,PCIe桥会直接向下转发Type1配置请求,当访问的PCIe设备与PCIe桥直接相连时,则PCIe桥会将Type1配置请求转换成Type0配置请求,然后转发给PCIe设备。通常情况下,CPU若访问与Host桥相连的PCIe桥或者设备,则发出Type0配置请求,否则需要发出Type1配置请求。配置请求TLP报文格式如下图所示。

配置请求

位域意义
Fmt配置请求报文格式。000b = configuration read (no data),010b = configuration write (with data)
Type配置请求报文类型,00100b = Type 0 Config Request,00101b = Type 1 Config Request
TC配置请求通常为0,确保配置请求报文不干扰任何高优先级的报文
Attr不适用于配置请求,保持为0
TH不适用于配置请求,保持为0
AT不适用于配置请求,保持为0
Length配置请求的数据长度最大为1DW,所以设置为1
Requester ID发出配置请求Function的BDF
Tag确保一段时间内同一个Function发出的配置请求不重复,通常使用低5位,若使用扩展tag,可以扩展到8位,最大允许256个配置请求不重复
Last DW BE配置请求的数据长度最大为1DW,所以为0
1st DW BE确认1DW数据负载中的有效位,可能同时为0
Completer ID配置请求访问目标设备的BDF
Ext Register Number配置空间扩展寄存器地址。用于访问PCIe扩展的配置空间。访问配置空间的前256字节,则位0。和Register Number一起组成10位地址,可以访问PCIe扩展的4KB地址空间
Register Number配置空间寄存器地址。用于访问配置空间的前256字节,和Ext Register Number一起组成10位地址,可以访问PCIe扩展的4KB地址空间

5.Completions

完成报文用于响应non‐posted请求,non‐posted请求包括IO读请求、配置读请求和存储器读请求。完成报文可以携带数据也可以不携带数据,Zero-Length读完成报文不携带数据,携带数据的完成报文的数据最大长度不超过MPS,在x86和PowrPC处理器中,一般不超过RCB。完成报文的许多位域和对应的请求报文相同,如TC、Attr、Requester ID和tag,完成报文使用Requester ID路由到发送请求的设备。完成报文TLP格式如下图所示。正常情况下,Completer ID对于发送请求的设备没有意义,但对于完成报文发生错误时,可以通过Completer ID定位发生错误的设备。

完成报文

位域意义
Fmt完成报文格式。000b = Completion without data (Cpl),010b = Completion with data (CplD)
Type完成报文类型(01010b)
TC和请求报文相同
Attr和请求报文相同
TH不适用于完成报文,保持为0
AT不适用于配置请求,保持为0
Length完成报文携带的数据长度,按DW对齐,若真实数据长度没有按DW对齐,则需要借助Lower Address和Byte Count字段描述第一个DW和最后一个DW的有效字节
Completer ID完成报文状态。000b = Successful Completion (SC),001b = Unsupported Request (UR),010b = Config Req Retry Status (CRS),100b = Completer abort (CA),其他保留
Compl. Status(Completion Status Code)完成报文Function的BDF
BCM(Byte Count Modified)用于PCI-X总线发送完成报文的设备,对于PCIe总线无意义
Byte Count一个请求可能需要多个完成报文响应,该字段记录源设备还需要从目标设备接收多少字节数据才能完成全部数据据传输,而且包含当前完成报文携带的数据。若多个完成报文中有一个完成报文的状态不是SC,则终止此次请求。IO和配置请求只需要一个完成报文。0x0表示4096字节,0x1表示1字节,0xFFF表示4095字节
Requester ID和请求Function的BDF相同
Tag和请求Function的tag相同,用来匹配发送的请求,Requester ID和Tag组成的Transaction ID必须和源设备的Transaction ID相同
Lower Address第一读请求完成报文携带数据的起始地址的低7位。当真实数据没有按DW对齐时,需要和Byte Count字段一起用于描述第一个DW和最后一个DW的有效字节(完成报文中没有First DW BE和Last DW BE字段)

读请求返回的数据遵循下面的规则:

  1. 一个读请求可能需要多个完成报文响应,所有完成报文传输的数据长度等于读请求的数据长度。
  2. 一个明确的完成报文只能响应一个读请求。
  3. IO和配置读请求数据长度为1DW,因此只有一个完成报文。
  4. 若完成报文的完成状态不是SC,则会终止此次事务。
  5. 若一个读请求需要多个完成报文响应,则完成报文读取的数据地址必须按RCB对齐。RC的RCB为64字节或者128字节,由硬件设置,软件可以通过配置空间读取。
  6. 若一个读请求需要多个完成报文响应,则完成报文读取的数据地址依次增大。

完成报文的接收处理规则:

  1. 若接收方接收到一个没有匹配到读请求的完成报文,则视为非预期的完成报文,当作错误处理。
  2. 若接收方收到的完成报文的完成状态不是SC和CRS时,则作为错误处理,与之相关的读请求缓冲区将被释放。
  3. RC在发出配置请求之后,若收到的完成报文的完成状态是CRS时,则此次配置请求终止。后续的行为由硬件的实现决定,若RC支持处理这种情况,则会在其寄存器定义处理CRS的策略,软件可以读取和设置。处理CRS的策略有以下几种情况:
  4. 若软件不能获取CRS状态,则RC会重发该配置读请求,重发的次数由实现决定。
  5. 若软件能获取CRS状态,则当RC发出PCI_VENDOR_ID配置读请求之后,若收到的完成报文是CRS状态,则RC会将VENDOR_ID的值设置为0x0001,然后返回给软件,软件读到该状态,通常会等待一段时间,再发起PCI_VENDOR_ID读请求。PCI‐SIG保留了VENDOR_ID=0x0001值。对于其他配置读写请求,RC会自动的重发该请求。
  6. CRS状态用于响应配置请求,对于其他类型请求,将视为有缺陷的TLP报文处理。
  7. 若完成报文状态为reserved时,处理行为和完成报文状态为UR时一致。
  8. 若一个读请求需要多个完成报文响应,若有一个完成报文的完成状态不是SC,则此次事务结束,对于错误之前接收到的数据,由实现决定。

6.Message Requests

消息请求通常是直接发向RC或者来自RC的广播报文,其取代了在PCI和PCI-X总线中使用的中断、错误和电源管理边带信号。消息请求类似于posted存储器写请求,无需完成报文响应,但不同的是posted存储器写请求基于地址路由,而消息请求基于地址路由、ID路由和隐式路由,具体的路由方式和消息请求类型有关系。消息请求使用4DW格式,如下图所示。

消息请求

位域意义
Fmt数据包格式。001b = Message Request without data,011b = Message Request with data
Type数据包类型。Bit[4:3]固定为10b,表示消息请求。Bit[2:0]表示消息路由方式。000b = Implicitly Routed to RC (Root Complex),001b = Routed by address,010b = Routed by ID,011b = Implicitly Broadcast from RC,100b = Local‐Terminate at Receiver,101b = Gather & route to RC,0thers = Reserved, treated as Local
TC不适用于消息请求,默认为0
Attr[2]TLP是否使用ID‐based Ordering
TH保留
Attr[1:0]保留
AT不适用于配置请求,保持为0
Length对于消息请求,没有数据保留,默认为0,有数据为1,消息请求最多携带1DW数据
Message Code消息编码。0000 0000b = Unlock Message(Locked Transaction Support),0001 0000b = Latency Tolerance Reporting(LTR),0001 0010b = Optimized Buffer Flush/Fill(OBFF),0001 xxxxb = Power Management Message,0010 0xxxb = INTx Message,0011 00xxb = Error Message,0100 xxxxb = Ignored Messages (related to Hot‐Plug support in spec revision 1.1),0101 0000b = Set Slot Power Message,0111 111xb = Vendor‐Defined Messages。详细信息参考PCIe5.0 Spec Table F-1 Message Code Usage表格
Byte8-11如果使用地址路由,则为64位地址的高32位。如果使用ID路由,Bytes8和Bytes9为target ID,即目标设备的BDF。其他路由方式不使用
Byte12-15如果使用地址路由,则为64位地址的低32位。其他路由方式不使用

下面只介绍INTx消息、电源管理消息和错误消息,其他参考PCIe Spec。

6.1.INTx Interrupt Messages

PCIe总线使用MSI或MSI-X中断机制,但为了兼容PCI总线,保留了传统的INTx中断。传统的INTx中断有4根中断信号线连接中断控制器,使用电平触发中断,有Assert和Deassert过程,而PCIe总线没有中断信号线,只能使用数据包模拟中断,而数据包模拟中断类似于边沿触发中断。因此PCIe总线使用两个消息请求模拟INTx中断,第一个消息Assert中断,第二个消息Deassert中断。

INTx MessageMessage CodeRouting(Type[2:0])
Assert_INTA0010 0000b100b = Local‐Terminate at Receiver
Assert_INTB0010 0001b100b = Local‐Terminate at Receiver
Assert_INTC0010 0010b100b = Local‐Terminate at Receiver
Assert_INTD0010 0011b100b = Local‐Terminate at Receiver
Deassert_INTA0010 0000b100b = Local‐Terminate at Receiver
Deassert_INTB0010 0001b100b = Local‐Terminate at Receiver
Deassert_INTC0010 0010b100b = Local‐Terminate at Receiver
Deassert_INTD0010 0011b100b = Local‐Terminate at Receiver

使用INTx消息的规则:

  1. INTx消息没有数据负载,Length保留,默认为0。
  2. INTx消息由上行口发送。对于接收到的数据包检查这一规则是可选的,如果检测,不符合规范的INTx消息会被视为错误的TLP报文。
  3. INTx消息默认使用传输类型TC0,接收端必须检查该字段,若违反该规则,则会被视为错误的TLP报文。
  4. 连接链路两端的设备必须跟踪四个INTx中断的当前状态。如果某个中断的逻辑状态在上行端口处发生变化,则必须发送相应的INTx消息。
  5. 当Command寄存器中的中断禁止位被设置为1时,INTx中断将被关闭。
  6. 设备产生中断后,上行端口将发送INTx消息,若设备的中断此时被禁止,则上行端口将发送Deassert_INTx消息。
  7. Switch必须独立的跟踪每个下行口的四个INTx中断状态,并将这些状态合并到上行口。
  8. RC必须独立跟踪四个INTx中断状态,并以特定于实现的方式将它们转换成系统中断。
  9. INTx消息的路由类型为Local‐Terminate at Receiver,这允许Switch在需要的时候重新映射中断。

6.2.Power Management Messages

PCIe总线兼容PCI总线的电源管理规范,并添加了基于硬件的链路层电源管理。电源管理消息用于传递电源管理信息。

Power Management MessageMessage CodeRouting(Type[2:0])
PM_Active_State_Nak0001 0100b100b = Local‐Terminate at Receiver
PM_PME0001 1000b000b - Implicitly Routed to RC
PM_Turn_Off0001 1001b011b - Implicitly Broadcast from RC
PME_TO_Ack0001 1011b101b - Gather & route to RC

使用电源管理消息的规则:

  1. 电源管理消息没有数据负载,Length保留,默认为0。
  2. 电源管理消息默认使用传输类型TC0,接收端必须检查该字段,若违反该规则,则会被视为错误的TLP报文。
  3. 当下行端口收到链路对端设备将链路电源状态切换到L1的请求时,但下行端口不允许切换时,将发送PM_Active_State_Nak消息报文。
  4. 当设备请求电源管理事件时,其上行端口将会发送PM_PME消息报文。
  5. PM_Turn_Off消息会发送到下游的所有EP。
  6. PM_Turn_Off消息由EP发送到上游,对于有多个下行端口的Swtich,需要等待所有下行端口收到PM_Turn_Off消息后才会转发到上游。

6.3.Error Messages

当PCIe设备检测到错误时,会向其上游发送错误消息。错误消息使用隐式路由,最终会到达RC。软件可以通过错误消息TLP的Requester ID确定发生错误的设备。

Error MessageMessage CodeRouting(Type[2:0])
ERR_COR (Correctable)0011 0000b000b - Implicitly Routed to RC
ERR_NONFATAL (Uncorrectable, Non‐fatal)0011 0001b000b - Implicitly Routed to RC
ERR_FATAL (Uncorrectable, Fatal)0011 0011b000b - Implicitly Routed to RC

使用错误消息的规则:

  1. 错误消息没有数据负载,Length保留,默认为0。
  2. 错误消息默认使用传输类型TC0,接收端必须检查该字段,若违反该规则,则会被视为错误的TLP报文。
  3. RC会将错误消息转换为系统特定的事件,以通知软件处理。

参考资料

  1. PCIEXPRESS体系结构导读
  2. PCI Express technology 3.0
  3. PCI Express® Base Specification Revision 5.0 Version 1.0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/646167.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第 33 次CCF认证

1. 词频统计 题目描述 样例输入 代码 #include <bits/stdc.h>using namespace std;int main() {int n,m;cin>>n>>m;vector<int> ans1(m,0),ans2(m,0);while (n --) {int t;cin>>t;vector<int> vis(m1,0);for (int i 1;i < t;i ) {i…

【Qt】深入探索Qt窗口与对话框:从创建到管理:QDockWidget(浮动窗口)、QDialog(对话框)

文章目录 前言&#xff1a;1. 浮动窗口2. 对话框介绍2.1. 示例&#xff1a;主窗口中&#xff0c;通过点击按钮&#xff0c;弹出一个新的对话框。2.2. 创建自定义对话框2.2.1. 纯代码的方式2.2.2. 图形化界面的方式 3. 模态对话框 和 非模态对话框4. Qt 内置对话框4.1. 消息对话…

创新实训2024.05.26日志:落地基于硬盘的数据库服务

1. 需求任务列表 以下描述易学大模型软件的web应用的功能。 用户注册 用户邮箱&#xff0c;密码&#xff0c;验证码开启官方邮箱&#xff0c;用来发验证码&#xff08;QQ 网易都支持开启smtp协议&#xff0c;找教程&#xff0c;用邮箱不用手机号是为了省买发短信云服务的钱&a…

【软件设计师】先导

一、考试科目&#xff1a; 上午&#xff1a;计算机与软件工程知识&#xff0c;考试时间150min&#xff0c;75空单选题&#xff08;不一定一题一空&#xff09; 下午&#xff1a;软件设计&#xff0c;考试时间150分钟&#xff0c;问答题&#xff0c;6道只做5大题&#xff08;前四…

Nginx 的原理解析 worker 配置及相关问题 -细节狂魔

文章目录 前言Nginx 的最基本的执行过程&#xff08;master & worker&#xff09;worker 是如何进行工作的 一个 master 和 多个 woker 有哪些好处1、可以使用 nginx 热部署2、节省资源 && worker 进程之间互不影响 && nginx 服务不会中断 woker 设置多少才…

简单美观易上手的 Docker Compose 可视化管理器 Dockge

本文首发于只抄博客&#xff0c;欢迎点击原文链接了解更多内容。 前言 Dockge 是 Uptime Kuma 作者的新作品&#xff0c;因此 UI 风格与 Uptime Kuma 基本一致&#xff0c;如果你正在使用 Uptime Kuma 的话&#xff0c;那么 Dockge 的 UI 设计应该也不会让你失望。Dockge 主打…

java人口老龄化社区服务与管理平台源码(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的人口老龄化社区服务与管理平台。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 人口老龄化…

MySql基础(一)--最详细基础入门,看完就懂啦(辛苦整理,想要宝宝的赞和关注嘻嘻)

前言 希望你向太阳一样&#xff0c;有起有落&#xff0c;不失光彩~ 一、数据库概述 1. 什么是数据库 数据库就是存储数据的仓库&#xff0c;其本质是一个文件系统&#xff0c;数据按照特定的格式将数据存储起来&#xff0c;用户可以对数据库中的数据进行增加&#xff0c;修改&…

Spring中的Aware接口

Spring中的Aware接口 Aware接口介绍 Aware是Spring中的接口&#xff0c;它的作用是可以让Bean获取到运行环境的相关信息。比如获取到上下文、Bean在容器中的名称等。 Spring中提供了很多Aware接口的子类&#xff0c;具体如下&#xff1a; 常用接口的作用如下&#xff1a; …

制作电子画册速成攻略,快来试试

​当今社会&#xff0c;数字媒体日益普及&#xff0c;电子画册作为一种崭新的展示方式&#xff0c;受到了越来越多人的青睐。它不仅形式新颖&#xff0c;互动性强&#xff0c;而且制作起来也并不复杂。想知道如何快速掌握制作电子画册的技巧吗&#xff1f;我来教你吧。 接下来&…

YOLO 学习和使用 (重拾机器学习)

contents a nenrons 单层神经网络 多层神经网络 CNN (Convolutional Neural Network) YOLO 5.1. YOLO(you only look once) 5.2. predict stage: 置信度 * 类别条件概率 全概率非极大值抑制&#xff0c;通过IOU 指数进行实现每个 grid cell 生成两个预测 bounding box 无…

呆马科技----构建智能可信的踏勘云平台

近年来&#xff0c;随着信息技术的快速发展&#xff0c;各个行业都在积极探索信息化的路径&#xff0c;以提升工作效率和服务质量。智慧踏勘云平台是基于区块链和大数据技术构建的全流程智慧可信踏勘解决平台。平台集远程视频、数据显示、工作调度、过程记录为一体&#xff0c;…

【图解IO与Netty系列】IO多路复用

IO多路复用 为什么要使用IO多路复用Linux的IO多路复用接口selectpollepoll 为什么要使用IO多路复用 我们常用的IO模型是BIO&#xff0c;我们Java里的IO流大多数都是BIO&#xff0c;也就是同步阻塞式IO&#xff0c;这种IO操作的好处是简单方便&#xff0c;但是缺点也很明显——…

【雷丰阳-谷粒商城 】【分布式基础篇-全栈开发篇】【00】补充

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式基础篇-全栈开发篇】【00】补充 WindowsCMD插件IDEAVsCode MavenvagrantDocker解决MySQL连接慢问题启动&#xff08;自动&#xff09;Docker注意切换到root用户远程访问MySQL MyBatisPlus代码地址参考 WindowsC…

vs2013使用qt Linguist以及tr不生效问题

一、qt Linguist&#xff08;语言家&#xff09;步骤流程 1、创建翻译文件,在qt选项中 2.选择对应所需的语言&#xff0c;得到.ts后缀的翻译文件 3.创建.pro文件&#xff0c;并将.ts配置在.pro文件中 3.使用qt Linguist 打开创建好的以.ts为后缀的翻译文件&#xff0c;按图所示…

YOLOv10 | 手把手教你利用yolov10训练自己数据集(含环境搭建 + 参数解析 + 数据集查找 + 模型训练、推理、导出)

一、前言 本文内含YOLOv10网络结构图 各个创新模块手撕结构图 训练教程 推理教程 参数解析 环境搭建 数据集获取等一些有关YOLOv10的内容&#xff01; 目录 一、 前言 二、整体网络结构图 三、空间-通道分离下采样 3.1 SCDown介绍 3.2 C2fUIB介绍 3.3 PSA介绍 …

Java核心: 脚本引擎和动态编译

静态语言和动态语言的在相互吸收对方的优秀特性&#xff0c;取人之长补己之短。脚本引擎和动态编译就是其中一个关键特性&#xff0c;扩展了Java的能力边界。这一篇我们主要讲两个东西: ScriptEngine&#xff0c;执行脚本语言代码&#xff0c;如JavaScript、Groovy JavaCompile…

P459 包装类Wrapper

包装类的分类 1&#xff09;针对八种基本数据类型相应的引用类型——包装类。 2&#xff09;有了类的特点&#xff0c;就可以调用类中的方法。 Boolean包装类 Character包装类 其余六种Number类型的包装类 包装类和基本数据类型的相互转换 public class Integer01 {publi…

关于数据库和数据表的基础SQL

目录 一. 数据库的基础SQL 1. 创建数据库 2. 查看当前有哪些数据库 3. 选中数据库 4. 删除数据库 5. 小结 二. 数据表的基础SQL 1. 创建数据表 2. 查看当前数据库中有哪些表 3. 查看指定表的详细情况(查看表的结构) 4. 删除表 5. 小结 一. 数据库的基础SQL 1. 创建…

Redis篇 redis基本命令和定时器原理

基本命令和定时器原理 一. exists命令二. del命令三. Expire命令四. ttl命令五. redis的过期策略六. 定时器的两种设计方式七. type命令 一. exists命令 用来判断key的值是否存在 返回值是key的个数 这样写的话&#xff0c;有没有什么区别呢&#xff1f; 效率变低&#xff0c;消…