流量控制

目录

    流控初始化

    在上电或者内部复位完之后,正常操作之前,需要对默认的虚通道 (Virtual Channel, 简称 VC) VC0 进行流控初始化 (initialize Flow Control)。此外,当有其它 VCs 被使能起来后,必须等到每一个 VC 流控初始化过程完成之后才可以使用。VC0 会早于其它 VCs 使能,必须等到 VC0 初始化完成之后,才可以发 TLP traffic。但是,当其它 VCs 在初始化的时候,可能会有 TLP traffic 在其它已经完成初始化的 VC 上。这种 traffic 对其它正在进行初始化过程的 VC 没有直接的影响。Shared Flow Control 在 Flit Mode 是使能的,在 Non-Flit mode 需要禁用。VC 初始化过程中,有两个状态 : FC_INIT1 和 FC_INIT2

    流控初始化状态机

    如果在对 VCs 1 至 7 进行初始化的过程中,任何时刻某个 VC 被禁用,那么针对该 VC 的流控初始化将被终止

    FC_INIT1 状态

    满足下面任意一个条件时,进入 FC_INIT1 状态:

    • 当进入到 DL_INIT 时
    • 当软件使能 VCx (VC1-7) 时

    FC_INIT1 状态行为

    • 传输层必须阻止使用 VCx 的 TLP 传输
    • 在 Non-Flit 模式时,针对 VCx,按照下列相对顺序发送 3 个 InitFC1 DLLP
      • InitFC1-P (Dedicated) (第一)
      • InitFC1-NP (Dedicated) (第二)
      • InitFC1-CPL (Dedicated) (第三)
      • 在 Flit 模式时,针对 VCx,按照下面相对顺序发送 6 个 InitFC1 DLLP
      • InitFC1-P (Dedicated) (第一)
      • InitFC1-NP (Dedicated) (第二)
      • InitFC1-CPL (Dedicated) (第三)
      • InitFC1-P (Shared) (第四)
      • InitFC1-NP (Shared) (第五)
      • InitFC1-CPL (Shared) (第六)
    • 至少每隔 34 us 发送 3(或者6) 个 InitFC1 DLLPs
      • 34 us 不包含 LTSSM 在 Recovery 或者 Configuration 的时间
      • 强烈建议频繁重复执行 InitFC1 DLLP 传输操作,尤其是在没有其他 TLP 或 DLLP 可供传输的情况下。

    当 DataFC 或者 HdrFC 是 0 时,DataScale 和 HdrScale 编码如下(Infinite.x 表示无限流控)

    编码 模式 是否支持 Scaled FC (可缩放的流控机制) DataScale/HdrScale
    Infinite.1 Non-Flit 不支持 00b
    保留 Non-Flit 不支持 01b, 10b 或者 11b
    Infinite.2 Non-Flit 支持 01b, 10b 或者 11b
    保留 Non-Flit 支持 00b
    Infinite.3 Flit NA 00b
    zero Flit NA 01b
    Merged Flit NA 10b
    保留 Flit NA 11b

    Non-Flit 模式 InitFC1 和 InitFC2 中 DataFC, DataScale, HdrFC 和 HdrScale 配置表

    支持 Scaled Flow Control 并且激活了 Local and Remote Extended VC Count Merged InitFC 数量 Dedicated/Shared DataScale and HdrScale DataFC and HdrFC Notes
    0(保留) 不适用 3 0(保留) Infinite.1 (00b) Infinite.1 (00b) 1
    0(保留) 不适用 3 0(保留) 00 不等于0 1
    0(保留) 不适用 3 0(保留) Infinite.2 (01b, 10b 或 11b) Infinite.2 (00b) 1
    0(保留) 不适用 3 0(保留) 01b/10b/11b 不等于0 1,2

    Dedicated/Shared 表明 credits 是独占的还是共享的, 比如是 Dedicated 的,则表示某一类 Traffic Class(TC)或 Virtual Channel(VC)拥有自己专用的 Credit,不与其他类型共享,即使 即使 VC0 的 Credit 用不完,也不能借给 VC1。Shared 表示:多个流量共享同一组 Credit Pool。

    Notes :

    • 1 : 向后兼容性:在本规范的早期版本中,DataScale 和 HdrScale 位被保留。
    • 2 : 向后兼容性:在本规范的早期版本中,任何非零的 DataScale/HdrScale 均表示 Infinite.2

    Flit 模式 DataFC, DataScale, HdrFC, HdrScale 配置表

    pcie7_0_spec_table_3_3_0
    pcie7_0_spec_table_3_3_0

    Merged 一般表示:把多个 Credit 类型或多个 Channel 的 Credit 合并管理。

    Note 的一些说明 :

    • 3 : 由于 Extended VC 数量为 0,因此只能分配 1 个 VC 。 分配 0 个 dedicated credits,所有 credits 都是 Shared 的
    • 4 : 由于 Extended VC 数量为 0,因此只能分配 1 个 VC。分配 0 个 NP dedicated credits,所有 NP credits 都是 shared
    • 5 : 当 local 不为 0 且 Remote 为 0 时,第 3 行和第 4 行是推荐的,但是第 9 行和 第 10 行是允许的。
    • 6 : Zero shared credits 表明分配额外的 shared credits。所有 shared credits 都是由其它 VCs 分配,并且由改 VC 使用。当多个虚拟通道(VC)同时广播 shared credits,且其缩放因子为 01b、10b 或 11b 时,该缩放因子必须能够表示所有已分配的共享信用额度,无论VC的数量如何。TODO
    • 7 : TODO
    • 8 : 当 Local 不为 0 且 Remote 为 0 时,第 5 行到第 8 行是推荐的,但是第 11 行到 13 行是允许的。
    • 9 : Shared / Dedicated 机制的定义使得 shared credits 成为常见情况。使用 dedicated credits 的 TLP 将采用 “Flit Mode Local TLP Prefix”,因此会额外消耗一个DW。在第3至第4行中,所有 credits 都是 shared 的。
    • 10 : 为了防止死锁, P 和 CPL credits 禁止为 Zero

    数据链路层不得阻塞其他传输,除非是为了确保需要达到所需频率的 InitFC1 DLLP
    – 请注意,这包括所有由物理层发起的传输(例如 OS )、Ack和Nak DLLP(适用时),以及使用已完成初始化的 VC 的 TLP(适用时)。

    处理接收到的 InitFC1 和 InitFC2 DLLPs 时:

    • 记录下指示的 HdrFC 和 DataFC 值
    • 如果接收机支持 Scaled Flow Control (可缩放的流控),记录下 HdrScale 和 DataScale 指示的值
    • 对于 VCx,一旦 P,NP 和 CPL 的 FC unit 值已经记录下来,就必须设置 FI1 标识
      • 在 Non-Flit 模式下,当记录了 3 个 dedicated FC unit 时,FI1 标识将被设置。
      • 在 Flit 模式下,当记录了 6 个 FC unit 时,FI1 表示将被设置。

    FC_INIT1 状态跳转

    下一状态 跳转原因
    FC_INIT2 FL1 标识置为 1,这表明 VCx 中的 N/NP/CPL 都记录了 FC unit 的值

    FC_INIT2 状态

    FC_INIT2 状态行为

    • 传输层必须阻止使用 VCx 的 TLP 传输
    • 在 Non-Flit 模式,按照下列相对顺序在 VCx 上发送 3 个 InitFC2 DLLP
      • InitFC2-P (Dedicated) (第一)
      • InitFC2-NP (Dedicated) (第二)
      • InitFC2-Cpl (Dedicated) (第三)
    • 在 Flit 模式,按照下列相对顺序在 VCx 上发送 6 个 InitFC1 DLLPs
      • InitFC2-P (Dedicated) (第一)
      • InitFC2-NP (Dedicated) (第二)
      • InitFC2-Cpl (Dedicated) (第三)
      • InitFC2-P (Shared) (第四)
      • InitFC2-NP (Shared) (第五)
      • InitFC2-Cpl (Shared) (第六)
    • 至少每隔 34 us 发送 3(或者6) 个 InitFC2 DLLPs
      • 34 us 不包含 LTSSM 在 Recovery 或者 Configuration 的时间
      • 强烈建议频繁重复执行 InitFC2 DLLP 传输操作,尤其是在没有其他 TLP 或 DLLP 可供传输的情况下。
      • 数据链路层不得阻塞其他传输,除非是为了确保需要达到所需频率的 InitFC2 DLLP
        • 请注意,这包括所有由物理层发起的传输(例如 OS )、Ack和Nak DLLP(适用时),以及使用已完成初始化的 VC 的 TLP(适用时)。
      • 处理接收到的 InitFC1 和 InitFC2 DLLPs
        • 忽略接收到的 HdrFC, HdrScale, DataFC 和 DataScale 的值
        • VCx 受到任意一个 InitFC2 就需要设置 Fl2 标志

    FC_INIT2 状态跳转

    下一状态 跳转原因
    NA 满足所有
    1. FL2 标志为1
    2. 如果链路支持 Scale Flow Control,针对 VCx,在所有的 UpdataFC DLLP 上必须发送 HdrScale 为 01b,DataScale 为 10b 或者 11b
    3. 如果 Scale Flow Control 不支持或者链路上没有激活 Scaled Flow Control,在 VCx 上,在所有发送的 UpdataFC DLLP 中, HdrScale 和 DataSacle 都为 00
    如果在这个过程中遇到了其它问题,欢迎在评论区留言,如果你已解决,也欢迎把具体的解决方法留在评论区,以供后来者参考
    ×

    感谢您的支持,请扫码打赏

    微信打赏 支付宝打赏
    guest

    这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理

    0 评论