1. Data Error和Non-data Error
CHI协议支持了两种在packet层次上的错误上报(error reporting),分别为Data Error (DERR)和Non-data Error (NDERR)。这两种error通过RespErr域段传递,RespErr域段可用于Response和data channel的packets。以下是RespErr域段的译码。
可以看出RespErr==0b10时DERR,RespErr==0b11是NDERR。对于1个transaction里,混合了EXOK和DERR响应是允许的,但不允许EXOK和NDERR响应混合。下面分别讲下它们。
- Data Error, DERR:这种error是发生在可以正确访问地址,但地址中的data发生错误了。典型例子是由于ECC或parity检查导致的数据损坏。DAT packet中的RespErr、Poison和DataCheck域段支持Data Error。
- Non-data Error, NDERR:这种error是用在和数据损坏无关的场景。CHI spec没有定义上报这种error的全部场景。在RSP和DAT packets的RespErr域段支持Non-data Error。Non-data Error场景通常有:
- 访问的一个地址不存在;
- 非法访问,比如写到RO地址上;
- 使用1个不支持的transaction;
即使error response,所有的transaction flow都仍然要按照兼容协议的行为完成。
2. Poison和DataCheck
Poison用于标识一组data bytes是否先前已被损坏,它通常在DAT packets中伴随着data一块传递,这样允许在未来时刻用户可以发现data发生损坏了。当支持Poison时:
- DAT packet的每64-bit data需要用1-bit Poison;
- Data如果被标识为poisoned,那么它一定不能被任何requester使用,但允许它存到cache和memory里,未来有requester用到它的时候再报错,也就是延迟上报错误;
- Poison的值一旦设置了,它必须跟随data一起传输;
- 当1个poison error检测到,允许更过度poison data。也就是说假如只有1个64-bit data发生poisoned了,那么可以认为整个cacheline都poisoned了;
- MTE tags不支持poison;
如果data是无效的,那么poison可以为任意值;如果data是有效的,那么poison必须要为精确值。
DataCheck域段用于检查DAT packet中的data errors,每64-bit的data支持8-bit的DataCheck,所以相当于是1-bit DataCheck保护8-bit data的。DataCheck其实就是校验位,用于产生奇校验的校验位。
3. DERR, Poison和DataCheck之间的转换
如果data packet不支持poison或datacheck特性,那么interconnect必须将它们转成DAT packet的Data Error(DERR)。
如果对Poison和DataCheck特性的支持在接口上不一致,那么应采用以下规则:
- 如果Poison不支持的话,Poison必须映射到DataCheck或DERR。在这样的interface上,如果支持DataCheck的话,CHI spec期望优先映射到DataCheck域段上。因此在将poison转换到DataCheck时,如果有1-bit poison问题,那么对应的8-bit DataCheck都要进行操作来产生parity错误。
- 如果DataCheck不支持的话,DataCheck必须映射到Poison或DERRICK。在这样的interface上,如果支持Poison的话,CHI spec期望优先映射到Poison域段上。因此在将DataCheck转换到Poison时,如果64-bit data单位内有任意bit的DataCheck发生parity错误,这64-bit对应的poison位就要设置为1。
在处理Poison和DERR上的区别是,接收端通常会延迟上报接收data packets中的poison错误,而接收端通常不会延迟上报DERR中的错误。
对于发送端来说,只需要指示出Data packet有poison错误的data就可以了,不需要再把RespErr域段标识为DERR。
对于发送端来说,只需要指示出Data packer中有DataCheck错误的data就可以了,不需要再把RespErr域段标识为DERR。
由于Poison和DataCheck域段是独立设置的,因此其中一种错误类型不需要设置另一种错误类型的。
如果Data packet中的RespErr域段的值为DERR或NDERR,那么Poison和DataCheck域段就不适用了,可以为任意值。
4. 总结
总结来说,CHI支持两种packet level的error上报机制:DERR和NDERR。两种sub-packet level的error上报机制:Poison和DataCheck。sub-packet level的两种机制可以升级到packet level的DERR,但是packet level error无法下降到sub-packet level error。如果发生error reporting方式转换,sub-packet level优先内转,实在不行,再升级转到packet level的DERR。
如果RespErr上报为DERR或NDERR,那么sub-packet level的error reporting可以被忽视;
只有RespErr不为DERR或NDERR时,sub-packet level的error reporting才有意义。
Poison和DataCheck的设置是独立的,并且发送端如果确定使用它们就足够标识出data错误的话,不需要再把RespErr域段标识为DERR,这样会多此一举,扩大data错误范围了。