🔥博客主页:PannLZ
文章目录
- PCIe TLP结构
- PCIe配置空间和地址空间
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 格式和类型域编码:
TLP | Fm 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 XXXX | 00000000 | 0 | 00 | 0 |
---|
低4位用于表明该存储空间的一些属性,比 如是/O 映射还是内存映射
一个PCIe 设备可能有若干个内部空间需要开放 出来,系统软件依次读取 BAR 1 、BAR 2 , 直到BAR 5, 完成所有内部空间的映射。
一个PCIe 设备 可能具有多个功能,比如硬盘功能、网卡功能 等,每个功能对应一个配置空间。
在整个 PCle 系统中,只要知道了总线序号、设备序号和功能序号,就能找到唯 一的功能。寻址基本单元是功能,它的ID 由总线、设备、功能(BDF) 组成。
这节详细的推荐看书《深入浅出SSD:固态存储核心技术、原理与实战(第2版)》。