CXL.io Link Layer
作为Flex Bus Physical layer和cxl.io transaction layer的中间桥梁。
CXL.mem and CXL.cache Common Link Layer
CXL.cache 和 CXL.mem Link Layer使用通用的Link Layer
High-Level CXL.cache/CXL.mem Flit Overview
CXL.cache/mem flit的大小尺寸固定为528b(66B,4个16B的slot+2B的CRC),
Header slot定义了protocol-level的信息,这些信息包含在剩余的header和flit中的其他slots。
"Generic" slot可以携带一个或多个请求/响应消息,或者一个单独的 16B 数据块Data chunk。
一个flit可以由一个Header Slot和三个Generic Slots组成或者四个16B的数据块组成。
CXL.cache/CXL.mem Flit Header Definition
Type Encoding
Ak字段用作为链路层retry protocol的一部分,表示从远端Transmitter传递过来的flits 通过了CRC校验并成功接收。transmitter 置Ak位说明确认成功接收了8个flits。
BE Sz用来表示一个可变大小的数据信息。当所有字节使能时,link layer不用传送byte enable bits,而是清除相关flit header中的Byte Enable位。当receiver译码后发现该位清0,则会在传递数据信息到transaction layer之前重新生成全1的byte enable bits。如果BE置1,link layer Rx希望会有一个额外的数据块slot,它包含着字节使能信息。它位于相关请求的数据的最后一个slot。
Sz bit 置1,link layer Rx希望四个数据块slot,即一个全cacheline。为0的时候,它希望有2个数据块slot。
Credit Return
传输的每个消息类别都有独立的credit,如Request、Response、Data。
Slot Format Type fields
Link Layer Registers
CXL Link Layer Capability Register (Offset 0x0)
|--------------------------------|-----|--------------------------------------------|
| CXL Link Version Supported 3:0 | RWS | CXL 1.0 0001b CXL2.0 0010b |
| CXL Link Version Received 7:4 | RO | 从INIT.Param flit接收到的CXL 协议版本号 |
| LLR Wrap Value Supported 15:8 | RWS | 此实体支持的LLR Wrap value。用于调试 |
| LLR Wrap Value Received 23:16 | RO | 从INIT.Param flit接收到的LLR Wrap value |
| NUM_Retry_Received 28:24 | RO | Num_Retry 值反映在最后收到的 Retry.Req 消息中 |
| NUM_Phy_Reinit_Received 33:29 | RO | Num_Phy_Reinit 值反映在最后收到的Retry.Req memssage |
| Wr_Ptr_Received 41:34 | RO | Wr_Ptr值反映在最后收到的Retry.Ack message 中 |
| Echo_Eseq_Received 49:42 | RO | Echo_Eseq值反映在最后收到的Retry.Ack message中 |
| Num_Free_Buf_Received 57:50 | RO | Num_Free_Buf 值 反映在最后收到的 Retry.Ack message中 |
| No_LL_Reset_Support 58 | RO | set 1,表明不支持LL_Reset配置位 |
CXL Link Layer Control and Status Register (Offset 0x8)
|-------------------------------|-----|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| LL_Reset 0 | RW | 重新初始化,而不重置粘性Sticky寄存器中的值。 当设置了这个位时,会启动链路层复位。当链路层复位完成时,硬件将将该位清零为'0'。 触发 LL_Reset 的实体应确保链路静止。 |
| LL_Init_Stall 1 | RWS | 如果设置了该位,链路层将暂停传输 LLCTRL-INIT.Param flit,直到该位被清除。 |
| LL_Crd_Stall 2 | RWS | 如果设置了该位,链路层将暂停信用初始化,直到该位被清除。 |
| INIT_State: 4:3 | RO | 该字段反映了链路层的当前初始化状态,包括由位2:1控制的任何停顿(Stall)条件。 '00 --> NOT_RDY_FOR_INIT(停顿或未停顿):未发送LLCTRL-INIT.Param flit。 '01 --> PARAM_EX:已发送LLCTRL-INIT.Param,并正在等待接收。 '10 --> CRD_RETURN_STALL:参数交换成功,并且信用返回被暂停。 '11 --> INIT_DONE:链路初始化完成 - 已发送和接收LLCTRL-INIT.Param flit,且退还的初始信用未被暂停。 |
| LL_Retry_Buffer_Consumed 12:5 | RO | 链路层重试缓冲区已消耗的快照。 |
CXL Link Layer Rx Credit Control Register (Offset 0x10)
|----------------------------|-----|------------------------------------------------------|
| Cache Req Credits 9:0 | RWS | 在初始化时,通告的用于cache request的信用。默认值表示组件支持的缓存请求通道信用的最大数量。 |
| Cache Rsp Credits: 19:10 | RWS | 在初始化时,通告的用于cache rsp通道的信用。 |
| Cache Data Credits: 29:20 | RWS | 在初始化时,通告的用于cache data通道的信用 |
| Mem Req_Rsp Credits: 39:30 | RWS | 在初始化时,通告的用于mem req_rsp通道的信用。 |
| Mem Data Credits: 49:40 | RWS | 在初始化时,通告的用于mem data通道的信用 |
CXL Link Layer Rx Credit Return Status Register (Offset 0x18)
|----------------------------|----|--------------------------------|
| Cache Req Credits 9:0 | RO | 正在运行的累积 Cache Req信用的快照,以便进行返回。 |
| Cache Rsp Credits: 19:10 | RO | |
| Cache Data Credits: 29:20 | RO | |
| Mem Req_Rsp Credits: 39:30 | RO | |
| Mem Data Credits: 49:40 | RO | |
CXL Link Layer Tx Credit Status Register (Offset 0x20)
|----------------------------|----|--------------------------|
| Cache Req Credits 9:0 | RO | Tx:正在运行的 Cache Req信用的快照。 |
| Cache Rsp Credits: 19:10 | RO | |
| Cache Data Credits: 29:20 | RO | |
| Mem Req_Rsp Credits: 39:30 | RO | |
| Mem Data Credits: 49:40 | RO | |
CXL Link Layer Ack Timer Control Register (Offset 0x28)
|--------------------------------|-----|-----------------------------------------------------------------------------------------------------------------------------|
| Ack Force Threshold: 7:0 | RWS | 这指定了链路层在注入LLCRD之前应累积多少个Flit Acks。推荐的默认值是0x10(十进制16)。 如果配置为大于(接收到的LLR Wrap Value - 6)的值,行为将是未定义的。 如果配置为小于10h的值,行为将是未定义的。 |
| Ack or CRD Flush Retimer: 17:8 | RWS | 这指定在空闲状态下,实体在刷新累积的Acks或CRD之前应等待多少链路层时钟周期,然后使用LLCRD进行刷新。这适用于任何累积的Acks大于1或任何通道的累积CRD大于0的情况。推荐的默认值是0x20。如果配置为小于20h的值,行为将是未定义的。 |
CXL Link Layer Defeature Register (Offset 0x30)
|----------------|-----|-----------------------------------------------------------------|
| MDH Disable: 0 | RWS | 写入 '1' 来禁用 MDH。软件需要确保在上游(UP)和下游(DP)上一致地编程该值。编程后,需要进行热重置才能使禁用生效。 |
Flit Packing Rules
Link Layer Control Flit
链路层控制 flit 不遵循适用于协议 flit 的流量控制规则。也就是说,它们可以从实体发送,而不需要任何信用。这些 flit 必须在发送通道上传输 flit 的时间内由接收方进行处理和消耗,因为这些 flit 没有存储或流量控制机制。以下表格列出了 CXL.cache/CXL.mem 链路层支持的所有控制 flit。
在 CXL 2.0 中,将一个3位的 CTL_FMT 字段添加到控制消息中,使用了在 CXL 1.1 控制消息中保留的位。此字段用于区分在 CXL 2.0 控制消息中添加的需要较大的有效负载字段的格式。新格式将有效负载字段从64位增加到96位,并使用 CTL_FMT 编码 'b001。
LLCRD flit,返回的总flit确认数由创建Full_Ack返回值确定。Full_Ack = {Acknowledge[7:4],Ak,Acknowledge[2:0]}
LLCRD Flit Format (Only Slot 0 is Valid. Others are Reserved)
Retry Flit Format (Only Slot 0 is Valid. Others are Reserved)
Retry.Req和Retry.Ack flit属于接收设备即使之前有CRC错误也要响应的flit类型。除了检查Retry flit的CRC,接收设备还需要检查定义的位(硬编码为1/0值的位)。
Init Flit Format (Only Slot 0 is Valid. Others are Reserved)
IDE Flit Format (Only Slot 0 is Valid. Others are Reserved)
Link Layer Initialization
链路层必须在 物理层链路从link down转变为link up,并且链路成功训练至L0状态后 进行初始化。在初始化期间,Cache/Mem Link Layer发送了Init Flit之后,只能发送 Control-Retry flits直到完成Link初始化。
link layer初始化以及credits的交换:
- 链路层的发送部分(Tx)必须等到链路层的接收部分(Rx)至少接收到一个CRC校验正确的有效flit后,才能发送Control-INIT.Param flit。在满足此条件之前,链路层只能传输Control-Retry flit,即Retry.Frame/Req/Ack/Idle flit。
- 如果由于任何原因,链路层的接收部分(Rx)没有准备好开始处理除Control-INIT和Control-Retry之外的flit,发送部分(Tx)将会暂停传输LLCTR-INIT.Param flit。
- 在此期间,Retry.Frame/Req/Ack将作为常规Retry流的一部分被发送。
- 即使没有重试条件,也会在发送Init.Param flit之前发送Retry.Idle flit,以确保远程代理能够观察到一个有效的flit。
- Control-INIT.Param flit 必须是链路层传输的第一个非Control-Retry flit。
- 链路层的接收部分(Rx)必须能够在物理层初始化完成后立即接收Control-INIT.Param flit,因为第一个有效的flit可能是Control-INIT.Param。
- 接收到的Control-INIT.Param值(例如,LLR Wrap Value)必须"激活active",即在无误地接收Control-INIT.Param flit后的8个flit时钟内应用到各自的硬件状态。
- 在收到无误的INIT.Param flit并应用这些值之前,LLR wrap值应假定为默认值9,以用于ESEQ跟踪
- 在收到Control-INIT.Param之前,接收到任意一个非Retry-flits会触发Uncorrectable Error。
- 只发送一个 Control-INIT.Param flit。任何 Control-INIT.Param flit 的 CRC 错误情况将由重试状态机Retry state machine处理,并从链路层重试缓冲区重新播放。
- 在已经接收到 Control-INIT.Param flit 之后再次接收到 Control-INIT.Param flit 应被视为不可纠正的错误。
- 在链路初始化后,接收方需要使用标准的信用返回机制向发送方传送信用。每个实体应了解其拥有多少缓冲区,并将其信用返回计数器设置为这些值。然后,在正常运行期间,标准的信用返回逻辑将把这些信用返回给发送方。
- 在链路初始化后,信用交换机制将立即使用LLCRD flit格式。
- 接收方可能提供的信用数量可能超过发送方对于给定消息类别的跟踪能力。为了正确操作,因此要求发送方的信用计数器是饱和的。接收方将在不支持的通道(例如:Type 3 设备接收任何 CXL.Cache 信用)的接收中丢弃所有信用。
- 信用应根据希望实现的带宽水平进行调整,考虑信用返回延迟的往返时间。