CXL-transaction layer-cxl.io

类似于 PCIe 的 I/O 语义

根据特定的加速器使用模式,可以启用CXL所有协议或仅启用协议的一个子集;但对于发现和枚举、错误报告和主机物理地址(HPA)查找等操作,CXL.io 总是必需被启用

CXL.io 事务层

主要功能:TLP 的装配和拆解,流量控制机制及事务排序管理

当发送设备接收到来自应用层的数据包,事务层会将其装配成 TLP 向下发送至链路层和物理层,之后通过根复合体(Root Complex,RC)到达对端接收设备。数据包在接收设备中向上传输至事务层,在事务层中完成数据信息的接收,将其中包含的信息转发到应用层

image.png

  • TLP 格式

CXL.io 的数据信息经由事务层被装配为若干个 TLP,接着 TLP 在 CXL.io 总线的各层次中完成相应的控制处理后传输到对端设备

image.png

TLP 格式

一个完整的 TLP 由 1 个或者多个 TLP 前缀(TLP Prefix)、TLP 包头(TLP Header)、数据有效负载(Data Payload)和 TLP 摘要(TLP Digest)组成

TLP 前缀是由 TLP 包头决定的可选项

TLP 包头含有 TLP 最重要的标识信息,如 TLP 总线事务类型、中断信息、路由方式等,长度为 3 或 4 个双字(Double Word,DW),其格式及内容由事务类型决定

数据负载域长度为 0 到 1024DW,用于传送有效数据,该域也为由 TLP 包头事务类型决定的可选项,因为并不是所有的事务请求都需要搭载数据负载

TLP 摘要域是基于 TLP 包头和有效数据负载计算出的循环冗余检验码(Cyclic Redundancy Check Code,CRC),称为端对端CRC(Endpoint to endpoint CRC,ECRC),由 TLP 包头配置的可选项

image.png

包头通用结构

TLP 包头长度为 3-4 个 DW。通用 TLP 包头保存在第 1 个双字和第 7 个字节中,剩下的字段的内容随 Type 字段改变而改变。通用 TLP 包头含有众多字段,各个字段含有 TLP 不同的标志信息。

image.png

通用 TLP 包头字段

image.png

image.png

  • 总线事务类型

    按照功能差异事务类型分为 4 类:存储器、I/O、配置和消息

       每种类型分读写两个方向,且事务被定义为向目标设备发送命令的请求包和目标设备作为响应发回的完成包(Completion 或 Completion with Data,Cpl 或 CplD)。

       按照传输方式分为 :转发(Posted,P)事务和非转发(Non-Posted,NP)事务

       非转发事务请求,发送方传送一个请求数据包,接收方以对应完成包的形式生成响应;任何读取请求包都为非转发事务,请求都不会被提交,因为读请求的数据是在接收到的完成包中返回;IO 写和配置写也属于非转发事务,为命令传递数据,这些请求期望从目标接收到完成包以确认写数据已经无误地到达了目的地。

image.png

CXL.io 链路层

在其上的事务层和其下的物理层之间进行信息传递。将链路层视为管理级别较低的链路协议。

主要功能:确保在设备之间传输数据的完整性,能够进行错误检测和错误纠正, TLP 流量控制和链路初始化

路由:网络中数据包从源到达目的地的路径选择和转发过程

image.png

  • DLLP格式

    共 8 个字节。DLLP 不携带目标或路由信息,只用于相邻设备间的通信,不会被路由

    一个完整 DLLP,除去物理层添加的 1 个字节起始控制符号和 1 个字节结束控制符外,剩下的 6 个字节为通用 DLLP,其中 4 个字节为 DLLP 主要部分,包含了 1 个字节的 DLLP 类型字段和 3 个字节的附加属性字段,属性随 DLLP 类型的不同而不同;剩余部分是根据 DLLP 内容计算出的 2 字节 CRC 值

    DLLP 包的类型可分为 4 种:Ack/Nak DLLP、PM DLLP、流量控制(Flow Control,FC)DLLP 和厂商定义(Vendor-specific)DLLP,其中除最后一类均属链路管理

       Ack/Nak DLLP,在 Ack/Nak 机制中由接收设备发向发送设备,保证 TLP 的可靠传送,Ack DLLP 表示TLP 被正确接收,Nak DLLP 表示 TLP 出现错误,请求发送设备重传

       PM DLLP 用来保证电源管理状态机无误的运行并向对端报告当前链路状态

       FC DLLP 用于流量控制机制的初始化和运行时信用的更新管理

image.png

