Commit 794e735c authored by Matt Roper's avatar Matt Roper
Browse files

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: default avatarGustavo Sousa <gustavo.sousa@intel.com>
Link: https://lore.kernel.org/r/20251013200944.2499947-41-matthew.d.roper@intel.com


Signed-off-by: default avatarMatt Roper <matthew.d.roper@intel.com>
parent 78de8f87
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -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;
}
+6 −4
Original line number Diff line number Diff line
@@ -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 &&
+2 −1
Original line number Diff line number Diff line
@@ -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;
+13 −11
Original line number Diff line number Diff line
@@ -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);
+13 −5
Original line number Diff line number Diff line
@@ -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
Loading