RAS即Reliability、Availability和Serviceability。CXL的RAS能力是基于PCIe协议的。额外引入了一些特性来解决缓存一致性和内存问题。
1. CXL支持的RAS特性
下表列出了CXL具体支持的RAS特性,包括链路CRC和Retry、链路重训练和恢复、ECRC、Data poison、Viral等。
2. CXL错误处理
CXL可以同时承载三种协议:CXL.io,CXL.cache和CXL.mem。CXL.io具有类似pcie的语义,所有CXL Endpoint必须支持。
下图展示了CXL和CXL RAS相关内容。
链路和协议RAS,适用于CXL组件到组件的通信机制。
设备RAS,只适用于设备本身。
CXL Device错误处理:
当CXL设备返回坏的或可疑的数据时,必须确保数据的使用者知道,无论是在使用数据时还是使用之前。这允许使用者采取遏制措施。
CXL定义了两种错误遏制机制,poison和viral:
poison:CXL.io和CXL.cachemem的返回数据可能被标记为poison。
viral:CXL.cachemem支持viral,主要用于指示设备上更严重的错误情况。
当Metadata被怀疑时,设备必须在CXL.cachemem返回响应中将MetaField设置为No-Op。
如果CXL组件不在viral状态,则只要已知数据是坏的或可疑的,该组件就会将CXL接口上的数据消息标记poison。
如果使能viral,并且CXL组件处于viral状态,建议组件不要将CXL.cachemem接口上的后续数据响应标记poison,以避免错误污染。
Host可能向CXL连接的设备发送poison数据。CXL设备如何响应poison是设备特有的,但必须遵循PCIe指导。设备必须清楚如何处理poison数据。在某些情况下,简单地忽略poison数据可能会导致静默数据损坏(Silent data Corruption,SDC)。CXL设备需要以64字节粒度记录设备接收的poison数据。
由于没有错误引脚,不能用poison指示处理的设备错误应该由设备通过message返回到主机。为此,表12-2总结了错误类型及其映射。
对于实现了Memory Error Logging和Signaling Enhancement的设备,这些设备应该按照表12-2处理所有非内存错误。
3. CXL.cache和CXL.mem的Isolation
CXL.cache和CXL.mem的隔离是CXL Root Port(RP)的可选标准能力。这种隔离将停止各自协议上的通信。此外,一旦触发,RP将综合该协议上所有pending和后续事务的响应。
CXL规范定义了两种触发机制:
Link Down。如果RP支持CXL.cache隔离,并且软件使能CXL.cache隔离,则Link Down将无条件触发CXL.cache隔离。如果RP支持CXL.mem隔离,且软件使能CXL.mem隔离,则Link Down将无条件触发CXL.mem隔离。
事务超时。支持CXL.cache隔离的RP可以配置成这样一种方式,即CXL.cache超时触发CXL.cache隔离。CXL.mem也是同理。
4. CXL Viral 处理
CXL链路和CXL设备需要支持viral。viral是一种错误遏制机制。平台必须在启动时使能viral。viral的host实现允许平台通过写入寄存器来启用viral功能。类似地,写入设备上的BIOS可访问控制寄存器以使能设备上的viral。viral的支持和使能控制在DVSEC寄存器中。
使能后,只要检测到Uncorrected_Fatal错误,就会产生viral指示。viral并不是现有错误报告机制的替代,它是一种额外的错误遏制机制。错误检测器通过AER报告错误并产生viral指示。任何能够报告Uncorrected_Fatal错误的实体也必须能生成viral指示。
CXL.cache和CXL.mem预先使能了viral。viral需要双向传播。当viral功能启用且host遇到viral状态时,host应通过CXL.cache和/或CXL.mem与下游组件传递viral。viral指示必须在可能受到错误影响的数据之前到达。如果主机收到来自任何CXL组件的viral指示,主机应将viral传给所有下游组件。
所有类型的Convention复位都应清除viral状态。CXL复位和FLR复位对viral状况没有影响。
Device考虑:
尽管设备对viral的反应是特定于设备的,但期望设备采取与viral要求一致的错误遏制措施。设备必须阻止坏数据被提交到永久存储中。如果设备连接到永久存储或连接到连接永久存储的外部接口,则设备需要自我隔离以符合viral兼容,即设备必须不依赖主机帮助而采取遏制措施。
设备采取的遏制措施不能阻止主机继续前进。这对于判断和避免错误污染很重要(例如,将读事务的数据保留到设备内存可能会导致主机超时)。因此,在viral检测时,除满足遏制要求外,设备还应:
Drop写入到设备上或连接到设备的持久化HDM区域。
始终返回一个完成响应。
在所有包含MetaField的响应中将MetaField设置为No-Op。
当试图将状态从dirty修改为clean时,执行Set Shutdown State命令失败,并出现内部错误。
在GPF流程后,不要将Shutdown状态转换为clean状态。
在收到viral条件之前,通过CXL接口完成的任何写操作提交到持久HDM范围。
保持对snoop的响应。
完成对主机内存的pending写。
完成对设备易失性内存的所有读写。
当设备进入viral状态且viral使能时,设备应:
设置Viral Status bit,表示发生了viral。
遏制。将错误遏制在设备中,并按上面列出的步骤进行操作。
将viral状态反馈给CXL.cache和CXL.mem,传至host。将viral传给虚拟层次结构中的所有设备,包括host。
5. Maintenance
维护操作包括media维护、media测试、模块测试等。维护操作由维护操作类和维护操作子类标识。设备可以支持与一个维护操作类相关的一个或多个维护操作子类。
设备可能通过事件记录来通知系统软件或固件需要进行维护操作。当设备需要维护时,Event Record Flags中的Maintenance Needed bit设置为1,推荐维护操作的类别由Maintenance Operation Class字段表示。
Perform Maintenance命令发起维护操作。要执行的维护操作由Maintenance Operation Class字段和Maintenance Operation Subclass字段指定。
6. CXL Error Injection
错误注入机制的目的是允许系统验证和系统固件/软件开发等创建错误场景和错误处理流程。为此,建议CXL上游端口和下游端口实现以下错误注入到指定的地址:
一种CXL.io UC错误(可选,与PCIe类似)。
一种CXL.cache UC错误
一种CXL.mem UC错误
Link Correctable error:包括Transient error和Persistent error。
在读取到指定地址时返回Poison?(只用于CXL.mem)。
参考:CXL?Specification?3.0/3.1
349