Commit 3bcacad3 authored by Matt Roper's avatar Matt Roper

drm/i915: Update gen12 multicast register ranges

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: default avatarMatt Roper <matthew.d.roper@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20201009194442.3668677-4-matthew.d.roper@intel.comReviewed-by: default avatarJosé Roberto de Souza <jose.souza@intel.com>
parent 92f5df0d
...@@ -2031,10 +2031,12 @@ create_scratch(struct i915_address_space *vm, int count) ...@@ -2031,10 +2031,12 @@ create_scratch(struct i915_address_space *vm, int count)
return ERR_PTR(err); return ERR_PTR(err);
} }
static const struct { struct mcr_range {
u32 start; u32 start;
u32 end; u32 end;
} mcr_ranges_gen8[] = { };
static const struct mcr_range mcr_ranges_gen8[] = {
{ .start = 0x5500, .end = 0x55ff }, { .start = 0x5500, .end = 0x55ff },
{ .start = 0x7000, .end = 0x7fff }, { .start = 0x7000, .end = 0x7fff },
{ .start = 0x9400, .end = 0x97ff }, { .start = 0x9400, .end = 0x97ff },
...@@ -2043,11 +2045,25 @@ static const struct { ...@@ -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) static bool mcr_range(struct drm_i915_private *i915, u32 offset)
{ {
const struct mcr_range *mcr_ranges;
int i; 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; return false;
/* /*
...@@ -2055,9 +2071,9 @@ static bool mcr_range(struct drm_i915_private *i915, u32 offset) ...@@ -2055,9 +2071,9 @@ static bool mcr_range(struct drm_i915_private *i915, u32 offset)
* which only controls CPU initiated MMIO. Routing does not * which only controls CPU initiated MMIO. Routing does not
* work for CS access so we cannot verify them on this path. * work for CS access so we cannot verify them on this path.
*/ */
for (i = 0; mcr_ranges_gen8[i].start; i++) for (i = 0; mcr_ranges[i].start; i++)
if (offset >= mcr_ranges_gen8[i].start && if (offset >= mcr_ranges[i].start &&
offset <= mcr_ranges_gen8[i].end) offset <= mcr_ranges[i].end)
return true; return true;
return false; return false;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment