drm/i915: Report steering details in debugfs
authorMatt Roper <matthew.d.roper@intel.com>
Tue, 15 Mar 2022 17:02:50 +0000 (10:02 -0700)
committerMatt Roper <matthew.d.roper@intel.com>
Wed, 16 Mar 2022 02:45:40 +0000 (19:45 -0700)
Add a new 'steering' node in each gt's debugfs directory that tells
whether we're using explicit steering for various types of MCR ranges
and, if so, what MMIO ranges it applies to.

We're going to be transitioning away from implicit steering, even for
slice/dss steering soon, so the information reported here will become
increasingly valuable once that happens.

v2:
 - Adding missing 'static' on intel_steering_types[]  (Jose, sparse)
v3:
 - "static const char *" -> "static const char * const" (sparse)

Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
Reviewed-by: José Roberto de Souza <jose.souza@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220315170250.954380-1-matthew.d.roper@intel.com
drivers/gpu/drm/i915/gt/intel_gt.c
drivers/gpu/drm/i915/gt/intel_gt.h
drivers/gpu/drm/i915/gt/intel_gt_debugfs.c
drivers/gpu/drm/i915/gt/intel_gt_types.h
drivers/gpu/drm/i915/gt/intel_workarounds.c

index 8a2483c..ef6fef1 100644 (file)
@@ -96,6 +96,12 @@ int intel_gt_assign_ggtt(struct intel_gt *gt)
        return gt->ggtt ? 0 : -ENOMEM;
 }
 
+static const char * const intel_steering_types[] = {
+       "L3BANK",
+       "MSLICE",
+       "LNCF",
+};
+
 static const struct intel_mmio_range icl_l3bank_steering_table[] = {
        { 0x00B100, 0x00B3FF },
        {},
@@ -932,6 +938,46 @@ u32 intel_gt_read_register(struct intel_gt *gt, i915_reg_t reg)
        return intel_uncore_read(gt->uncore, reg);
 }
 
+static void report_steering_type(struct drm_printer *p,
+                                struct intel_gt *gt,
+                                enum intel_steering_type type,
+                                bool dump_table)
+{
+       const struct intel_mmio_range *entry;
+       u8 slice, subslice;
+
+       BUILD_BUG_ON(ARRAY_SIZE(intel_steering_types) != NUM_STEERING_TYPES);
+
+       if (!gt->steering_table[type]) {
+               drm_printf(p, "%s steering: uses default steering\n",
+                          intel_steering_types[type]);
+               return;
+       }
+
+       intel_gt_get_valid_steering(gt, type, &slice, &subslice);
+       drm_printf(p, "%s steering: sliceid=0x%x, subsliceid=0x%x\n",
+                  intel_steering_types[type], slice, subslice);
+
+       if (!dump_table)
+               return;
+
+       for (entry = gt->steering_table[type]; entry->end; entry++)
+               drm_printf(p, "\t0x%06x - 0x%06x\n", entry->start, entry->end);
+}
+
+void intel_gt_report_steering(struct drm_printer *p, struct intel_gt *gt,
+                             bool dump_table)
+{
+       drm_printf(p, "Default steering: sliceid=0x%x, subsliceid=0x%x\n",
+                  gt->default_steering.groupid,
+                  gt->default_steering.instanceid);
+
+       if (HAS_MSLICES(gt->i915)) {
+               report_steering_type(p, gt, MSLICE, dump_table);
+               report_steering_type(p, gt, LNCF, dump_table);
+       }
+}
+
 void intel_gt_info_print(const struct intel_gt_info *info,
                         struct drm_printer *p)
 {
index 0f571c8..3edece1 100644 (file)
@@ -87,6 +87,8 @@ static inline bool intel_gt_needs_read_steering(struct intel_gt *gt,
 u32 intel_gt_read_register_fw(struct intel_gt *gt, i915_reg_t reg);
 u32 intel_gt_read_register(struct intel_gt *gt, i915_reg_t reg);
 
+void intel_gt_report_steering(struct drm_printer *p, struct intel_gt *gt,
+                             bool dump_table);
 void intel_gt_info_print(const struct intel_gt_info *info,
                         struct drm_printer *p);
 
index f103664..6f45b13 100644 (file)
@@ -6,6 +6,7 @@
 #include <linux/debugfs.h>
 
 #include "i915_drv.h"
+#include "intel_gt.h"
 #include "intel_gt_debugfs.h"
 #include "intel_gt_engines_debugfs.h"
 #include "intel_gt_pm_debugfs.h"
@@ -57,10 +58,22 @@ static int __intel_gt_debugfs_reset_store(void *data, u64 val)
 DEFINE_SIMPLE_ATTRIBUTE(reset_fops, __intel_gt_debugfs_reset_show,
                        __intel_gt_debugfs_reset_store, "%llu\n");
 
+static int steering_show(struct seq_file *m, void *data)
+{
+       struct drm_printer p = drm_seq_file_printer(m);
+       struct intel_gt *gt = m->private;
+
+       intel_gt_report_steering(&p, gt, true);
+
+       return 0;
+}
+DEFINE_INTEL_GT_DEBUGFS_ATTRIBUTE(steering);
+
 static void gt_debugfs_register(struct intel_gt *gt, struct dentry *root)
 {
        static const struct intel_gt_debugfs_file files[] = {
                { "reset", &reset_fops, NULL },
+               { "steering", &steering_fops },
        };
 
        intel_gt_debugfs_register_files(root, files, ARRAY_SIZE(files), gt);
index f206877..7781ab8 100644 (file)
@@ -182,6 +182,11 @@ struct intel_gt {
 
        const struct intel_mmio_range *steering_table[NUM_STEERING_TYPES];
 
+       struct {
+               u8 groupid;
+               u8 instanceid;
+       } default_steering;
+
        struct intel_gt_info {
                intel_engine_mask_t engine_mask;
 
index beca873..c328d46 100644 (file)
@@ -1072,9 +1072,15 @@ static void __set_mcr_steering(struct i915_wa_list *wal,
 static void __add_mcr_wa(struct intel_gt *gt, struct i915_wa_list *wal,
                         unsigned int slice, unsigned int subslice)
 {
-       drm_dbg(&gt->i915->drm, "MCR slice=0x%x, subslice=0x%x\n", slice, subslice);
+       struct drm_printer p = drm_debug_printer("MCR Steering:");
 
        __set_mcr_steering(wal, GEN8_MCR_SELECTOR, slice, subslice);
+
+       gt->default_steering.groupid = slice;
+       gt->default_steering.instanceid = subslice;
+
+       if (drm_debug_enabled(DRM_UT_DRIVER))
+               intel_gt_report_steering(&p, gt, false);
 }
 
 static void