PCIe协议之RCB、MPS、MRRS详解

✨前言:

PCIe总线的存储器写请求、存储器读完成等TLP中含有数据负载,即Data Payload。Data Payload的长度和MPS(Max Payload Size)、MRRS(Max Read Request Size)和RCB(Read Completion Boundary)相关。

✨一、RCB介绍

🌟1.1 什么是RCB?

RCB(Read Completion Boundary)是PCI Express(PCIe)总线中定义的一个参数,它指定了在完成PCIe内存读取请求时可以返回的数据包的最大对齐字节边界。RCB的值通常可配置为64字节或128字节。
这个参数的作用是确保读取响应(Completion)数据包中包含的数据不会跨过特定的对齐边界。简而言之,RCB定义了数据包中的数据应该如何在一个或多个连续的PCIe包中被分割传输,以便于数据的处理和高效率的内存访问。
RCB的设置在系统性能优化中很重要,因为它影响着数据在PCIe接口上传输的效率。合适的RCB设置可以帮助减少延迟和提升带宽的利用率,从而提高整个系统的性能

🌟1.2 RCB配置

在PCIe规范中,RCB主要有两个可选的大小:64字节和128字节。**RC 的 RCB 可以为 64B 或 128B,默认 64 B;EP、Bridge、Switch 等其他设备的 RCB 只能为 128 B。**这意味着当设备完成读请求时,返回的数据包大小不超过设置的RCB值。选择适合系统需求的RCB大小,可以在保证数据传输稳定性的同时,优化系统性能。
64字节RCB:较小的RCB设置会导致更频繁的数据包传输,这在某些情况下可能提高小数据块传输的效率。例如,对于一些需要低延迟的应用,较小的数据包可能意味着更快的响应时间。
128字节RCB:较大的RCB设置减少了数据包传输的频率,有利于大量数据的传输效率。在数据吞吐量要求较高的应用场合,较大的RCB可以减少系统的总体开销,提高数据传输速度。
在这里插入图片描述

🌟1.3 RCB的应用

当主机或设备在PCI Express (PCIe) 总线上发出一笔Memory Read请求(MRd)时,目标设备或内存控制器需要按照相应的规则进行处理,并生成一个或多个完整的响应(Completion,Cpl)。为了满足RCB(Read Completion Boundary)规则,返回的数据可能需要被拆分成多个CplD(Completion with Data)数据包。这里是一个简化的步骤说明,展示满足RCB规则的Completion响应策略:

步骤 1: 分析MRd请求 设备首先分析MRd请求,获取以下信息: 读取的起始地址(Address) 读取的数据长度(Length)
请求者的ID和Tag,以便之后能将完成数据与请求正确匹配 步骤 2: 检查RCB设置
确认当前系统设置的RCB值(通常是64或128字节),这将影响拆分策略。 步骤 3: 计算是否跨越RCB边界
检查请求读取是否会跨越RCB边界。例如,如果RCB是64字节,确保读取操作不会在一个64字节的对齐边界开始,并在另一个64字节的对齐边界结束,而是在RCB定义的同一个边界内完成。
步骤 4: 拆分完成数据
如果MRd请求的长度过长,使得数据不能在一个CplD中返回,或者读取操作跨越了RCB边界,那么目标设备需要将数据拆分成几个CplD数据包。每个数据包都需要:
遵守MPS(Max Payload Size)的限制 确保CplD中的数据不会跨越RCB边界 遵循系统内存及对齐规则 步骤 5:
构建CplD数据包 为每一段数据构建CplD数据包,包括必要的头部信息,如请求者ID、Tag、完成状态、Byte
Count等,并将实际数据附加到数据包中。 步骤 6: 发送CplD数据包
依次发送所有CplD数据包,包括可能因RCB而被拆分的多个数据段。 步骤 7: 等待所有CplD被确认
请求方接收到所有的CplD数据包,并确认数据是否完整和正确。
通过以上步骤,一个MRd请求得到满足RCB规则的Completion响应。这种拆分策略有助于维持PCIe系统的稳定性和数据完整性,同时也确保了数据在不同的设备间能够高效地传输。这个过程有时也可以由硬件逻辑自动完成,无需软件参与。

