]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/xe: add new type to RTP context
authorMatt Atwood <matthew.s.atwood@intel.com>
Wed, 9 Jul 2025 22:16:02 +0000 (15:16 -0700)
committerLucas De Marchi <lucas.demarchi@intel.com>
Thu, 10 Jul 2025 22:36:30 +0000 (15:36 -0700)
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: Lucas De Marchi <lucas.demarchi@intel.com>
Signed-off-by: Matt Atwood <matthew.s.atwood@intel.com>
Link: https://lore.kernel.org/r/20250709221605.172516-4-matthew.s.atwood@intel.com
Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
drivers/gpu/drm/xe/xe_rtp.c
drivers/gpu/drm/xe/xe_rtp.h
drivers/gpu/drm/xe/xe_rtp_types.h

index 29e694bb1219e0d802035d89eba42e5d41ce84be..e4b3b135a4af00db2c574ebf44a401f936e6dc60 100644 (file)
@@ -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;
index 4fe736a11c42b954c2256fa21a49b0c2e39901e2..ac260feaabef5eef43d13341e8df6202510f255e 100644 (file)
@@ -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,
index 1b76b947c7063a6ce301cc530ac91195ac7e4e81..f4cf30e298cf0e7bc2c21776b536ca2d27997d04 100644 (file)
@@ -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;
        };