27+

1. 第一阶段:初始化配置 (Initialization)

目标:使能 HN-I 的硬件检测逻辑,并将不可纠正错误路由至系统的故障中断(FHI)。

A. HN-I 本地配置 (Local Node Level)

  1. 节点识别:Discovery 流程中识别 node_type == 0x6 (HN-I),获取 HNI_BASE

  2. 配置 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

  3. 状态清理:向 por_hni_errstatus (Offset 0xE010) 写入 ~0ULL 执行 W1C

B. HN-D 全局配置 (Global SRA Level)

  1. 解除 SRA 组屏蔽:在 HN-D 节点找到管理该 HN-I 的 SRA 组。

  2. 配置 por_sra_errctlr (HN-D 偏移 0x7008 等)

    • Bit [3] FI = 1Bit [0] ED = 1

    • 确保全局开关放行该组的所有故障信号。


2. 第二阶段:中断处理流程 (Interrupt Handling)

当 UE 触发 FHI 时,固件应遵循以下精确的寄存器读取和分析顺序。

步骤 1:定位报错节点

  1. 读取 HN-D 的 SRA 位图:sra_status = READ_REG64(HND_BASE + 0x7010)

  2. 通过位偏移定位具体的 HNI_ID

步骤 2:读取 UE 详情记录 (基于 Table 8-444)

访问 HN-I 本地 RAS 块(HNI_BASE + 0xE000):

  1. 读取 status = READ_REG64(HNI_BASE + 0xE010)

    • 确认 Bit [30] V == 1 (有效) 且 Bit [29] UE == 1 (不可纠正)。

  2. 关键位解析

    • 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:日志打印记录

Plaintext
 
[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 编码的处理动作

  1. UET = 0b00 (UC - Uncontainable)

    • 性质:发生了诸如内部协议控制器死锁或严重奇偶校验错误。

    • 动作立即复位 (System Reset)。因为系统的一致性状态和 I/O 路由可能已损坏。

  2. UET = 0b01 (UET - Transparent)

    • 性质:HN-I 已将坏数据打上 Poison 标签发给了 PCIe 读请求者。

    • 动作:记录日志并上报。由于数据已带毒传播,等待受影响的设备驱动程序触发异常处理。

  3. 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)

这是防止中断风暴的关键步骤。

  1. 清理 HN-I 节点记录

    • WRITE_REG64(HNI_BASE + 0xE010, status) (将读取到的 status 原样写回)。

  2. 清理 HN-D 全局汇总位图

    • WRITE_REG64(HND_BASE + 0x7010, (1ULL << (node_id % 56)))

    • 注意:必须先清本地,再清全局,最后向 GIC 发送 EOI。

posted @ 2020-05-29 17:19  qiuqiu95  阅读(178)  评论(0)    收藏  举报