🌟1.4 举例说明:

假设RCB(Read Completion Boundary)设置为64字节(即RCB = 64B),并且Root Complex(RC)收到了一笔起始地址为0x0010h(即16字节偏移),长度为256字节(即64字节 x 4)的Memory Read请求(MRd)。为了满足RCB规则,RC在回复CplD(Completion with Data)时,需要确保每个CplD数据包中的数据不会跨越64字节的边界。
首先,考虑到RCB是64字节,我们可以把内存空间想象为由64字节大小的块组成。并且,由于MPS(Max Payload Size)或设备设置的其他限制,以及PCIe TLP的格式要求,一个CplD可能包含的数据量也是有上限的。
由于读取请求的起始地址是0x0010h,我们知道第一个数据包不能从0字节地址开始,它会从16字节地址开始并延伸到下一个64字节边界。此后,每个数据包都会尝试填充完整的64字节,直到所有的256字节都被读取。
以下是RC回复256字节MRd请求时,可能的CplD分包情况:

⭐️1.4.1 情况1:4个CplD,每个64字节

第一个CplD包含数据0x0010h到0x003Fh(64字节 - 16字节的偏移 = 48字节)
第二个CplD包含数据0x0040h到0x007Fh(64字节)
第三个CplD包含数据0x0080h到0x00BFh(64字节)
第四个CplD包含数据0x00C0h到0x00FFh(64字节)

⭐️1.4.2 情况2:如果MPS更小

如果设备有一个更小的MPS值的限制(例如128字节),那么CplD数据包将进一步分割,以不超过MPS的限制。例如,前两个CplD可能包含以下数据:
第一个CplD包含数据0x0010h到0x003Fh(如上)
第二个CplD包含数据0x0040h到0x006Fh(48字节,因为MPS限制)
剩下的数据需要在后续CplD中完成。

⭐️1.4.3 情况3:1个CplD,128字节 + 2个CplD,64字节

在某些情况下,可能会根据MRRS或其他系统限制合并响应,例如:
第一个CplD包含数据0x0010h到0x007Fh(48字节 + 64字节)
第二个CplD包含数据0x0080h到0x00BFh(如上)
第三个CplD包含数据0x00C0h到0x00FFh(如上)
这种合并必须在保证不会跨过64字节边界的前提下进行,并且每个CplD的大小依旧不能超过设定的MPS。
总的来说,在处理CplD时,会遵循几个基本的规则:
数据不跨越64字节的RCB边界。
数据负载在MPS的限制内。
尝试以最有效的方式(取决于MPS和MRRS)响应整个读请求。

✨二、MPS介绍

🌟2.1 什么是MPS?

MPS(Max Payload Size)表示TLP报文中数据负载的长度。PCIe总线规MPS的最大值为4KB,但PCIe设备并不一定都能够按照最大长度发送数据负载。因此实际使用的MPS由链路两端的设备Function协商决定。当发送的数据长度超过MPS时,这段数据会被分割成多个TLP报文发送,若接收的TLP报文数据负载超过MPS,则接收端会认为这是一个非法的TLP。对于存储器读完成TLP报文,数据负载的长度也不能超过MPS,如果超过MPS,则需要发送多个读完成报文,同时也要满足RCB的要求。

在PCIe配置空间中,有两个寄存器,Device Capabilities记录的是PCIe Function的MPS能力,Device Control寄存器可以配置MPS的大小
在这里插入图片描述
在这里插入图片描述
Max_Payload_Size Supported的值和MPS对应关下如下:
在这里插入图片描述

🌟2.2 不同的MPS的作用

📌MPS的大小在系统初始化或配置时设定,通常可以从128字节到4096字节不等。不同大小的MPS对PCIe系统的性能有不同的影响,主要体现在以下几个方面:

提高数据传输效率
较大的MPS可以减少为传输相同数据量需要的TLP数量,因此可以减少交易层包的开销(如头部、确认等),从而提高数据传输的整体效率。例如,当传输大量数据时,使用较大的MPS可以减少总线事务次数,并且由于每次事务都有相对固定的开销,因此更大的MPS通常意味着更高的吞吐率。

降低延迟
小的MPS意味着数据包快速完成,这可能对于延迟敏感的应用非常关键,如实时系统或某些互动游戏。较小的数据包可以更快地被处理和确认,从而降低了数据传输的延迟。

兼容性
在多个设备连接的PCIe网络中,MPS的大小必须在所有设备之间进行协调,因此需要选择一个所有设备都支持的MPS值。选择过大的MPS可能会引起兼容性问题,因为不是所有设备都能处理大尺寸的数据包。

资源利用
较大的MPS可能需要更多的系统内存和缓存来缓存数据包,这对较小的或资源受限的系统可能是一个问题。相反,小的MPS则可能允许系统更节省地使用内存资源。

系统性能平衡
较大的MPS可能有助于实现更高的数据吞吐率,但如果总线或设备负载较重,大的数据包可能导致队列延迟增加。因此,根据系统的特定需求和工作负载,可能需要调整MPS以实现性能和响应时间之间的最佳平衡。

流量控制
大尺寸的MPS可能导致部分设备在短时间内被大量数据所淹没,这就需要更精细的流量控制机制。较小的MPS可以让流量控制更为灵活,减少因缓冲区溢出而导致的传输延迟或中断。
综上所述,MPS的不同大小直接影响数据在PCIe总线上传输的方式,以及系统性能的多个方面。因此,选择合适的MPS值非常重要,需要充分考虑系统的设计、工作负载类型和设备能力。

✨三、MRRS介绍

🌟3.1 什么是MRRS?

MRRS(Max Read Request Size)参数决定了PCIe设备Function使用存储器读请求,一次能从目标设备读取多少数据,即PCIe设备Function的读请求TLP中的Lewngth字段不能超过MRRS。若PCIe设备Function使用存储器读请求读取的数据长度超过了MRRS,则需要发送多个存储器读请求TLP。PCIe总线规定MRRS最大值为4KB,通常情况下PCIe设备Function的MRRS都会小于这个值。

在PCIe设备配置空间中,PCI Express Capability Structure的Device Control寄存器用于设置MRRS。对于多Function的PCIe设备,每个Function的MRRS可能不同。若PCIe设备Function的Max_Read_Request_Size固定为128字节,则Max_Read_Request_Size位域可实现为只读,且值为000b。
在这里插入图片描述
MRRS对照如下
在这里插入图片描述

🌟3.2 MRRS作用

📌在PCI Express (PCIe) 架构中,MRRS(Max Read Request Size)是指设备在发出单个读请求(MemoryRead TLP)时所能请求的最大数据量。
与MPS(Max PayloadSize)相似,MRRS也是在系统初始化或配置时设定的,并且通常也可以从128字节到4096字节不等。
不同大小的MRRS会对PCIe系统的性能产生以下影响: 提升带宽利用率
较大的MRRS值允许发出读请求的设备一次性请求更多的数据,这在读取大块数据时提高了带宽利用率。如果设备需要连续的大量数据,较大的MRRS可以减少所需的总请求次数,从而减少请求的开销并提高效率。

降低延迟
对于需要频繁访问但数据量较小的应用,较小的MRRS可能更有利。小的MRRS可以减少在任何给定时间内未完成请求的数量,因此可以在高负载系统中降低延迟。这对于延迟敏感的任务很关键。

提高系统响应性
MRRS较小可以使系统更快地响应各种大小的读取请求,尤其是在多任务环境中,可以帮助平衡不同设备之间的响应时间,从而提高整体系统的响应性。

缓存和内存管理
大的MRRS值可能需要更多的缓存空间和内存资源来处理单个较大的数据请求。对于资源有限的系统,较大的MRRS可能会造成资源压力。而较小的MRRS可帮助系统优化内存和缓存的使用。

流量控制
系统需适当处理较大的MRRS请求,否则可能会造成数据包占有总线时间过长,导致其他设备无法及时发送或接收数据。因此,大的MRRS可能需要更精细的流量控制策略。

