来源: MindShare PCI Express Technology 3.0, Chapter 6
页码: 第215-244页
| 章节 | 主题 |
|---|---|
| 6.1 | 流量控制概念 |
| 6.2 | 流量控制缓冲区和信用量 |
| 6.3 | 初始流量控制通告 |
| 6.4 | 流量控制初始化 |
| 6.5 | 流量控制机制简介 |
| 6.6 | 流量控制示例 |
| 6.7 | 流量控制更新 |
流量控制(Flow Control, FC)是PCIe架构中的关键机制,用于确保发送端不会向接收端发送超过其处理能力的事务层包(TLP)。这种基于信用量(Credit-Based)的流量控制机制消除了传统PCI总线中由于缓冲区溢出而导致的重试、断开和等待状态等低效问题。
流量控制逻辑位于PCIe设备的数据链路层(Data Link Layer)中,具体实现如下:
PCIe Device A PCIe Device B
┌─────────────┐ ┌─────────────┐
│ Device Core │ │ Device Core │
└──────┬──────┘ └──────┬──────┘
│ │
┌──────┴──────┐ ┌──────┴──────┐
│ PCIe-Core │ │ PCIe-Core │
│ Hardware/ │ │ Hardware/ │
│ SW Interface│ │ SW Interface│
└──────┬──────┘ └──────┬──────┘
│ │
┌──────────────────────┼──────────────────────┬─────────────────┼──────────────────┐
│ Transaction Layer │ │ Transaction Layer │
│ ┌──────────┐ │ │ ┌──────────┐ │
│ │ FC Counters│ │ │ FC Counters│ │
│ └────┬─────┘ │ │ └────┬─────┘ │
│ │ │ │ │ │
│ ┌────┴─────┐ │ │ ┌────┴─────┐ │
│ │ FC Buffers│ │ │ │ FC Buffers│ │
│ └────┬─────┘ │ │ └────┬─────┘ │
└──────────────────────┼──────────────────────┴─────────────────┼──────────────────┘
│ │
┌──────────────────────┼──────────────────────┬─────────────────┼──────────────────┐
│ Data Link Layer │ │ Data Link Layer │
└──────────────────────┼──────────────────────┴─────────────────┼──────────────────┘
│ │
┌──────────────────────┼──────────────────────┬─────────────────┼──────────────────┐
│ Physical Layer │ Link │ Physical Layer │
│ (TX) │◄────────────────────►│ (RX) │
└──────────────────────┘ └─────────────────┘
图6-1:流量控制逻辑的位置
流量控制缓冲区针对端口支持的每个虚拟通道(VC, Virtual Channel)资源实现。每个VC流量控制缓冲区在接收端按照流经该虚拟通道的事务类别进行管理:
| 事务类别 | 包含的事务类型 |
|---|---|
| 发布事务(Posted Transactions) | 存储器写(Memory Writes)和消息(Messages) |
| 非发布事务(Non-Posted Transactions) | 存储器读(Memory Reads)、配置读写(Configuration Reads/Writes)、I/O读写(I/O Reads/Writes) |
| 完成(Completions) | 读完成和写完成 |
此外,每个类别又细分为头部(Header)和数据(Data)两部分,共形成六个不同的缓冲区:
- PH (Posted Header) - 发布请求头部
- PD (Posted Data) - 发布请求数据
- NPH (Non-Posted Header) - 非发布请求头部
- NPD (Non-Posted Data) - 非发布请求数据
- CPLH (Completion Header) - 完成头部
- CPLD (Completion Data) - 完成数据
PCIe Device A PCIe Device B
┌─────────────┐ ┌─────────────┐
│ Device Core │ │ Device Core │
└──────┬──────┘ └──────┬──────┘
│ │
┌──────┴──────┐ ┌──────┴──────┐
│ PCIe-Core │ │ PCIe-Core │
│ Hardware/ │ │ Hardware/ │
│ SW Interface│ │ SW Interface│
└──────┬──────┘ └──────┬──────┘
│ │
┌──────────────────────┼──────────────────────┬─────────────────┼──────────────────┐
│ Transaction Layer │ │ Transaction Layer │
│ │ │ │
│ ┌───────────────────┴──────┐ ┌──────┴───────────────────┐ │
│ │ Flow Control Buffers │ │ Flow Control Buffers │ │
│ │ (Receiver) │ │ (Receiver) │ │
│ │ │ │ │ │
│ │ ┌───┐ ┌───┐ ┌───┐ │ │ ┌───┐ ┌───┐ ┌───┐ │ │
│ │ │PH │ │NPH│ │CPLH│ │ │ │PH │ │NPH│ │CPLH│ │ │
│ │ └───┘ └───┘ └───┘ │ │ └───┘ └───┘ └───┘ │ │
│ │ ┌───┐ ┌───┐ ┌───┐ │ │ ┌───┐ ┌───┐ ┌───┐ │ │
│ │ │PD │ │NPD│ │CPLD│ │ │ │PD │ │NPD│ │CPLD│ │ │
│ │ └───┘ └───┘ └───┘ │ │ └───┘ └───┘ └───┘ │ │
│ │ P NP CPL │ │ P NP CPL │ │
│ └────────────────────────┘ └────────────────────────┘ │
└──────────────────────────────────────────────────────────────────────────┘
图例: P = Posted(发布请求), NP = Non-Posted(非发布请求), CPL = Completion(完成)
PH = Posted Header, PD = Posted Data
NPH = Non-Posted Header, NPD = Non-Posted Data
CPLH = Completion Header, CPLD = Completion Data
图6-2:流量控制缓冲区组织
接收端以称为**流量控制信用量(Flow Control Credits, FCCs)**的单位报告缓冲区空间。信用量的单位值定义如下:
| 缓冲区类型 | 信用量单位值 |
|---|---|
| 头部信用量(Header credits) | 最大头部大小 + 摘要(Digest) - 完成:4个双字(DWs) - 请求:5个双字(DWs) |
| 数据信用量(Data credits) | 4个双字(16字节对齐) |
注意:流量控制DLLP本身不需要流量控制信用量,因为它们起源于数据链路层并在该层终止,不使用事务层缓冲区。
在流量控制初始化期间,PCIe设备通过流量控制信用量"通告"其缓冲区大小。PCIe还定义了某些缓冲区所需的**无限流量控制信用量(Infinite Flow Control Credit)**值。通告无限缓冲区空间的接收端实际上保证其缓冲区永远不会溢出。
规范定义了不同流量控制缓冲区类型可报告的最小信用量数量:
表6-1:所需的最小流量控制通告
| 信用量类型 | 最小通告值 |
|---|---|
| 发布请求头部(PH) | 1单位。信用值 = 1个4DW头部 + 摘要 = 5DW |
| 发布请求数据(PD) | Max_Payload_Size最大可能设置对应的信用量。例如:如果支持的最大Max_Payload_Size值为1024字节,则最小允许初始信用值为040h |
| 非发布请求头部(NPH) | 1单位。信用值 = 1个4DW头部 + 摘要 = 5DW |
| 非发布请求数据(NPD) | 1单位。信用值 = 4DW。 2单位。支持AtomicOp路由或AtomicOp完成者能力的接收端信用值为02h |
| 完成头部(CPLH) | 1单位。信用值 = 1个3DW头部 + 摘要 = 4DW;用于支持P2P的根复合体和交换机。 无限单位。初始信用值 = 全0;用于不支持P2P的根复合体和端点 |
| 完成数据(CPLD) | n单位。Max_Payload_Size最大可能设置值或最大读请求大小(取较小者)除以FC单位大小(4DW);用于支持P2P的根复合体和交换机。 无限单位。初始信用值 = 全0;用于不支持P2P的根复合体和端点 |
表6-2:最大流量控制通告
| 信用量类型 | 最大通告值 |
|---|---|
| 发布请求头部(PH) | 128单位。128信用 @ 5 DWs = 2,560字节 |
| 发布请求数据(PD) | 2048单位。Max_Payload_Size值(4096字节)包括设备支持的所有功能(8个)除以信用大小(4 DWs)= 32,768字节 2048信用 @ 4 DWs = 32,768字节 |
| 非发布请求头部(NPH) | 128单位。128信用 @ 5 DWs = 2,560字节 |
| 非发布请求数据(NPD) | 作者未能找到非发布数据最大信用量的精确值。数据列出的最大信用量为2048。然而,更合理的方法可能使用非发布头部限制128信用,因为非发布数据总是与非发布头部相关联 |
| 完成头部(CPLH) | 128单位。128信用 @ 5 DWs = 2,560字节。这是不发起事务的端口的限制(例如,支持P2P的根复合体和交换机)。 无限单位。初始信用值 = 全0;用于发起事务的端口(例如,不支持P2P的根复合体和端点) |
| 完成数据(CPLD) | 2048单位。Max_Payload_Size值(4096字节)包括设备支持的所有功能(8个)除以信用大小(4 DWs)= 32,768字节 2048信用 @ 4 DWs = 32,768字节 无限单位。初始信用值 = 全0;用于发起事务的端口(例如,不支持P2P的根复合体和端点) |
以下是本章相关的原文图片:



