OSDN Git Service

drm/i915/guc: Fix confused register capture list creation
authorJohn Harrison <John.C.Harrison@Intel.com>
Fri, 12 May 2023 01:35:44 +0000 (18:35 -0700)
committerJohn Harrison <John.C.Harrison@Intel.com>
Fri, 12 May 2023 18:05:19 +0000 (11:05 -0700)
The GuC has a completely separate engine class enum when referring to
register capture lists, which combines render and compute. The driver
was using the 'normal' GuC specific engine class enum instead. That
meant that it thought it was defining a capture list for compute
engines, the list was actually being applied to the GSC engine. And if
a platform didn't have a render engine, then it would get no compute
register captures at all.

Fix that.

Signed-off-by: John Harrison <John.C.Harrison@Intel.com>
Reviewed-by: Alan Previn <alan.previn.teres.alexis@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230512013544.3367606-1-John.C.Harrison@Intel.com
drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c
drivers/gpu/drm/i915/gt/uc/intel_guc_capture.c
drivers/gpu/drm/i915/gt/uc/intel_guc_fwif.h

index 69ce06f..63724e1 100644 (file)
@@ -643,6 +643,39 @@ static void guc_init_golden_context(struct intel_guc *guc)
        GEM_BUG_ON(guc->ads_golden_ctxt_size != total_size);
 }
 