兼容性问题
在多设备环境中,MRRS需要在所有设备间有良好的协调性。如果一台设备具备较大的MRRS而另一台设备不支持,就可能导致兼容性问题,因为不是所有设备都能处理或响应大尺寸的数据请求。

系统性能平衡
正确的MRRS设置可以帮助平衡传输效率与系统响应性之间的关系。系统设计师需要根据具体的应用工作负载和系统的硬件能力来确定最合适的MRRS大小。

✨四、MPS、MRRS的修改

这里主要拿Linux举例
我们先用lspci 查看当前这个RC的MPS和MRRS
在这里插入图片描述
⚠️注意:这里的能力寄存器显示MaxPayload最大只能到512bytes,所有这里配置512以上也是没有用的。
然后我们Device Control Register的偏移为0x8,这里的基地址是0x70,所以这里我们偏移就是0x78。这里我们修改的MPS为128bytes,这里修改的就是寄存器的bit5-7,所以这里就是0x10。修改完可以retrain一下link,让EP和RC协商到一致的MPS。
在这里插入图片描述
这里看到MPS就已经修改为128bytes了,MRRS的修改方式也是一样,只是修改的bit位不一样,MRRS为bit12-14。
在这里插入图片描述

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

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

相关文章

物联网实战--平台篇之(二)基础搭建

目录 一、Qt工程创建 二、数据库知识 三、通信协议 四、名词定义 本项目的交流QQ群:701889554 物联网实战--入门篇https://blog.csdn.net/ypp240124016/category_12609773.html 物联网实战--驱动篇https://blog.csdn.net/ypp240124016/category_12631333.html 一、Qt工程…

请编写函数fun,该函数的功能是:统计各年龄段的人数。N个年龄通过调用随机函数获得,并放在主函数的age数组中;

本文收录于专栏:算法之翼 https://blog.csdn.net/weixin_52908342/category_10943144.html 订阅后本专栏全部文章可见。 本文含有题目的题干、解题思路、解题思路、解题代码、代码解析。本文分别包含C语言、C++、Java、Python四种语言的解法完整代码和详细的解析。 题干 请编…

考研管理类联考(专业代码199)数学基础【2】整式与分式

一、整式及其运算 1.常用乘法公式(逆运算就是因式分解) 公式扩展① 公式扩展② 公式扩展③ 2.整式除法定理 若整式 F(x) 除以x-a的余式为r(x),则 F(x) (x -a) g(x) r(x) ,故r(a)F(a)成立 二、指数和对数的运算性质 1.指数运算…

vue3、element-plus递归实现动态菜单

vue3、element-plus递归实现动态菜单 使用场景:动态菜单为什么使用递归递归在动态菜单中的实现 使用场景:动态菜单 动态菜单是指菜单项的数量和层次结构可能是动态的,通常来自后端或用户输入。这些菜单的特征包括: 多层嵌套&…

Mysql从入门到精通——Mysql知识点总结(基础篇)

参考视频 黑马程序员 MySQL数据库入门到精通i 题单推荐 入门 进阶 SQL语句类型 DDL:数据定义语言,用来定义数据库对象(数据库,表,字段)DML:数据操作语言,对数据库表中的数据进行增删改DQL:数据查询语言,用来查询数据库中表的…

Linux第二节--常见的指令介绍集合(持续更新中)

点赞关注不迷路!,本节涉及初识Linux第二节,主要为常见的几条指令介绍。 Linux下基本指令 1. ls 指令 语法: ls [选项][目录或文件] 功能:对于目录,该命令列出该目录下的所有子目录与文件。对于文件&#…

VPot-Free一款功能强大的文字转语音工具 v2306

01 软件介绍 VPot-FREE是一款功能强大的免费文字转语音工具,为用户提供了便捷的语音合成功能。无论是想将文字转化为语音进行朗读,还是将文章转为语音保存,VPot-FREE都能满足你的需求。 多种语音风格可供选择,包括男声、女声以及…

笔记-用Python脚本启停JAR程序