通用 DLLP 格式

  • Ack/Nak 机制

       基于硬件的自动机制,确保 TLP在链路上的正确传输

       在链路层中为每一个 TLP 中添加了一个名为 LCRC(Link Cyclic Redundancy Code)的错误校验码

       错误检测的第一步是验证 LCRC 在接收端是否正确且为每个 TLP 标记唯一的递增序列号(Sequence Number),可以很容易从已经发送的 TLP 中找出哪个 TLP 遇到了错误

       规则要求 TLP 必须以发送时的相同顺序正确接收,在接收端链路层能很容易检测到丢失的 TLP

       接收端通过返回 Ack DLLP 通知发送端已接收到正确 TLP

       发送设备若接收到 Nak DLLP 表明接收设备至少接收到了一个错误 TLP。在这种情况下,发送端将重传该 TLP,以修复短暂的传输错误。

image.png

事务层,数据链路层和物理层的详细的功能图

电源管理VDM(事务层)

电源管理的消息使用PCIE Vendor Defined Type0 类型的消息,并带有4DW的数据载荷。包括的消息是 PMREQ、PMRESP、PMGO(这些消息位于字段PM Logical Opcode)

image.png

Fmt和Type字段设置为指示带有数据的消息。

Vender ID字段设置为1E98h

所有消息都使用“接收方本地终止”

4 DW数据有效载荷包含CXL PM逻辑操作码(例如,PMREQ、GPF)和与CXL PM消息相关的任何其他信息

如果CXL组件接收到有毒的PM VDM(EP=1),则接收器应丢弃此消息。由于接收器在收到此类VDM后能够继续正常操作,因此应将此事件视为建议性非致命错误

如果接收器电源管理单元(PMU)不理解PM VDM有效负载的内容,则应无声地丢弃该消息,并且不应发出无法纠正的错误信号

image.png

image.png

数据有效负载字段

Credit 和PM初始化

image.png

使用CREDIT_RTN和AGENT_INFO来初始化电源管理消息

PM2IP是主机发给设备的电源管理消息,而IP2PM是设备发给主机的电源管理消息

上游端口(Upstream Port)指的是设备的端口;下游端口(Downstream Port)是主机端口

Credit 机制

用于管理数据传输的流量控制机制。CXL 是一种高性能、高带宽的互连技术,用于连接处理器、加速器、内存和其他设备,旨在提供高效的数据传输和共享资源的能力。Credit 机制的基本原理是在发送方和接收方之间维护一个信用值(Credit),用于表示接收方可以接收的数据量。当发送方想要发送数据时,首先检查接收方的信用值,如果信用值足够,则发送数据;如果信用值不足,则等待接收方释放信用或根据一定的策略进行处理,以避免数据丢失或网络拥塞。

CXL上游端口PMU必须实现足够的资源能够接收和处理CREDIT_RTN消息,而不依赖于任何其它PM2IP消息

在启动任何IP2PM消息之前,上游端口PMU必须等待来自下游端口PMU的CREDIT_RTN消息

上游端口PMU必须实现至少一个信用,有足够的缓冲来接收具有128位有效载荷的PM2IP消息

上游端口PMU必须尽快向下游端口PMU返回信用,以防止通过CXL链路阻塞电源管理消息通信。

建议上游端口PMU占用信用额度不得超过10us。

CREDIT_RTN消息不消耗发送方的信用值,是用来做信用授权,用于初始化和更新每侧的TX信用,以便可以适当地管理流量控制

PM2IP.CREDIT_RTN(Target_Agent_ID, Num_Credits=1) , 这个消息里面包含了2个内容,一个是Target_Agent_ID,在Payload[14:8]里可以找到。主机给了设备1个信用值

第一条CREDIT_RTN消息,通过NUM_CREDITS字段发送的信用表示CREDIT_RTN的发起方可以从另一端接收的信用相关PM消息的数量

后续CREDIT_RTN消息期间,NUM_CREDITS字段表示自上一条CREDIT_RTN消息以来在同一方向释放的PM信用数

下游端口PMU使用第一条CREDIT_RTN消息为上游端口PMU分配PM_AGENT_ID。此ID通过CREDIT_RTN消息中的TARGET_AGENT_ID字段进行通信

在初始化信用授权结束之后,设备必须等待主机先发送AGENT_INFO消息,该消息包括了主机的Revision ID,之后,设备必须回答一个AGENT_INFO消息给主机,AGENT_INFO消息是消耗信用

主机接收到来自设备的Revision ID,如果与主机自己的相匹配,那就可以正常工作了。如果不匹配,那么主机就做兼容性的尝试,降低自己的Revision

CXL错误VDM格式

按PCIe VDM Type 0消息发送,无数据有效载荷。目前,该类包括一种单一类型的消息,即内存错误固件通知(MEFN)

Fmt和Type字段设置为指示没有数据的消息。

使用路由“Routed to Root Complex”发送,总是由设备启动。

Vendor ID字段设置为1E98h

字节15包含VDM代码,并设置为“CXL错误消息”的值。

字节8、9、12、13在0s清零。

