drm/i915: Update gen12 multicast register ranges
authorMatt Roper <matthew.d.roper@intel.com>
Fri, 9 Oct 2020 19:44:42 +0000 (12:44 -0700)
committerMatt Roper <matthew.d.roper@intel.com>
Sat, 10 Oct 2020 01:54:44 +0000 (18:54 -0700)
The updated bspec forcewake table also provides us with new multicast
ranges that should be reflected in our workaround code.

Note that there are different types of multicast registers with
different styles of replication and different steering registers.  The
i915 MCR range lists we're updating here are only used to ensure we can
verify workarounds properly (i.e., if we can't steer register reads we
don't want to verify workarounds where an unsteered read might hit a
fused-off instance of the unit).  Because of this, we don't need to
include any of the multicast ranges where all instances of the register
will always present and fusing doesn't play a role.  Specifically, that
means that we are not including the MCR ranges designated as "SQIDI" in
the bspec.

Bspec: 66696
Cc: Caz Yokoyama <caz.yokoyama@intel.com>
Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Cc: José Roberto de Souza <jose.souza@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20201009194442.3668677-4-matthew.d.roper@intel.com
Reviewed-by: José Roberto de Souza <jose.souza@intel.com>
drivers/gpu/drm/i915/gt/intel_workarounds.c

index 6c580d0..78c5480 100644 (file)
@@ -2031,10 +2031,12 @@ err_obj:
        return ERR_PTR(err);
 }
 
-static const struct {
+struct mcr_range {
        u32 start;
        u32 end;
-} mcr_ranges_gen8[] = {
+};
+
+static const struct mcr_range mcr_ranges_gen8[] = {
        { .start = 0x5500, .end = 0x55ff },
        { .start = 0x7000, .end = 0x7fff },
        { .start = 0x9400, .end = 0x97ff },
@@ -2043,11 +2045,25 @@ static const struct {
        {},
 };
 
+static const struct mcr_range mcr_ranges_gen12[] = {
+       { .start =  0x8150, .end =  0x815f },
+       { .start =  0x9520, .end =  0x955f },
+       { .start =  0xb100, .end =  0xb3ff },
+       { .start =  0xde80, .end =  0xe8ff },
+       { .start = 0x24a00, .end = 0x24a7f },
+       {},
+};
+
 static bool mcr_range(struct drm_i915_private *i915, u32 offset)
 {
+       const struct mcr_range *mcr_ranges;
        int i;
 
-       if (INTEL_GEN(i915) < 8)
+       if (INTEL_GEN(i915) >= 12)
+               mcr_ranges = mcr_ranges_gen12;
+       else if (INTEL_GEN(i915) >= 8)
+               mcr_ranges = mcr_ranges_gen8;
+       else
                return false;
 
        /*
@@ -2055,9 +2071,9 @@ static bool mcr_range(struct drm_i915_private *i915, u32 offset)
         * which only controls CPU initiated MMIO. Routing does not
         * work for CS access so we cannot verify them on this path.
         */
-       for (i = 0; mcr_ranges_gen8[i].start; i++)
-               if (offset >= mcr_ranges_gen8[i].start &&
-                   offset <= mcr_ranges_gen8[i].end)
+       for (i = 0; mcr_ranges[i].start; i++)
+               if (offset >= mcr_ranges[i].start &&
+                   offset <= mcr_ranges[i].end)
                        return true;
 
        return false;