Pcode

Xe PCODE 是负责与 PCODE 固件接口的组件。它应为其他 Xe 组件提供一个非常简单的 ABI,但应是与 PCODE 通信的唯一和整合的地方。所有对 PCODE 的读取和写入操作都将是内部的且对此组件私有的。

下一步: - PCODE 硬件指标 - 用于显示操作的 PCODE

内部 API

int xe_pcode_request(struct xe_tile *tile, u32 mbox, u32 request, u32 reply_mask, u32 reply, int timeout_base_ms)

发送 PCODE 请求直到确认

参数

struct xe_tile *tile

tile

u32 mbox

PCODE 邮箱 ID,请求的目标

u32 request

请求 ID

u32 reply_mask

用于检查请求确认的掩码

u32 reply

用于检查请求确认的值

int timeout_base_ms

启用抢占的轮询超时

描述

持续将 request 重新发送到 mbox,直到 PCODE 确认、PCODE 报告错误或 timeout_base_ms+50 毫秒的总超时到期。一旦 PCODE 回复 dword 在应用 reply_mask 后等于 reply,请求就被确认。轮询首先尝试启用抢占 timeout_base_ms,如果超时,则在禁用抢占的情况下再轮询 50 毫秒。

成功返回 0,超时情况下返回 -ETIMEDOUT,PCODE 报告的其他错误返回 <0。

int xe_pcode_init_min_freq_table(struct xe_tile *tile, u32 min_gt_freq, u32 max_gt_freq)

初始化 PCODE 的 QOS 频率表

参数

struct xe_tile *tile

tile 实例

u32 min_gt_freq

最小 (RPn) GT 频率,单位为 50MHz。

u32 max_gt_freq

最大 (RP0) GT 频率,单位为 50MHz。

描述

此函数初始化 PCODE 的 QOS 频率表,以便根据当前请求的 GT 频率做出正确的最小频率/功率指导决策。对于较旧的平台,这是一个更完整的表,包括 IA 频率。然而,对于最新的平台,此表变成了一个简单的 1-1 Ring vs GT 频率。即便如此,如果不设置它,PCODE 可能不会为某些内存频率做出正确的决定,并影响延迟。

成功返回 0,失败返回 -ERROR 数字,如果最大频率高于最小频率,则返回 -EINVAL,其他错误直接从 PCODE 错误返回转换而来: - -ENXIO: “非法命令” - -ETIMEDOUT: “超时” - -EINVAL: “非法数据” - -ENXIO, “非法子命令” - -EBUSY: “PCODE 已锁定” - -EOVERFLOW, “GT 比率超出范围” - -EACCES, “PCODE 拒绝” - -EPROTO, “未知”

int xe_pcode_ready(struct xe_device *xe, bool locked)

确保 PCODE 已初始化

参数

struct xe_device *xe

xe 实例

bool locked

如果持有锁为 true,否则为 false

描述

PCODE 初始化邮箱仅在根 tile 的根 gt 上轮询,因为根 tile 仅在所有 tile 完成初始化后才提供初始化完成。仅在没有锁的早期探测和恢复路径中的锁调用。

成功返回 0,失败返回 -error 数字。

void xe_pcode_init(struct xe_tile *tile)

初始化 PCODE 的组件

参数

struct xe_tile *tile

tile 实例

描述

此函数初始化 xe_pcode 组件。仅在探测期间调用一次。

int xe_pcode_probe_early(struct xe_device *xe)

初始化 PCODE

参数

struct xe_device *xe

xe 实例

描述

此函数检查 PCODE 的初始化状态。仅在没有锁的早期探测期间调用一次。

成功返回 0,否则返回错误代码

启动生存能力

启动生存能力是一种基于软件的工作流程,用于在启动失败状态下恢复系统。这里系统可恢复性与恢复负责启动的固件有关。

这是通过加载具有最低限度的驱动程序(没有 drm 卡)来实现的,允许通过 mei 刷新固件并收集遥测数据。修改驱动程序的探测流程,使其在 pcode 初始化不完整且启动状态表示失败时进入生存模式。

也可以使用通过 configfs 提供的生存模式属性手动进入生存模式,这在多个用例中是有益的。它可用于解决 pcode 未检测到故障或用于验证目的的情况。它还可用于现场维修 (IFR),以修复单个卡,而不会影响节点中的其他卡。

使用以下命令手动启用生存模式

# echo 1 > /sys/kernel/config/xe/0000:03:00.0/survivability_mode

有关如何使用 configfs 的更多详细信息,请参阅 Xe Configfs

生存模式由以下仅管理员可读的 sysfs 指示,它提供额外的调试信息

/sys/bus/pci/devices/<device>/surivability_mode
功能信息

提供启动状态

邮政编码信息

提供有关失败的信息

溢出信息

提供先前失败的历史记录

辅助信息

某些故障可能除了邮政编码信息外还有其他信息