Commit e7201d98 authored by Matt Atwood's avatar Matt Atwood Committed by Lucas De Marchi
Browse files

drm/xe: add new type to RTP context



Prepare the RTP context to be used before GT init. Add the xe device as
a type, put WARN_ONs to protect existing RTP_MATCHes.

v5: split out into separate patch, change definition order
v6: catch missing cases for checking gt init

Reviewed-by: default avatarLucas De Marchi <lucas.demarchi@intel.com>
Signed-off-by: default avatarMatt Atwood <matthew.s.atwood@intel.com>
Link: https://lore.kernel.org/r/20250709221605.172516-4-matthew.s.atwood@intel.com


Signed-off-by: default avatarLucas De Marchi <lucas.demarchi@intel.com>
parent f037e0b7
Loading
Loading
Loading
Loading
+32 −0
Original line number Diff line number Diff line
@@ -56,37 +56,61 @@ static bool rule_matches(const struct xe_device *xe,
				xe->info.subplatform == r->subplatform;
			break;
		case XE_RTP_MATCH_GRAPHICS_VERSION:
			if (drm_WARN_ON(&xe->drm, !gt))
				return false;

			match = xe->info.graphics_verx100 == r->ver_start &&
				(!has_samedia(xe) || !xe_gt_is_media_type(gt));
			break;
		case XE_RTP_MATCH_GRAPHICS_VERSION_RANGE:
			if (drm_WARN_ON(&xe->drm, !gt))
				return false;

			match = xe->info.graphics_verx100 >= r->ver_start &&
				xe->info.graphics_verx100 <= r->ver_end &&
				(!has_samedia(xe) || !xe_gt_is_media_type(gt));
			break;
		case XE_RTP_MATCH_GRAPHICS_VERSION_ANY_GT:
			if (drm_WARN_ON(&xe->drm, !gt))
				return false;

			match = xe->info.graphics_verx100 == r->ver_start;
			break;
		case XE_RTP_MATCH_GRAPHICS_STEP:
			if (drm_WARN_ON(&xe->drm, !gt))
				return false;

			match = xe->info.step.graphics >= r->step_start &&
				xe->info.step.graphics < r->step_end &&
				(!has_samedia(xe) || !xe_gt_is_media_type(gt));
			break;
		case XE_RTP_MATCH_MEDIA_VERSION:
			if (drm_WARN_ON(&xe->drm, !gt))
				return false;

			match = xe->info.media_verx100 == r->ver_start &&
				(!has_samedia(xe) || xe_gt_is_media_type(gt));
			break;
		case XE_RTP_MATCH_MEDIA_VERSION_RANGE:
			if (drm_WARN_ON(&xe->drm, !gt))
				return false;

			match = xe->info.media_verx100 >= r->ver_start &&
				xe->info.media_verx100 <= r->ver_end &&
				(!has_samedia(xe) || xe_gt_is_media_type(gt));
			break;
		case XE_RTP_MATCH_MEDIA_STEP:
			if (drm_WARN_ON(&xe->drm, !gt))
				return false;

			match = xe->info.step.media >= r->step_start &&
				xe->info.step.media < r->step_end &&
				(!has_samedia(xe) || xe_gt_is_media_type(gt));
			break;
		case XE_RTP_MATCH_MEDIA_VERSION_ANY_GT:
			if (drm_WARN_ON(&xe->drm, !gt))
				return false;

			match = xe->info.media_verx100 == r->ver_start;
			break;
		case XE_RTP_MATCH_INTEGRATED:
@@ -108,6 +132,9 @@ 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);
			break;
		default:
@@ -186,6 +213,11 @@ static void rtp_get_context(struct xe_rtp_process_ctx *ctx,
			    struct xe_device **xe)
{
	switch (ctx->type) {
	case XE_RTP_PROCESS_TYPE_DEVICE:
		*hwe = NULL;
		*gt = NULL;
		*xe = ctx->xe;
		break;
	case XE_RTP_PROCESS_TYPE_GT:
		*hwe = NULL;
		*gt = ctx->gt;
+2 −1
Original line number Diff line number Diff line
@@ -422,7 +422,8 @@ struct xe_reg_sr;

#define XE_RTP_PROCESS_CTX_INITIALIZER(arg__) _Generic((arg__),							\
	struct xe_hw_engine * :	(struct xe_rtp_process_ctx){ { (void *)(arg__) }, XE_RTP_PROCESS_TYPE_ENGINE },	\
	struct xe_gt * :	(struct xe_rtp_process_ctx){ { (void *)(arg__) }, XE_RTP_PROCESS_TYPE_GT })
	struct xe_gt * :	(struct xe_rtp_process_ctx){ { (void *)(arg__) }, XE_RTP_PROCESS_TYPE_GT },	\
	struct xe_device * :	(struct xe_rtp_process_ctx){ { (void *)(arg__) }, XE_RTP_PROCESS_TYPE_DEVICE })

void xe_rtp_process_ctx_enable_active_tracking(struct xe_rtp_process_ctx *ctx,
					       unsigned long *active_entries,
+2 −0
Original line number Diff line number Diff line
@@ -110,12 +110,14 @@ struct xe_rtp_entry {
};

enum xe_rtp_process_type {
	XE_RTP_PROCESS_TYPE_DEVICE,
	XE_RTP_PROCESS_TYPE_GT,
	XE_RTP_PROCESS_TYPE_ENGINE,
};

struct xe_rtp_process_ctx {
	union {
		struct xe_device *xe;
		struct xe_gt *gt;
		struct xe_hw_engine *hwe;
	};