27+
1. 第一阶段:初始化配置 (Initialization)
目标:使能 HN-I 的硬件检测逻辑,并将不可纠正错误路由至系统的故障中断(FHI)。
A. HN-I 本地配置 (Local Node Level)
-
节点识别:Discovery 流程中识别
node_type == 0x6(HN-I),获取HNI_BASE。 -
配置
por_hni_errctlr(Offset 0xE008):-
Bit [3] FI (Fault Handling Interrupt enable):置 1。使 UE 触发 FHI。
-
Bit [2] UI (Uncorrected Interrupt enable):置 1。使能不可纠正错误中断。
-
Bit [0] ED (Error Detection enable):置 1。开启硬件检测。
-
寄存器值:
0xD。
-
-
状态清理:向
por_hni_errstatus(Offset 0xE010) 写入~0ULL执行 W1C。
B. HN-D 全局配置 (Global SRA Level)
-
解除 SRA 组屏蔽:在 HN-D 节点找到管理该 HN-I 的 SRA 组。
-
配置
por_sra_errctlr(HN-D 偏移 0x7008 等):-
Bit [3] FI = 1,Bit [0] ED = 1。
-
确保全局开关放行该组的所有故障信号。
-
2. 第二阶段:中断处理流程 (Interrupt Handling)
当 UE 触发 FHI 时,固件应遵循以下精确的寄存器读取和分析顺序。
步骤 1:定位报错节点
-
读取 HN-D 的 SRA 位图:
sra_status = READ_REG64(HND_BASE + 0x7010)。 -
通过位偏移定位具体的
HNI_ID。
步骤 2:读取 UE 详情记录 (基于 Table 8-444)
访问 HN-I 本地 RAS 块(HNI_BASE + 0xE000):
-
读取
status = READ_REG64(HNI_BASE + 0xE010):-
确认 Bit [30] V == 1 (有效) 且 Bit [29] UE == 1 (不可纠正)。
-
-
关键位解析:
-
Bits UET (Uncorrected Error Type):判断错误严重等级。
-
0b00(UC): 无法包含,最致命。 -
0b01(UET): 透明,已标记 Poison。 -
0b10(UER): 可恢复,软件可尝试干预。
-
-
Bit [31] AV (Address Valid):若为 1,读取
HNI_BASE + 0xE018获取 I/O 地址。 -
Bits [7:0] SERR (Service Error):获取硬件故障原因。
-
步骤 3:日志打印记录
[RAS_HNI_UE] FATAL: Uncorrected Error in HN-I #%d
[RAS_HNI_UE] Status: 0x%016llx (UE=1, V=1)
[RAS_HNI_UE] UET_Type: 0x%x (%s)
[RAS_HNI_UE] SERR_Code: 0x%02x
[RAS_HNI_UE] Fault_Addr: 0x%016llx
3. 第三阶段:错误处理决策与行动
HN-I 的 UE 往往涉及外部 I/O 通信,处理必须果断。
A. 基于 UET 编码的处理动作
-
UET = 0b00 (UC - Uncontainable):
-
性质:发生了诸如内部协议控制器死锁或严重奇偶校验错误。
-
动作:立即复位 (System Reset)。因为系统的一致性状态和 I/O 路由可能已损坏。
-
-
UET = 0b01 (UET - Transparent):
-
性质:HN-I 已将坏数据打上 Poison 标签发给了 PCIe 读请求者。
-
动作:记录日志并上报。由于数据已带毒传播,等待受影响的设备驱动程序触发异常处理。
-
-
UET = 0b10 (UER - Recoverable):
-
性质:错误被拦截在 HN-I 桥接层。
-
动作:尝试复位受影响的 I/O 接口(如执行 PCIe Link Reset),而不必复位整个 Mesh 互连网络。
-
B. 基于 SERR 的特殊处理
-
SERR 0x12 (Response Error):下游设备返回了非法响应。可能是 PCIe 显卡或 NVMe 盘挂了。固件应记录此事件并尝试下线该外设。
-
SERR 0x22 (Internal Parity):HN-I 内部数据路径损坏。通常需作为 UC 错误处理,强制复位。
4. 第四阶段:状态清理 (W1C Cleanup)
这是防止中断风暴的关键步骤。
-
清理 HN-I 节点记录:
-
WRITE_REG64(HNI_BASE + 0xE010, status)(将读取到的 status 原样写回)。
-
-
清理 HN-D 全局汇总位图:
-
WRITE_REG64(HND_BASE + 0x7010, (1ULL << (node_id % 56)))。 -
注意:必须先清本地,再清全局,最后向 GIC 发送 EOI。
-

浙公网安备 33010602011771号