【PCIe】TLP结构与配置空间

在这里插入图片描述

🔥博客主页:PannLZ


PCIe TLP结构

在这里插入图片描述

TLP 主要由3个部分组成: Header 、 数据(可选,取决于具体的TLP 类 型 ) 和 ECRC (End to End CRC, 可选)。TLP 都始于发送端的事务层,终于接收端的事务层。

每个 TLP 都有一个 Header 。 事务层根据上层请求内容,生成 TLP Header Header 包括 发送者的相关信息、目标地址(该 TLP 要发给谁)、TLP 类型(诸如前面提到的内存读、内 存写)、数据长度(如果有数据的话)等。

ECRC 域为之前的 Header 和数据(如果有的话)生成一个CRC, 在接收端根据收到的 TLP 重新生成 Header 和数据(如果有的话)的CRC, 与收到的 CRC 比较, 一样则说明数据 在传输过程中没有出错,否则就有错。

TLP Header的公共部分各项内容:

  • Fmt : Format, 表明该 TLP是否带有数据,Header 是 3 DW 还是4 DW。
  • Type : TLP 类型,包括内存读、内存写、配置读、配置写、消息和响应等。 口 R : Reserved, 等于0。
  • TC: Traffic Class,TLP也分三六九等,优先级高的先得到服务。TC : 3 bit 说明可以 分为0~7这8个等级,TC 默认是0,数字越大,优先级越高。
  • Attr : Attribute, 属性,前后共三个位。
  • TH : TLP Processing Hints(处理提示)。
  • TD : TLP Digest,之前说 ECRC可选,如果这位被设置,则说明该 TLP包含 ECRC, 接收端应该做 CRC校验。
  • EP: “有毒”的数据,应远离。
  • AT : Address Type,地址种类。
  • 长度: Payload 数据长度,10位,最大为1024,单位为DW, 所以 TLP最大数据长 度是4 KB。该长度总是为DW 的整数倍,如果TLP 的数据不是 DW的整数倍(不是 4 B 的整数倍),则需要用到 Last DW BE和 1st DW BE这两个域。

TLP 格式和类型域编码:

TLPFm t域Type域说 明
Memory Read Request(内存读请求)000=3 DW,不带数据 001=4 DW,不带数据00000内存读不带数据,其Header大小为 3 D W 或 4 D W
Memory Write Request(内存写请求)010=3 DW,带数据 011=4 DW,带数据00000内存写带数据,其Header大小为 3 D W 或 4 D W
Configuration Type 0 Read Request (Type 0配置读请求)000=3 DW,不带数据0.0100读终端的配置,不带数据,Header 总是为3 DW
Configuration Type 0 Write Request (Type 0配置写请求)010=3 DW,带数据00100写终端的配置,带数据,Header总 是为3 DW
Configuration Type 1 Read Request (Type 1配置读请求)000=3 DW,不带数据00101读交换机的配置,不带数据,Header 总是为3 DW
Configuration Type 1 Write Request (Type 1配置写请求)010=3 DW,带数据00101写交换机的配置,带数据,Header 总是为3 DW
Message Request(消息请求)001=4 DW,不带数据1 0rrr消息的Header总是为4 DW
Message Request with Data(带数据 的消息请求)011=4 DW,带数据1 0rrr消息的Header总是为4 DW
Completion(响应)000=3 DW,不带数据01010响应的Header总是为3 DW
Completion with Data(带数据的晌应)010=3 DW,带数据01010响应的Header总是为3 DW

PCIe配置空间和地址空间

每个 PCIe 设备都有这样一段空间:主机软件可以通过读取它获得该设备的一些信息 也可以通过它来配置该设备。这段空间被称为PCIe 的配置空间。

PCI 或者 PCI-X 时代就有配置空间的概念,当时整个配置空间就是一系列寄存器的集合,由两部分组成:64 B的 Header 和192 B的 Capability(能力)数据结构。进入PCIe时代,PCIe能耐更大,192 B不足以罗列它的绝活。为了保持后向兼容,又 不把绝活落下,把整个配置空间由256 B 扩展成4 KB, 前面256 B 保持不 变。

配置空间的Header中很重要的是BAR(Base Address Register, 基址寄存器)。终端配置 (Type 0) 最多有6个BAR, 交换机 (Type 1) 只有2个。

CPU 如果想访问某个设备的空间,让RC 去办。例如:如果CPU 想读 PCIe设备的数据,先让RC 通过TLP 把数据从PCle 设备读到主机内存,然后CPU 从主机 内存读数据;如果CPU 要往PCle 设备写数据,则先把数据在内存中准备好,然后让RC 通 过TLP 将其写人PCle 设备。

具体实现就是上电的时候,系统把 PCle 设备开放的空间(系统软件可见)映射到内存 地址空间,CPU 要访问该PCIe 设备空间,只 需访问对应的内存地址空间。RC 检查该内 存地址,如果发现该内存地址是某个PCle 设 备空间的映射,就会触发其产生TLP 去访问 对应的PCle 设备,从而实现读或者写PCIe 设备.

