暫存器表處理

內部基礎設施,用於定義應如何基於規則和操作更新暫存器。 可用於定義具有多個條目(每個暫存器一個)的表,這些條目將在某個時間點被遍歷以將值應用於具有匹配規則的暫存器。

內部 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 條目中覆蓋的其他欄位

描述

將暫存器新增到白名單,允許使用者空間使用常規使用者許可權修改 ster。

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 個。 多個規則被 AND 在一起,即所有規則都必須評估為 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, size_t n_entries, struct xe_reg_sr *sr)

處理所有 rtp 條目,將匹配的條目新增到儲存-恢復引數。

引數

struct xe_rtp_process_ctx *ctx

用於處理表的上下文,帶有裝置、gt 或 hwe 之一

const struct xe_rtp_entry_sr *entries

帶有 RTP 定義的表

size_t n_entries

要處理的條目數,通常為 ARRAY_SIZE(entries)

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 entries,不執行任何操作。

引數

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() 標記活動解決方法。