字节14[7:4]设置为0。[3:0]用于传送固件中断向量。FW中断矢量字段的编码是特定主机的,不由CXL规范定义。主机可以支持多种类型的固件环境,可用于向主机指示这些环境中的哪个将处理此消息

image.png

CXL所需的可选PCIe功能

image.png

错误传播

设备检测到的 CXL.cache 和 CXL.mem 错误会通过 CXL.io 流量流向上游传播。这些错误将作为可纠正和不可纠正的内部错误记录在检测组件的 PCIe AER 寄存器中。

ATS 上的内存类型指示

ATS :PCIe基本规范中定义的地址转换服务,I/O Function常采用DMA方式访问内存。一般I/O Function看到的物理地址空间与CPU一样。但有时候,I/O Function看到的地址空间不是真实的物理地址,需要RC将DMA请求进行处理,通过一次地址转换才能将访问到真实的物理地址。这种地址转换机制有利于访问权限检查。

image.png

对某些内存区域的请求只能在 CXL.io 上发出,不能在 CXL.cache 上发出,这些内存区域由主机决定。例如x86 系统上,主机可选择限制 CXL.io 只访问不可缓存(UC)类型的内存。

主机会在 ATS 完成时向设备指示这些区域

来自 CXL 设备的 ATS 请求必须设置 CXL Src 位

0 = 表示由不支持 ATS 上 CXL.io 指示的功能发起的请求。

1 = 表示由支持 ATS 上 CXL.io 指示的功能启动的请求。

image.png

带 CXL 指示的 ATS 64 位请求

来自主机的 ATS 转换完成会在转换完成数据项中携带 CXL.io 位

当请求中的 CXL Src 位被设置时,ATS 转换完成中的 CXL.io 位有效。

0 = 可通过所有 CXL 协议向页面发出请求。

1 = 功能只能在 CXL.io 上向页面发出请求。使用 CXL.cache 协议向页面发出请求是违规行为。


 

可延迟写入

PBR TLP 标头 (PTH)

PBR 链路上,除 NOP-TLP 外,所有 .io TLP 都带有一个固定的1 DWORD 标头字段,称为 PBR TLP 标头 (PTH)。

PBR 链路既可以是交换机间链路(ISL),也可以是从 PBR 交换机到 G-FAM 的边缘链路

为了帮助 PBR 链路上的接收器从 NOP-TLP/Local-Prefix中区分 PTH,PCIe flit 模式TLP 语法修改如下。

从 TLP 的第一个 DWORD 开始,直到检测到 PTH,所有DWORD 第一个字节的位[7:6]编码如下:

00b = NOP-TLP

01b = Rsvd

10b = Local-Prefix

11b = PTH

接收器检测到 PTH 后,将根据 PCIe 基本规范应用 PCIe TLP 语法规则,直到 TLP 结束,但 NOP-TLP 和Local-Prefix不能在 TLP 的这一区域内传输。

发送方规则:对于 NOP-TLP 和Local-Prefix类型字段编码,不预置 PTH;对于1 类型的所有其他字段编码,PTH 将紧接在标头前面预置。

接收方规则:对于 NOP-TLP,如果位[5:0]不全是 0,接收器会将其视为畸形数据包,并按照相关的报错规则报错;对于Local-Prefix,如果位[5:0]不是 00 1101b 至 00 1111b 之一,接收器会将其视为畸形数据包,并按照相关报错规则报错;从 TLP 开始到检测到 PTH 时,如果 DWORD 中的位[7:6]的保留值为 01b,接收器会静默丢弃一个 DWORD;如果在 PTH 之后立即收到 NOP-TLP 或Local-Prefix,接收器会将其视为畸形数据包,并按照相关报错规则报错

image.png

CXL DevLoad (CDL) field in UIO completions

CXL Fabric-related VDM

fabric

image.png

image.png

两种类型编码,一种是不含数据的 VDM,另一种是含数据的 VDM,两者都以 "在接收端终止 "的方式路由。如果不需要有效载荷,则使用不带数据的 VDM。如果需要任何有效载荷,则使用带数据的 VDM。由于 PBR VDM 使用PTH 进行路由,因此 "接收方 "就是隧道的末端(即匹配的 DPID)。带数据的PBR VDM 最多可以有 128B(=32 DWORD)的有效载荷。如果 SeqLen 超过 32DWORD,则需要多个 VDM 才能传输整个 VDM 序列(对于 UCPull VDM)。

根据 CXL VDM 编码的不同,VDM 标头中的其他字段可能也有意义。这些附加字段的使用将在涉及特定编码的章节中定义。这些字段包括

PBR 操作码:PBR Fabric VDM 的子类

CmdSeq:主机管理事务流程的序列号

SeqLen:VDM 序列的长度,适用于 UCPull VDM

SeqNum:如果报文需要多个顺序 VDM,则带换行的顺序 VDM 计数

GFD 的主机管理事务流程

image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值