设备出厂时, 这些空间的大小和属性都写在配置BAR 寄存器里面。上电后,系统软件读取这些BAR, 并 分配对应的系统内存地址空间,然后把相应的内存基地址写回BAR 。

(BAR 的地址其实是 PCI 总线域的地址, CPU 访问的是内存地址。CPU 访问PCle 设备时,需要把总线域地址转 换成内存地址。)

上电时,系统软件首先会读取 PCle设备的BAR 0, 得到数据,然后系统软 件往该BAR 0中写入全1,BAR 寄存器有些位是只读的,是PCIe设备在出厂前就固定好的,写全1进去,如果值保持不变,就说明这些位是厂家固化好的。这些固化好的位提供了这块内部空间的一些信息。

XXXX XXXXXXXX XXXX XXXX000000000000

低4位用于表明该存储空间的一些属性,比 如是/O 映射还是内存映射

一个PCIe 设备可能有若干个内部空间需要开放 出来,系统软件依次读取 BAR 1 、BAR 2 , 直到BAR 5, 完成所有内部空间的映射。

一个PCIe 设备 可能具有多个功能,比如硬盘功能、网卡功能 等,每个功能对应一个配置空间。

在整个 PCle 系统中,只要知道了总线序号、设备序号和功能序号,就能找到唯 一的功能。寻址基本单元是功能,它的ID 由总线、设备、功能(BDF) 组成。

