PCIe扫盲——Flow Control基础(一)

PCIe扫盲——Flow Control基础(一)FlowControl即流量控制,这一概念起源于网络通信中。PCIe总线采用FlowControl的目的是,保证发送端的PCIe设备永远不会发送接收端的PCIe设备不能接收的TLP(事务层包)。也就是说,发送端在发送前可以通过FlowControl机制知道接收端能否接收即将发送的TLP。在PCI总线中,并没有FlowControl这样的机制,因此发送端并不知道当前时刻,接收端能否接收对应的TLP。因此,发送端只能先尝试发送,期间可能会被插入多个等待周期(接收设备尚未就绪等原因),甚至是重发(Re

大家好,又见面了,我是你们的朋友全栈君。

Flow Control即流量控制,这一概念起源于网络通信中。PCIe总线采用Flow Control的目的是,保证发送端的PCIe设备永远不会发送接收端的PCIe设备不能接收的TLP(事务层包)。也就是说,发送端在发送前可以通过Flow Control机制知道接收端能否接收即将发送的TLP。

在PCI总线中,并没有Flow Control这样的机制,因此发送端并不知道当前时刻,接收端能否接收对应的TLP。因此,发送端只能先尝试发送,期间可能会被插入多个等待周期(接收设备尚未就绪等原因),甚至是重发(Retries)等。

PCIe Spec规定,PCIe设备的每一个端口(Ports)都必须支持Flow Control机制,在发送TLP之前,Flow Control必须先检查接收端口是否有足够的Buffer空间来接收这个TLP。当PCIe设备支持多个VC(Virtual Channel)时,Flow Control机制可以显著地提高总线的传输效率。

PCIe Spec规定,每个PCIe端口最多支持8个VC,并且每个VC的Flow Control Buffer是完全独立的。也就是说,某一个VC的Flow Control Buffer满了,并不会影响其他的VC的通信。

注:一般Endpoint只有一个端口,Root有一个或者多个端口,Switch有一个Upstream端口和多个Downstream端口。

前面的文章中介绍过,Flow Control机制是通过相邻两个端口(Ports)的数据链路层之间发送DLLP(Flow Control DLLPs)来实现的。也就是说Flow Control是一种点到点(Point to Point)的方式,而非端到端(End to End)。在进行初始化的时候,接收端需要向发送端报告(reports)其Buffer的大小,在正常运行状态(Run-time)时,会周期性地通过Flow Control DLLPs来告知发送端,接收端的各个Buffer的大小。

需要注意的是,虽然Flow Control DLLP只在相邻的数据链路层之间传输,但是相关的Buffer和计数器(FC Counter)确是在事务层(Transaction Layer)的,即事务层参与了Flow Control机制的管理。如下图所示:

blob.png

前面的文章中多次介绍过,TLP一共有三大类:Posted Transactions(包括Memory Writes和Messages)、Non-Posted Transactions(包括Memory Reads、Configuration Reads and Writes、IO Reads and Writes)以及Completions(包括Read and Write Completion)。并且知道,TLP可以分为两个部分,Header和Data部分。Flow Control为了获得更高的数据传输效率,将这三类TLP分开存放,同时将Header与Data部分也分开存放。因此,一共存在六种不同的Flow Control Buffer类型,如下图所示:

blob.png

Flow Control Buffer的存储单元(Unit)被称作Flow Control Credits。对于Header来说,Requests TLP每个unit等于5DW,而Completions TLP每个unit等于4DW。对于Data来说,每个unit等于4DW,即Data Buffer是按照16个字节对齐的。对于各种类型的Buffer的最小值如下表所示:

blob.png

最大值如下表所示:

blob.png

注:0 unit表示无限(Infinite)。

注:原文最早发表于本人的ChinaAET博客(http://blog.chinaaet.com/justlxy/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/146153.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python多线程的几种方法

    python多线程的几种方法python多线程编程Python多线程编程中常用方法:1、join()方法:如果一个线程或者在函数执行的过程中调用另一个线程,并且希望待其完成操作后才能执行,那么在调用线程的时就可以使用被调线程

    2022年7月3日
    23
  • druid简单教程

    druid简单教程java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,有不得不使用数据库连接池。数据库连接池有很多选择,c3p、dhcp、proxool等,druid作为一名后起之秀,凭借其出色的性能,也逐渐印入了大家的眼帘。接下来本教程就说一下druid的简单使用。首先从http://repo1.maven.org/maven2/com/alibaba/druid/下载最新的jar包。如果想…

    2022年7月23日
    14
  • webstorm激活 3月最新注册码

    webstorm激活 3月最新注册码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月15日
    35
  • MySQL修改表名注释「建议收藏」

    MySQL修改表名注释「建议收藏」MySQL修改表名注释altertabletest1comment’修改后的表的注释’;

    2022年6月1日
    25
  • java串口通信

    java串口通信java串口通信,由于没有相应的串口硬件,选了一款windows串口虚拟机机器1.准备串口模拟器LaunchVirtualSerialPortDriver下载地址模拟两对四个串口,

    2022年7月1日
    19
  • python激活码2021四月【在线注册码/序列号/破解码】

    python激活码2021四月【在线注册码/序列号/破解码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月19日
    57

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号