+static u32 guc_get_capture_engine_mask(struct iosys_map *info_map, u32 capture_class)
+{
+       u32 mask;
+
+       switch (capture_class) {
+       case GUC_CAPTURE_LIST_CLASS_RENDER_COMPUTE:
+               mask = info_map_read(info_map, engine_enabled_masks[GUC_RENDER_CLASS]);
+               mask |= info_map_read(info_map, engine_enabled_masks[GUC_COMPUTE_CLASS]);
+               break;
+
+       case GUC_CAPTURE_LIST_CLASS_VIDEO:
+               mask = info_map_read(info_map, engine_enabled_masks[GUC_VIDEO_CLASS]);
+               break;
+
+       case GUC_CAPTURE_LIST_CLASS_VIDEOENHANCE:
+               mask = info_map_read(info_map, engine_enabled_masks[GUC_VIDEOENHANCE_CLASS]);
+               break;
+
+       case GUC_CAPTURE_LIST_CLASS_BLITTER:
+               mask = info_map_read(info_map, engine_enabled_masks[GUC_BLITTER_CLASS]);
+               break;
+
+       case GUC_CAPTURE_LIST_CLASS_GSC_OTHER:
+               mask = info_map_read(info_map, engine_enabled_masks[GUC_GSC_OTHER_CLASS]);
+               break;
+
+       default:
+               mask = 0;
+       }
+
+       return mask;
+}
+
 static int
 guc_capture_prep_lists(struct intel_guc *guc)
 {
@@ -678,9 +711,10 @@ guc_capture_prep_lists(struct intel_guc *guc)
 
        for (i = 0; i < GUC_CAPTURE_LIST_INDEX_MAX; i++) {
                for (j = 0; j < GUC_MAX_ENGINE_CLASSES; j++) {
+                       u32 engine_mask = guc_get_capture_engine_mask(&info_map, j);
 
                        /* null list if we dont have said engine or list */
-                       if (!info_map_read(&info_map, engine_enabled_masks[j])) {
+                       if (!engine_mask) {
                                if (ads_is_mapped) {
                                        ads_blob_write(guc, ads.capture_class[i][j], null_ggtt);
                                        ads_blob_write(guc, ads.capture_instance[i][j], null_ggtt);
index 1def0b6..0ff864d 100644 (file)
@@ -174,35 +174,31 @@ static const struct __guc_mmio_reg_descr empty_regs_list[] = {
 /* List of lists */
 static const struct __guc_mmio_reg_descr_group gen8_lists[] = {
        MAKE_REGLIST(gen8_global_regs, PF, GLOBAL, 0),
-       MAKE_REGLIST(gen8_rc_class_regs, PF, ENGINE_CLASS, GUC_RENDER_CLASS),
-       MAKE_REGLIST(gen8_rc_inst_regs, PF, ENGINE_INSTANCE, GUC_RENDER_CLASS),
-       MAKE_REGLIST(gen8_rc_class_regs, PF, ENGINE_CLASS, GUC_COMPUTE_CLASS),
-       MAKE_REGLIST(gen8_rc_inst_regs, PF, ENGINE_INSTANCE, GUC_COMPUTE_CLASS),
-       MAKE_REGLIST(empty_regs_list, PF, ENGINE_CLASS, GUC_VIDEO_CLASS),
-       MAKE_REGLIST(gen8_vd_inst_regs, PF, ENGINE_INSTANCE, GUC_VIDEO_CLASS),
-       MAKE_REGLIST(empty_regs_list, PF, ENGINE_CLASS, GUC_VIDEOENHANCE_CLASS),
-       MAKE_REGLIST(gen8_vec_inst_regs, PF, ENGINE_INSTANCE, GUC_VIDEOENHANCE_CLASS),
-       MAKE_REGLIST(empty_regs_list, PF, ENGINE_CLASS, GUC_BLITTER_CLASS),
-       MAKE_REGLIST(gen8_blt_inst_regs, PF, ENGINE_INSTANCE, GUC_BLITTER_CLASS),
-       MAKE_REGLIST(empty_regs_list, PF, ENGINE_CLASS, GUC_GSC_OTHER_CLASS),
-       MAKE_REGLIST(empty_regs_list, PF, ENGINE_INSTANCE, GUC_GSC_OTHER_CLASS),
+       MAKE_REGLIST(gen8_rc_class_regs, PF, ENGINE_CLASS, GUC_CAPTURE_LIST_CLASS_RENDER_COMPUTE),
+       MAKE_REGLIST(gen8_rc_inst_regs, PF, ENGINE_INSTANCE, GUC_CAPTURE_LIST_CLASS_RENDER_COMPUTE),
+       MAKE_REGLIST(empty_regs_list, PF, ENGINE_CLASS, GUC_CAPTURE_LIST_CLASS_VIDEO),
+       MAKE_REGLIST(gen8_vd_inst_regs, PF, ENGINE_INSTANCE, GUC_CAPTURE_LIST_CLASS_VIDEO),
+       MAKE_REGLIST(empty_regs_list, PF, ENGINE_CLASS, GUC_CAPTURE_LIST_CLASS_VIDEOENHANCE),
+       MAKE_REGLIST(gen8_vec_inst_regs, PF, ENGINE_INSTANCE, GUC_CAPTURE_LIST_CLASS_VIDEOENHANCE),
+       MAKE_REGLIST(empty_regs_list, PF, ENGINE_CLASS, GUC_CAPTURE_LIST_CLASS_BLITTER),
+       MAKE_REGLIST(gen8_blt_inst_regs, PF, ENGINE_INSTANCE, GUC_CAPTURE_LIST_CLASS_BLITTER),
+       MAKE_REGLIST(empty_regs_list, PF, ENGINE_CLASS, GUC_CAPTURE_LIST_CLASS_GSC_OTHER),
+       MAKE_REGLIST(empty_regs_list, PF, ENGINE_INSTANCE, GUC_CAPTURE_LIST_CLASS_GSC_OTHER),
        {}
 };
 
 static const struct __guc_mmio_reg_descr_group xe_lp_lists[] = {
        MAKE_REGLIST(xe_lp_global_regs, PF, GLOBAL, 0),
-       MAKE_REGLIST(xe_lp_rc_class_regs, PF, ENGINE_CLASS, GUC_RENDER_CLASS),
-       MAKE_REGLIST(gen8_rc_inst_regs, PF, ENGINE_INSTANCE, GUC_RENDER_CLASS),
-       MAKE_REGLIST(xe_lp_rc_class_regs, PF, ENGINE_CLASS, GUC_COMPUTE_CLASS),
-       MAKE_REGLIST(gen8_rc_inst_regs, PF, ENGINE_INSTANCE, GUC_COMPUTE_CLASS),
-       MAKE_REGLIST(empty_regs_list, PF, ENGINE_CLASS, GUC_VIDEO_CLASS),
-       MAKE_REGLIST(gen8_vd_inst_regs, PF, ENGINE_INSTANCE, GUC_VIDEO_CLASS),
-       MAKE_REGLIST(xe_lp_vec_class_regs, PF, ENGINE_CLASS, GUC_VIDEOENHANCE_CLASS),
-       MAKE_REGLIST(gen8_vec_inst_regs, PF, ENGINE_INSTANCE, GUC_VIDEOENHANCE_CLASS),
-       MAKE_REGLIST(empty_regs_list, PF, ENGINE_CLASS, GUC_BLITTER_CLASS),
-       MAKE_REGLIST(gen8_blt_inst_regs, PF, ENGINE_INSTANCE, GUC_BLITTER_CLASS),
-       MAKE_REGLIST(empty_regs_list, PF, ENGINE_CLASS, GUC_GSC_OTHER_CLASS),
-       MAKE_REGLIST(xe_lp_gsc_inst_regs, PF, ENGINE_INSTANCE, GUC_GSC_OTHER_CLASS),
+       MAKE_REGLIST(xe_lp_rc_class_regs, PF, ENGINE_CLASS, GUC_CAPTURE_LIST_CLASS_RENDER_COMPUTE),
+       MAKE_REGLIST(gen8_rc_inst_regs, PF, ENGINE_INSTANCE, GUC_CAPTURE_LIST_CLASS_RENDER_COMPUTE),
+       MAKE_REGLIST(empty_regs_list, PF, ENGINE_CLASS, GUC_CAPTURE_LIST_CLASS_VIDEO),
+       MAKE_REGLIST(gen8_vd_inst_regs, PF, ENGINE_INSTANCE, GUC_CAPTURE_LIST_CLASS_VIDEO),
+       MAKE_REGLIST(xe_lp_vec_class_regs, PF, ENGINE_CLASS, GUC_CAPTURE_LIST_CLASS_VIDEOENHANCE),
+       MAKE_REGLIST(gen8_vec_inst_regs, PF, ENGINE_INSTANCE, GUC_CAPTURE_LIST_CLASS_VIDEOENHANCE),
+       MAKE_REGLIST(empty_regs_list, PF, ENGINE_CLASS, GUC_CAPTURE_LIST_CLASS_BLITTER),
+       MAKE_REGLIST(gen8_blt_inst_regs, PF, ENGINE_INSTANCE, GUC_CAPTURE_LIST_CLASS_BLITTER),
+       MAKE_REGLIST(empty_regs_list, PF, ENGINE_CLASS, GUC_CAPTURE_LIST_CLASS_GSC_OTHER),
+       MAKE_REGLIST(xe_lp_gsc_inst_regs, PF, ENGINE_INSTANCE, GUC_CAPTURE_LIST_CLASS_GSC_OTHER),
        {}
 };
 
@@ -310,7 +306,8 @@ guc_capture_alloc_steered_lists(struct intel_guc *guc,
 
        /* steered registers currently only exist for the render-class */
        list = guc_capture_get_one_list(lists, GUC_CAPTURE_LIST_INDEX_PF,
-                                       GUC_CAPTURE_LIST_TYPE_ENGINE_CLASS, GUC_RENDER_CLASS);
+                                       GUC_CAPTURE_LIST_TYPE_ENGINE_CLASS,
+                                       GUC_CAPTURE_LIST_CLASS_RENDER_COMPUTE);
        /* skip if extlists was previously allocated */
        if (!list || guc->capture->extlists)
                return;
@@ -400,17 +397,15 @@ static const char *
 __stringify_engclass(u32 class)
 {
        switch (class) {
-       case GUC_RENDER_CLASS:
-               return "Render";
-       case GUC_VIDEO_CLASS:
+       case GUC_CAPTURE_LIST_CLASS_RENDER_COMPUTE:
+               return "Render/Compute";
+       case GUC_CAPTURE_LIST_CLASS_VIDEO:
                return "Video";
-       case GUC_VIDEOENHANCE_CLASS:
+       case GUC_CAPTURE_LIST_CLASS_VIDEOENHANCE:
                return "VideoEnhance";
-       case GUC_BLITTER_CLASS:
+       case GUC_CAPTURE_LIST_CLASS_BLITTER:
                return "Blitter";
-       case GUC_COMPUTE_CLASS:
-               return "Compute";
-       case GUC_GSC_OTHER_CLASS:
+       case GUC_CAPTURE_LIST_CLASS_GSC_OTHER:
                return "GSC-Other";
        default:
                break;
index 8bb9ed7..4e57bd0 100644 (file)
@@ -411,6 +411,15 @@ enum guc_capture_type {
        GUC_CAPTURE_LIST_TYPE_MAX,
 };
 
+/* Class indecies for capture_class and capture_instance arrays */
+enum {
+       GUC_CAPTURE_LIST_CLASS_RENDER_COMPUTE = 0,
+       GUC_CAPTURE_LIST_CLASS_VIDEO = 1,
+       GUC_CAPTURE_LIST_CLASS_VIDEOENHANCE = 2,
+       GUC_CAPTURE_LIST_CLASS_BLITTER = 3,
+       GUC_CAPTURE_LIST_CLASS_GSC_OTHER = 4,
+};
+
 /* GuC Additional Data Struct */
 struct guc_ads {
        struct guc_mmio_reg_set reg_state_list[GUC_MAX_ENGINE_CLASSES][GUC_MAX_INSTANCES_PER_CLASS];