drm/xe/rtp: Pass xe_device parameter to FUNC matches

FUNC matches in RTP only pass the GT and hwe, preventing them from being
used effectively in device workarounds.  Add an additional xe_device
parameter so that we can use them in device workarounds where a GT may
not be available.

Reviewed-by: Gustavo Sousa <gustavo.sousa@intel.com>
Link: https://lore.kernel.org/r/20251013200944.2499947-41-matthew.d.roper@intel.com
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
This commit is contained in:
Matt Roper
2025-10-13 13:09:59 -07:00
parent 78de8f8766
commit 794e735cb6
6 changed files with 41 additions and 24 deletions

View File

@@ -48,12 +48,14 @@ struct rtp_test_case {
const struct xe_rtp_entry *entries;
};
static bool match_yes(const struct xe_gt *gt, const struct xe_hw_engine *hwe)
static bool match_yes(const struct xe_device *xe, const struct xe_gt *gt,
const struct xe_hw_engine *hwe)
{
return true;
}
static bool match_no(const struct xe_gt *gt, const struct xe_hw_engine *hwe)
static bool match_no(const struct xe_device *xe, const struct xe_gt *gt,
const struct xe_hw_engine *hwe)
{
return false;
}

View File

@@ -346,17 +346,19 @@ void xe_hw_engine_enable_ring(struct xe_hw_engine *hwe)
xe_hw_engine_mmio_read32(hwe, RING_MI_MODE(0));
}
static bool xe_hw_engine_match_fixed_cslice_mode(const struct xe_gt *gt,
static bool xe_hw_engine_match_fixed_cslice_mode(const struct xe_device *xe,
const struct xe_gt *gt,
const struct xe_hw_engine *hwe)
{
return xe_gt_ccs_mode_enabled(gt) &&
xe_rtp_match_first_render_or_compute(gt, hwe);
xe_rtp_match_first_render_or_compute(xe, gt, hwe);
}
static bool xe_rtp_cfeg_wmtp_disabled(const struct xe_gt *gt,
static bool xe_rtp_cfeg_wmtp_disabled(const struct xe_device *xe,
const struct xe_gt *gt,
const struct xe_hw_engine *hwe)
{
if (GRAPHICS_VER(gt_to_xe(gt)) < 20)
if (GRAPHICS_VER(xe) < 20)
return false;
if (hwe->class != XE_ENGINE_CLASS_COMPUTE &&

View File

@@ -19,7 +19,8 @@
#undef XE_REG_MCR
#define XE_REG_MCR(...) XE_REG(__VA_ARGS__, .mcr = 1)
static bool match_not_render(const struct xe_gt *gt,
static bool match_not_render(const struct xe_device *xe,
const struct xe_gt *gt,
const struct xe_hw_engine *hwe)
{
return hwe->class != XE_ENGINE_CLASS_RENDER;

View File

@@ -133,10 +133,7 @@ static bool rule_matches(const struct xe_device *xe,
match = hwe->class != r->engine_class;
break;
case XE_RTP_MATCH_FUNC:
if (drm_WARN_ON(&xe->drm, !gt))
return false;
match = r->match_func(gt, hwe);
match = r->match_func(xe, gt, hwe);
break;
default:
drm_warn(&xe->drm, "Invalid RTP match %u\n",
@@ -343,13 +340,15 @@ void xe_rtp_process(struct xe_rtp_process_ctx *ctx,
}
EXPORT_SYMBOL_IF_KUNIT(xe_rtp_process);
bool xe_rtp_match_even_instance(const struct xe_gt *gt,
bool xe_rtp_match_even_instance(const struct xe_device *xe,
const struct xe_gt *gt,
const struct xe_hw_engine *hwe)
{
return hwe->instance % 2 == 0;
}
bool xe_rtp_match_first_render_or_compute(const struct xe_gt *gt,
bool xe_rtp_match_first_render_or_compute(const struct xe_device *xe,
const struct xe_gt *gt,
const struct xe_hw_engine *hwe)
{
u64 render_compute_mask = gt->info.engine_mask &
@@ -359,19 +358,22 @@ bool xe_rtp_match_first_render_or_compute(const struct xe_gt *gt,
hwe->engine_id == __ffs(render_compute_mask);
}
bool xe_rtp_match_not_sriov_vf(const struct xe_gt *gt,
bool xe_rtp_match_not_sriov_vf(const struct xe_device *xe,
const struct xe_gt *gt,
const struct xe_hw_engine *hwe)
{
return !IS_SRIOV_VF(gt_to_xe(gt));
return !IS_SRIOV_VF(xe);
}
bool xe_rtp_match_psmi_enabled(const struct xe_gt *gt,
bool xe_rtp_match_psmi_enabled(const struct xe_device *xe,
const struct xe_gt *gt,
const struct xe_hw_engine *hwe)
{
return xe_configfs_get_psmi_enabled(to_pci_dev(gt_to_xe(gt)->drm.dev));
return xe_configfs_get_psmi_enabled(to_pci_dev(xe->drm.dev));
}
bool xe_rtp_match_gt_has_discontiguous_dss_groups(const struct xe_gt *gt,
bool xe_rtp_match_gt_has_discontiguous_dss_groups(const struct xe_device *xe,
const struct xe_gt *gt,
const struct xe_hw_engine *hwe)
{
return xe_gt_has_discontiguous_dss_groups(gt);

View File

@@ -440,18 +440,21 @@ void xe_rtp_process(struct xe_rtp_process_ctx *ctx,
/**
* xe_rtp_match_even_instance - Match if engine instance is even
* @xe: Device structure
* @gt: GT structure
* @hwe: Engine instance
*
* Returns: true if engine instance is even, false otherwise
*/
bool xe_rtp_match_even_instance(const struct xe_gt *gt,
bool xe_rtp_match_even_instance(const struct xe_device *xe,
const struct xe_gt *gt,
const struct xe_hw_engine *hwe);
/*
* xe_rtp_match_first_render_or_compute - Match if it's first render or compute
* engine in the GT
*
* @xe: Device structure
* @gt: GT structure
* @hwe: Engine instance
*
@@ -463,24 +466,29 @@ bool xe_rtp_match_even_instance(const struct xe_gt *gt,
* Returns: true if engine id is the first to match the render reset domain,
* false otherwise.
*/
bool xe_rtp_match_first_render_or_compute(const struct xe_gt *gt,
bool xe_rtp_match_first_render_or_compute(const struct xe_device *xe,
const struct xe_gt *gt,
const struct xe_hw_engine *hwe);
/*
* xe_rtp_match_not_sriov_vf - Match when not on SR-IOV VF device
*
* @xe: Device structure
* @gt: GT structure
* @hwe: Engine instance
*
* Returns: true if device is not VF, false otherwise.
*/
bool xe_rtp_match_not_sriov_vf(const struct xe_gt *gt,
bool xe_rtp_match_not_sriov_vf(const struct xe_device *xe,
const struct xe_gt *gt,
const struct xe_hw_engine *hwe);
bool xe_rtp_match_psmi_enabled(const struct xe_gt *gt,
bool xe_rtp_match_psmi_enabled(const struct xe_device *xe,
const struct xe_gt *gt,
const struct xe_hw_engine *hwe);
bool xe_rtp_match_gt_has_discontiguous_dss_groups(const struct xe_gt *gt,
bool xe_rtp_match_gt_has_discontiguous_dss_groups(const struct xe_device *xe,
const struct xe_gt *gt,
const struct xe_hw_engine *hwe);
#endif

View File

@@ -10,6 +10,7 @@
#include "regs/xe_reg_defs.h"
struct xe_device;
struct xe_hw_engine;
struct xe_gt;
@@ -86,7 +87,8 @@ struct xe_rtp_rule {
u8 engine_class;
};
/* MATCH_FUNC */
bool (*match_func)(const struct xe_gt *gt,
bool (*match_func)(const struct xe_device *xe,
const struct xe_gt *gt,
const struct xe_hw_engine *hwe);
};
};