寄存器表处理

内部基础设施,用于定义如何根据规则和操作更新寄存器。它可以用于定义具有多个条目(每个寄存器一个)的表,这些表将在某个时间点被遍历,以将值应用于具有匹配规则的寄存器。

内部 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_)

创建匹配平台的规则

参数

plat_

要匹配的平台

描述

有关预期用法,请参阅 XE_RTP_RULES()

XE_RTP_RULE_SUBPLATFORM

XE_RTP_RULE_SUBPLATFORM (plat_, sub_)

创建匹配平台和子平台的规则

参数

plat_

要匹配的平台

sub_

要匹配的子平台

描述

有关预期用法,请参阅 XE_RTP_RULES()

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_)

创建匹配引擎类的规则

参数

cls_

要匹配的引擎类

描述

有关预期用法,请参阅 XE_RTP_RULES()

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__)

创建匹配图形版本的规则

参数

ver__

要匹配的图形 IP 版本

描述

有关预期用法,请参阅 XE_RTP_RULES()

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__)

创建匹配媒体版本的规则

参数

ver__

要匹配的媒体 IP 版本

描述

有关预期用法,请参阅 XE_RTP_RULES()

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_RULES()

XE_RTP_RULE_IS_DISCRETE

XE_RTP_RULE_IS_DISCRETE

创建匹配独立图形设备的规则

描述

有关预期用法,请参阅 XE_RTP_RULES()

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_, ...)

辅助函数,用于将值写入寄存器,覆盖所有位

参数

reg_

寄存器

val_

要设置的值

...

struct xe_rtp_action 条目中要覆盖的其他字段

描述

bspec 中的对应表示法是

REGNAME = VALUE

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_, ...)

将寄存器添加到用户空间白名单

参数

reg_

寄存器

val_

要设置的白名单特定标志

...

struct xe_rtp_action 条目中要覆盖的其他字段

描述

将寄存器添加到白名单,允许用户空间使用常规用户权限修改该寄存器。

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() 标记活动变通方法。