【PCIe】PCIe 读完成边界 (RCB) 介绍



🔥点击查看精选 PCIe 系列文章🔥
🔥点击进入【芯片设计验证】社区,查看更多精彩内容🔥


📢 声明

  • 🥭 作者主页:【MangoPapa的CSDN主页】。
  • ⚠️ 本文首发于CSDN,转载或引用请注明出处【https://mangopapa.blog.csdn.net/article/details/129280694】。
  • ⚠️ 本文目的为 个人学习记录知识分享。因个人能力受限,存在协议解读不正确的可能。若您参考本文进行产品设计或进行其他事项并造成了不良后果,本人不承担相关法律责任。
  • ⚠️ 若本文所采用图片或相关引用侵犯了您的合法权益,请联系我进行删除。
  • 😄 欢迎大家指出文章错误,欢迎同行与我交流 ~
  • 📧 邮箱:mangopapa@yeah.net
  • 💬 直达博主:loveic_lovelife(搜索或点击扫码)




RCB 定义


  Read Completion Boundary (RCB),读完成边界,是 Completer 响应读请求的一种地址边界对齐策略,应用于 CplD。



RCB 设置


  RC 的 RCB 可以为 64B 或 128B,默认 64 B;EP、Bridge、Switch 等其他设备的 RCB 只能为 128 B。在 RC 中,Link Control Register 中的 Read Completion Boundary 字段指示目前采用的 RCB 的值,如图 1 所示,为 0 表示 64 B,为 1 表示 128 B。在 EP/Bridge 中,可通过系统软件配置该寄存器中的 RCB 为 64 B 或 128 B,来指示其上游 RC 采用的 RCB 值。

在这里插入图片描述

▲ 图 1:Link Control Register


RCB 应用


  对于 IO 请求或 Configuration 请求,一次读写请求的 Data Payload Length 必须为 1 DW。加之 Address[1:0] = 0 已经实现了 DW 对齐,所以 IO 和 Configuration 请求的 Completion with Data (CplD) 不存在 RCB 违例的情况。

  对于 Memory 读写请求,虽说没有 1 DW 的限制,但为了防止某设备长时间占用 PCIe 总线,PCIe 发送请求设置了 MPS 及 MRRS 限制,读写不能超过 MPS/MRRS 规定的 Size。对于一笔 Memory Read 请求 (MRd),除了 MPS、MRRS 的限制,还要一个最基本的要求:不能跨 4 KB 边界,即读写的起始地址 Address 到 Address + Length*4 不能跨 4 KB 边界。此外,还需遵循 RCB 相关规则,对一笔读请求响应一笔或多笔 CplD。(注意:TLP Header 中的 Length 单位为 DW,即 4 B)

  满足 RCB 规则的 Completion 响应策略(或称拆分策略)如下:

  • 若读请求地址区间 (Address ~ Address+Length*4) 不跨 RCB 边界,只能放在一个 CplD 里。
  • 若读请求地址区间跨 RCB 边界,可以只发一笔 CplD,也可以以 RCB 为地址边界分多笔 CplD 进行响应,多个连续的 CplD 地址递增。

  只有一笔 CplD 的情况好理解,对于一笔读请求的多笔 Completion,这么说可能还不够清晰,我们换种方式:

  • 从 Data Payload Size 角度讲,第一笔 CplD 的 Data Payload Size 为 RCB*N - Address,第一笔和最后一笔 之间 CplD 的 Data Payload Size 必须为 RCB 的整倍数,最后一笔的 Size 在 MPS/MRRS 范围内不作要求。

  • 从起始地址讲,第一笔 CplD 的地址为读请求的地址,从第二笔 CplD 开始,起始地址 (LA) 必须为 RCB 地址对齐,从第三笔 CplD 开始,起始地址在上一地址基础上累加 RCB*N,RCB*N 即上一 CplD 所携带的 Data Payload Size。


举个例子

  对于 RCB = 64 B 的 RC,其收到了一笔起始地址为 0x0020h、长度为 256 B 的 MRd 请求,那么 RC 在回复 CplD 时,其回复的 CplD 可以有以下几种情况:

  • 回复 1 笔:
    • 256
  • 回复 2 笔:
    • 32, 224
    • 96, 160
    • 160, 96
    • 224, 32
  • 回复 3 笔:
    • 32, 64, 160
    • 32, 128, 96
    • 96, 128, 32
    • 96, 64, 96
    • 160, 64, 32
  • 回复 4 笔:
    • 32, 64, 64, 96
    • 32, 64, 128, 32
    • 32, 128, 64, 32
    • 96, 64, 64, 32
  • 回复 5 笔:
    • 32, 64, 64, 64, 32
  • 不能拆分为 6 笔及以上的 CplD


参考




— END —


🔥 精选往期 PCIe 协议系列文章,请查看【 PCIe 专栏🔥

⬆️ 返回顶部 ⬆️

浅谈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 -
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MangoPapa

请作者喝瓶可乐吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值