这节详细的推荐看书《深入浅出SSD:固态存储核心技术、原理与实战(第2版)》。

  • 28
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
浅谈PCIe体系结构 浅谈PCIe体系结构 - 1 - 目录 - 1 - 第I篇PCI体系结构概述 - 1 - 第1章PCI总线的基本知识 - 3 - 1.1 PCI总线的组成结构 - 6 - 1.1.1 HOST主桥 - 6 - 1.1.2 PCI总线 - 7 - 1.1.3 PCI设备 - 7 - 1.1.4 HOST处理器 - 8 - 1.1.5 PCI总线的负载 - 9 - 1.2 PCI总线的信号定义 - 10 - 1.2.1 地址和数据信号 - 10 - 1.2.2 接口控制信号 - 11 - 1.2.3 仲裁信号 - 13 - 1.2.4 中断请求等其他信号 - 14 - 1.3 PCI总线的存储器读写总线事务 - 15 - 1.3.1 PCI总线事务的时序 - 15 - 1.3.2 Posted和Non-Posted传送方式 - 16 - 1.3.3 HOST处理器访问PCI设备 - 17 - 1.3.4 PCI设备读写主存储器 - 19 - 1.3.5 Delayed传送方式 - 21 - 1.4 PCI总线的中断机制 - 23 - 1.4.1 中断信号与中断控制器的连接关系 - 23 - 1.4.2 中断信号与PCI总线的连接关系 - 24 - 1.4.3 中断请求的同步 - 25 - 1.5 PCI-X总线简介 - 28 - 1.5.1 Split总线事务 - 28 - 1.5.2 总线传送协议 - 28 - 1.5.3 基于数据块的突发传送 - 29 - 1.6 小结 - 29 - 第2章PCI总线的桥与配置 - 30 - 2.1 存储器域与PCI总线域 - 30 - 2.1.1 CPU域、DRAM域与存储器域 - 31 - 2.1.2 PCI总线域 - 32 - 2.1.3 处理器域 - 32 - 2.2 HOST主桥 - 34 - 2.2.1 PCI设备配置空间的访问机制 - 35 - 2.2.2 存储器域地址空间到PCI总线域地址空间的转换 - 37 - 2.2.3 PCI总线域地址空间到存储器域地址空间的转换 - 39 - 2.2.4 x86处理器的HOST主桥 - 42 - 2.3 PCI桥与PCI设备的配置空间 - 45 - 2.3.1 PCI桥 - 45 - 2.3.2 PCI Agent设备的配置空间 - 47 - 2.3.3 PCI桥的配置空间 - 50 - 2.4 PCI总线的配置 - 54 - 2.4.1 Type 01h和Type 00h配置请求 - 54 - 2.4.2 PCI总线配置请求的转换原则 - 56 - 2.4.3 PCI总线树Bus号的初始化 - 58 - 2.4.4 PCI总线Device号的分配 - 60 - 2.5 非透明PCI桥 - 62 - 2.5.1 Intel 21555中的配置寄存器 - 63 - 2.5.2 通过非透明桥片进行数据传递 - 65 - 2.6 小结 - 67 - 第3章PCI总线的数据交换 - 68 - 3.1 PCI设备BAR空间的初始化 - 68 - 3.1.1 存储器地址与PCI总线地址的转换 - 68 - 3.1.2 PCI设备BAR寄存器和PCI桥Base、Limit寄存器的初始化 - 70 - 3.2 PCI设备的数据传递 - 72 - 3.2.1 PCI设备的正向译码与负向译码 - 72 - 3.3.2 处理器到PCI设备的数据传送 - 74 - 3.2.3 PCI设备的DMA操作 - 74 - 3.2.4 PCI桥的Combining、Merging和Collapsing - 75 - 3.3 与Cache相关的PCI总线事务 - 77 - 3.3.1 Cache一致性的基本概念 - 77 - 3.3.2 PCI设备对不可Cache的存储器空间进行DMA读写 - 82 - 3.3.3 PCI设备对可Cache的存储器空间进行DMA读写 - 83 - 3.3.4 PCI设备进行DMA写时发生Cache命中 - 85 - 3.3.5 DMA写时发生Cache命中的优化 - 87 - 3.4 预读机制 - 89 - 3.4.1 Instruction Fetch - 89 - 3.4.2 数据预读 - 92 - 3.4.3 软件预读 - 94 - 3.4.4 硬件预读 - 96 - 3.4.5 PCI总线的预读机制 - 97 - 3.5 小结 - 101 - 第II篇PCI Express体系结构概述 - 102 - 第4章PCIe总线概述 - 104 - 4.1 PCIe总线的基础知识 - 104 - 4.1.1 端到端的数据传递 - 104 - 4.1.2 PCIe总线使用的信号 - 106 - 4.1.3 PCIe总线的层次结构 - 109 - 4.1.4 PCIe链路的扩展 - 111 - 4.2 PCIe体系结构的组成部件 - 114 - 4.2.1 基于PCIe架构的处理器系统 - 114 - 4.2.2 RC的组成结构 - 117 - 4.2.3 Switch - 118 - 4.2.4 VC和端口仲裁 - 120 - 4.2.5 PCIe-to-PCI/PCI-X桥片 - 122 - 4.3 PCIe设备的扩展配置空间 - 124 - 4.4 小结 - 125 - 第5章PCIe总线的事务层 - 126 - 5.1 TLP的格式 - 126 - 5.1.1 通用TLP头的Fmt字段和Type字段 - 127 - 5.1.2 TC字段 - 129 - 5.1.3 Attr字段 - 130 - 5.1.4 通用TLP头中的其他字段 - 131 - 5.2 TLP的路由 - 133 - 5.2.1 基于地址的路由 - 133 - 5.2.2 基于ID的路由 - 135 - 5.2.3 隐式路由 - 138 - 5.3 存储器、I/O和配置读写请求TLP - 139 - 5.3.1 存储器读写请求TLP - 139 - 5.3.2 完成报文 - 144 - 5.3.3 配置读写请求TLP - 146 - 5.3.4 消息请求报文 - 147 - 5.4 TLP中与数据负载相关的参数 - 148 - 5.4.1 Max_Payload_Size参数 - 148 - 5.4.2 Max_Read_Request_Size参数 - 149 - 5.4.3 RCB参数 - 149 - 5.5 小结 - 150 - 第6章 MSI和MSI-X中断机制 - 151 - 6.1 MSI/MSI-X Capability结构 - 152 - 6.1.1 MSI Capability结构 - 152 - 6.1.2 MSI-X Capability结构 - 154 - 6.2 PowerPC处理器如何处理MSI中断请求 - 158 - 6.2.1 MSI中断机制使用的寄存器 - 159 - 6.2.2 系统软件如何初始化PCIe设备的MSI Capability结构 - 162 - 6.3 x86处理器如何处理MSI-X中断请求 - 165 - 6.3.1 Message Address字段和Message Data字段的格式 - 165 - 6.3.2 FSB Interrupt Message总线事务 - 168 - 6.4 小结 - 169 - 结束语 - 170 -
PCI Express (PCIe) TLP (Transaction Layer Packet) 是 PCI Express 协议的一个重要部分,它用于在不同的 PCIe 设备之间传输数据。PCIe TLP 由四个部分组成:头部、有效载荷、可选的可扩展有效载荷和 FCS(帧校验序列)。 具体来说,PCIe TLP 的格式如下: |---------------------------| | PCIe TLP 头部 (12 字节) | |---------------------------| | 有效载荷 (0 - 1024 字节) | |---------------------------| | 可扩展有效载荷 (0 - 1024 字节) | |---------------------------| | FCS(帧校验序列)(4 字节) | |---------------------------| PCIe TLP 头部包括以下字段: - TC(传输类别):指定 TLP 的类型,比如请求(Memory Read/Write)、Completion 等。 - TD(传输方向):指定 TLP 的传输方向,是从上游设备到下游设备还是相反。 - EP(端点):指定 TLP 的目标设备端口号。 - Length(长度):指定有效载荷的长度。 - First DW BE(第一个双字节字节 Enable):指定有效载荷的第一个双字节的哪些字节是有效的。 - Last DW BE(最后一个双字节字节 Enable):指定有效载荷的最后一个双字节的哪些字节是有效的。 - Tag(标签):可选字段,用于匹配请求和 Completion TLP。 - Requester ID(请求者 ID):可选字段,用于标识发起 TLP 的设备。 - Completer ID(完成者 ID):可选字段,用于标识处理 TLP 的设备。 PCIe TLP 的有效载荷可以是数据、地址或控制信息。可扩展有效载荷在某些情况下用于传输额外的数据或信息。FCS 是一个校验序列,用于检测传输中的错误。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值