用Python脚本启停JAR程序,需要用到python中的以下内置模块 subprocess 是 Python 的一个标准库模块,用于在新进程中执行子命令,获取子进程的输入/输出/错误以及返回码等os 是 Python 的一个标准库模块,它提供了与操作系统交互的功…

Vue---混入

Vue—混入 目录 Vue---混入声明mixin**局部使用**全局使用 mixin(混入):可以将组件中共用的配置提取到一个对象内,以此便不用再每个组件中都写一遍了 声明mixin 定义mixin/index.js文件 const mixinData {data(){return {name…

Linux内核深入学习 - 中断与异常(上)

中断与异常 中断通常被定义为一个事件:让事件改变处理器执行的指令顺序这样的事件,与CPU芯片内外部硬件电路产生的电信号相对应! 中断通常分为同步中断与异步中断: 同步中断指的是当指令执行时,由CPU控制单元产生的…

基于Java-jsp的现代数字化城市公交查询系统论文(四)

⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️ ➡️点击免费下载全套资料:源码、数据库、部署教程、论文、答辩ppt一条龙服务 ➡️有部署问题可私信联系 ⬆️⬆️⬆️​​​​​​​⬆️…

音视频入门基础:像素格式专题(1)——RGB简介

一、像素格式简介 像素格式(pixel format)指像素色彩按分量的大小和排列。这种格式以每个像素所使用的总位数以及用于存储像素色彩的红、绿、蓝和 alpha 分量的位数指定。在音视频领域,常用的像素格式包括RGB格式和YUV格式,本文…

a-table 控制列的展示和隐藏

一、业务场景: 最近在使用 Antd-vue 组件库的时候,a-table需要根据不同角色的权限显示和隐藏 columns的列 为了避免大家走弯路,为大家整理了一下,粘走可以直接用的那种 二、具体实现步骤: 1.在需要显示与隐藏的列增加一…

制定语音芯片的语音识别指令时需要关注的内容

背景 最近定义设备识别的语音指令以及对应的语音反馈。虽然语音控制在软件里只是很小的一块功能,但也不能太马虎。新人入坑就要学习,学习前人的经验规避问题,最后总结经验给后人,给未来的自己。好记性不如烂笔头~ 下面一些问题是…

1700java进销存管理系统Myeclipse开发sqlserver数据库web结构java编程计算机网页项目

一、源码特点 java web进销存管理系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为sqlser…

『FPGA通信接口』DDR(3)DDR3颗粒读写测试

文章目录 前言1.配套工程简介2.测试内容与策略3. 测试程序分析4.程序结果分析5.一个IP控制两颗DDR36.传送门 前言 以四颗MT41K512M16HA-125AIT颗粒为例,介绍如何在一块新制板卡上做关于DDR3的器件测试。前面两篇介绍了什么是DDR,并介绍了xilinx给出的FPG…

基于Springboot的音乐翻唱与分享平台

基于SpringbootVue的音乐翻唱与分享平台设计与实现 开发语言:Java数据库:MySQL技术:SpringbootMybatis工具:IDEA、Maven、Navicat 系统展示 用户登录 首页 音乐资讯 音乐翻唱 在线听歌 后台登录 后台首页 用户管理 音乐资讯管理…

Elasticsearch:探索 11 种流行的机器学习算法

作者:来自 Elastic Elastic Platform Team 过去几年中,机器学习(ML)已经悄然成为我们日常生活中不可或缺的一部分。它影响着从购物网站和流媒体网站上的个性化推荐,到保护我们的收件箱免受我们每天收到的大量垃圾邮件的…

3.9设计模式——Strategy 策略模式(行为型)

意图 定义一系列的算法,把它们一个个封装起来,并且使他们可以相互替换此模式使得算法可以独立于使用它们的客户而变化 结构 Strategy(策略)定义所有支持的算法的公共入口。Context使用这个接口来调用某ConcreteStrategy定义的方…

手撕spring框架(2)

相关系列 java中spring底层核心原理解析(1)-CSDN博客 java中spring底层核心原理解析(2)-CSDN博客 手撕spring框架(1)-CSDN博客 依赖注入原理 依赖注入(Dependency Injection,简称DI)是一种设计模式,它允许我…
最新文章