寄存器表处理¶
内部基础设施,用于定义如何根据规则和操作更新寄存器。它可以用于定义具有多个条目(每个寄存器一个)的表,这些表将在某个时间点被遍历,以将值应用于具有匹配规则的寄存器。
内部 API¶
-
struct xe_rtp_action¶
针对任何匹配规则采取的操作
定义:
struct xe_rtp_action {
struct xe_reg reg;
u32 clr_bits;
u32 set_bits;
#define XE_RTP_NOCHECK .read_mask = 0;
u32 read_mask;
#define XE_RTP_ACTION_FLAG_ENGINE_BASE BIT(0);
u8 flags;
};
成员
reg
寄存器
clr_bits
更新寄存器时要清除的位。它始终是被修改位的超集
set_bits
更新寄存器时要设置的位
read_mask
读取值时要考虑的位的掩码
flags
应用于规则评估或操作的标志
描述
此结构记录在具有匹配规则的寄存器中应采取的操作。操作示例:设置/清除位。
-
XE_RTP_RULE_PLATFORM¶
XE_RTP_RULE_PLATFORM (plat_)
创建匹配平台的规则
-
XE_RTP_RULE_SUBPLATFORM¶
XE_RTP_RULE_SUBPLATFORM (plat_, sub_)
创建匹配平台和子平台的规则
-
XE_RTP_RULE_GRAPHICS_STEP¶
XE_RTP_RULE_GRAPHICS_STEP (start_, end_)
创建匹配图形步进的规则
参数
start_
与规则匹配的第一个步进
end_
与规则不匹配的第一个步进
描述
请注意,匹配此规则的范围是 [ start_, end_ ),即左闭右开。
有关预期用法,请参阅 XE_RTP_RULES()
。
-
XE_RTP_RULE_MEDIA_STEP¶
XE_RTP_RULE_MEDIA_STEP (start_, end_)
创建匹配媒体步进的规则
参数
start_
与规则匹配的第一个步进
end_
与规则不匹配的第一个步进
描述
请注意,匹配此规则的范围是 [ start_, end_ ),即左闭右开。
有关预期用法,请参阅 XE_RTP_RULES()
。
-
XE_RTP_RULE_ENGINE_CLASS¶
XE_RTP_RULE_ENGINE_CLASS (cls_)
创建匹配引擎类的规则
-
XE_RTP_RULE_FUNC¶
XE_RTP_RULE_FUNC (func__)
创建使用回调函数进行匹配的规则
参数
func__
用于确定规则是否匹配的函数
描述
这允许执行更复杂的检查。XE_RTP
基础结构将简单地调用传递的 func_ 函数来确定此规则是否与设备匹配。
有关预期用法,请参阅 XE_RTP_RULES()
。
-
XE_RTP_RULE_GRAPHICS_VERSION¶
XE_RTP_RULE_GRAPHICS_VERSION (ver__)
创建匹配图形版本的规则
-
XE_RTP_RULE_GRAPHICS_VERSION_RANGE¶
XE_RTP_RULE_GRAPHICS_VERSION_RANGE (ver_start__, ver_end__)
创建匹配图形版本范围的规则
参数
ver_start__
要匹配的第一个图形 IP 版本
ver_end__
要匹配的最后一个图形 IP 版本
描述
请注意,匹配此规则的范围是 [ ver_start__, ver_end__ ],即左右都闭。
有关预期用法,请参阅 XE_RTP_RULES()
。
-
XE_RTP_RULE_GRAPHICS_VERSION_ANY_GT¶
XE_RTP_RULE_GRAPHICS_VERSION_ANY_GT (ver__)
在任何 GT 上创建匹配图形版本的规则
参数
ver__
要匹配的图形 IP 版本
描述
与 XE_RTP_RULE_GRAPHICS_VERSION 类似,但即使当前正在检查的 GT 不是图形类型,它也会匹配。它允许在设备包含具有该版本的图形 IP 时,将 RTP 条目添加到另一个 GT。
有关预期用法,请参阅 XE_RTP_RULES()
。
-
XE_RTP_RULE_MEDIA_VERSION¶
XE_RTP_RULE_MEDIA_VERSION (ver__)
创建匹配媒体版本的规则
-
XE_RTP_RULE_MEDIA_VERSION_RANGE¶
XE_RTP_RULE_MEDIA_VERSION_RANGE (ver_start__, ver_end__)
创建匹配媒体版本范围的规则
参数
ver_start__
要匹配的第一个媒体 IP 版本
ver_end__
要匹配的最后一个媒体 IP 版本
描述
请注意,匹配此规则的范围是 [ ver_start__, ver_end__ ],即左右都闭。
有关预期用法,请参阅 XE_RTP_RULES()
。
-
XE_RTP_RULE_MEDIA_VERSION_ANY_GT¶
XE_RTP_RULE_MEDIA_VERSION_ANY_GT (ver__)
在任何 GT 上创建匹配媒体版本的规则
参数
ver__
要匹配的媒体 IP 版本
描述
与 XE_RTP_RULE_MEDIA_VERSION 类似,但即使当前正在检查的 GT 不是媒体类型,它也会匹配。它允许在设备包含具有该版本的媒体 IP 时,将 RTP 条目添加到另一个 GT。
有关预期用法,请参阅 XE_RTP_RULES()
。
-
XE_RTP_RULE_IS_INTEGRATED¶
XE_RTP_RULE_IS_INTEGRATED
-
XE_RTP_RULE_IS_DISCRETE¶
XE_RTP_RULE_IS_DISCRETE
-
XE_RTP_RULE_OR¶
XE_RTP_RULE_OR
为 rtp 规则创建 OR 条件
描述
RTP 规则在评估时会进行 AND 运算,并且所有规则都需要匹配。XE_RTP_RULE_OR 允许创建一组规则,其中任何一个匹配都足以触发操作。示例
const struct xe_rtp_entry_sr entries[] = { ... { XE_RTP_NAME("test-entry"), XE_RTP_RULES(PLATFORM(DG2), OR, PLATFORM(TIGERLAKE)), ... }, ... };
-
XE_RTP_ACTION_WR¶
XE_RTP_ACTION_WR (reg_, val_, ...)
辅助函数,用于将值写入寄存器,覆盖所有位
-
XE_RTP_ACTION_SET¶
XE_RTP_ACTION_SET (reg_, val_, ...)
设置寄存器中来自 val_ 的位。
参数
reg_
寄存器
val_
要在寄存器中设置的位
...
struct xe_rtp_action
条目中要覆盖的其他字段
描述
对于掩码寄存器,这会转换为单个写入,而对于其他寄存器,这是 RMW。对应的 bspec 表示法是(例如,对于位 2 和 5,但可以是任何位)
REGNAME[2] = 1 REGNAME[5] = 1
-
XE_RTP_ACTION_CLR¶
XE_RTP_ACTION_CLR (reg_, val_, ...)
清除寄存器中来自 val_ 的位。
参数
reg_
寄存器
val_
要在寄存器中清除的位
...
struct xe_rtp_action
条目中要覆盖的其他字段
描述
对于掩码寄存器,这会转换为单个写入,而对于其他寄存器,这是 RMW。对应的 bspec 表示法是(例如,对于位 2 和 5,但可以是任何位)
REGNAME[2] = 0 REGNAME[5] = 0
-
XE_RTP_ACTION_FIELD_SET¶
XE_RTP_ACTION_FIELD_SET (reg_, mask_bits_, val_, ...)
设置位范围
参数
reg_
寄存器
mask_bits_
要在寄存器中更改的位的掩码,形成一个字段
val_
要在由 mask_bits_ 表示的字段中设置的值
...
struct xe_rtp_action
条目中要覆盖的其他字段
描述
对于掩码寄存器,这会转换为单个写入,而对于其他寄存器,这是 RMW。对应的 bspec 表示法是
REGNAME[<end>:<start>] = VALUE
-
XE_RTP_ACTION_WHITELIST¶
XE_RTP_ACTION_WHITELIST (reg_, val_, ...)
将寄存器添加到用户空间白名单
-
XE_RTP_NAME¶
XE_RTP_NAME (s_)
用于在 xe_rtp_entry 中设置名称的辅助函数
参数
s_
描述此规则的名称,通常是特定于硬件的编号
描述
TODO:也许将其移到调试配置之后?
-
XE_RTP_ENTRY_FLAG¶
XE_RTP_ENTRY_FLAG (...)
用于将多个标志添加到 struct xe_rtp_entry_sr 的辅助函数
参数
...
条目标志,不带
XE_RTP_ENTRY_FLAG_
前缀
描述
用于在定义 struct xe_rtp_entry 条目时自动将 XE_RTP_ENTRY_FLAG_
前缀添加到标志的辅助函数。示例
const struct xe_rtp_entry_sr wa_entries[] = {
...
{ XE_RTP_NAME("test-entry"),
...
XE_RTP_ENTRY_FLAG(FOREACH_ENGINE),
...
},
...
};
-
XE_RTP_ACTION_FLAG¶
XE_RTP_ACTION_FLAG (...)
用于将多个标志添加到
struct xe_rtp_action
的辅助函数
参数
...
操作标志,不带
XE_RTP_ACTION_FLAG_
前缀
描述
用于在定义 struct xe_rtp_action
条目时自动将 XE_RTP_ACTION_FLAG_
前缀添加到标志的辅助函数。示例
const struct xe_rtp_entry_sr wa_entries[] = {
...
{ XE_RTP_NAME("test-entry"),
...
XE_RTP_ACTION_SET(..., XE_RTP_ACTION_FLAG(FOREACH_ENGINE)),
...
},
...
};
-
XE_RTP_RULES¶
XE_RTP_RULES (...)
用于将多个规则设置到 struct xe_rtp_entry_sr 条目的辅助函数
参数
...
规则
描述
至少需要一个规则,最多支持 12 个。多个规则会进行“与”运算,即所有规则必须评估为 true,才能处理该条目。请参阅 XE_RTP_MATCH_* 以了解可能的匹配规则。示例
const struct xe_rtp_entry_sr wa_entries[] = {
...
{ XE_RTP_NAME("test-entry"),
XE_RTP_RULES(SUBPLATFORM(DG2, G10), GRAPHICS_STEP(A0, B0)),
...
},
...
};
-
XE_RTP_ACTIONS¶
XE_RTP_ACTIONS (...)
用于将多个操作设置到 struct xe_rtp_entry_sr 的辅助函数
参数
...
要采取的操作
描述
至少需要一个操作,最多支持 12 个。请参阅 XE_RTP_ACTION_* 以了解可能的操作。示例
const struct xe_rtp_entry_sr wa_entries[] = {
...
{ XE_RTP_NAME("test-entry"),
XE_RTP_RULES(...),
XE_RTP_ACTIONS(SET(..), SET(...), CLR(...)),
...
},
...
};
-
bool xe_rtp_match_even_instance(const struct xe_gt *gt, const struct xe_hw_engine *hwe)¶
如果引擎实例为偶数则匹配
参数
const struct xe_gt *gt
GT 结构
const struct xe_hw_engine *hwe
引擎实例
返回值
如果引擎实例为偶数,则返回 true,否则返回 false
-
void xe_rtp_process_ctx_enable_active_tracking(struct xe_rtp_process_ctx *ctx, unsigned long *active_entries, size_t n_entries)¶
启用活动条目的跟踪
参数
struct xe_rtp_process_ctx *ctx
处理表的上下文
unsigned long *active_entries
用于存储活动条目的位图
size_t n_entries
要处理的条目数
描述
设置其他元数据以跟踪哪些条目被视为“活动的”,即它们的规则符合条件。位永远不会被清除:具有匹配规则的条目会在位图中设置相应的位。
-
void xe_rtp_process_to_sr(struct xe_rtp_process_ctx *ctx, const struct xe_rtp_entry_sr *entries, struct xe_reg_sr *sr)¶
处理所有 rtp **条目**,将匹配的条目添加到保存/恢复参数中。
参数
struct xe_rtp_process_ctx *ctx
用于处理表的上下文,其中包含设备、gt 或 hwe 之一
const struct xe_rtp_entry_sr *entries
包含 RTP 定义的表
struct xe_reg_sr *sr
保存/恢复结构,其中匹配的规则执行操作。这可以看作是多个表的“合并视图”。每个寄存器集的位预计不会与先前添加的条目冲突
描述
遍历 **entries** 指向的表(使用空的哨兵),并将所有具有匹配规则的条目添加到 **sr**。如果 **hwe** 不为 NULL,则其 mmio_base 用于计算正确的寄存器偏移量
-
void xe_rtp_process(struct xe_rtp_process_ctx *ctx, const struct xe_rtp_entry *entries)¶
处理所有 rtp **条目**,而不运行任何操作
参数
struct xe_rtp_process_ctx *ctx
用于处理表的上下文,其中包含设备、gt 或 hwe 之一
const struct xe_rtp_entry *entries
包含 RTP 定义的表
描述
遍历 **entries** 指向的表(使用空的哨兵),执行规则。与 xe_rtp_process_to_sr()
的一个区别:每个条目没有关联的操作,因为这使用了 struct xe_rtp_entry。其主要用途是通过 xe_rtp_process_ctx_enable_active_tracking()
标记活动变通方法。