[Intel-gfx] [PATCH] drm/i915/tgl: Fix REVID macros for TGL to fetch correct stepping

Aditya Swarup aditya.swarup at intel.com
Wed Nov 25 00:31:08 UTC 2020


Fix TGL REVID macros to fetch correct display/gt stepping based
on SOC rev id from INTEL_REVID() macro. Previously, we were just
returning the first element of the revid array instead of using
the correct index based on SOC rev id.

Also, add array bound checks for TGL REV ID array. Since, there
might be a possibility of using older kernels on latest platform
revision, resulting in out of bounds access for rev ID array.
In this scenario, print message for unsupported rev ID and apply
settings for latest rev ID available.

Fixes: ("drm/i915/tgl: Fix stepping WA matching")
Cc: José Roberto de Souza <jose.souza at intel.com>
Cc: Matt Roper <matthew.d.roper at intel.com>
Cc: Lucas De Marchi <lucas.demarchi at intel.com>
Cc: Jani Nikula <jani.nikula at intel.com>
Cc: Ville Syrjälä <ville.syrjala at linux.intel.com>
Signed-off-by: Aditya Swarup <aditya.swarup at intel.com>
---
 drivers/gpu/drm/i915/i915_drv.h | 35 +++++++++++++++++++++++++++------
 1 file changed, 29 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 15be8debae54..29d55b7017be 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -1572,16 +1572,37 @@ enum {
 	TGL_REVID_D0,
 };
 
-extern const struct i915_rev_steppings tgl_uy_revids[];
-extern const struct i915_rev_steppings tgl_revids[];
+extern const struct i915_rev_steppings tgl_uy_revids[4];
+extern const struct i915_rev_steppings tgl_revids[2];
+
+#define TGL_UY_REVID_RANGE(revid) \
+	((revid) < ARRAY_SIZE(tgl_uy_revids))
+
+#define TGL_REVID_RANGE(revid) \
+	((revid) < ARRAY_SIZE(tgl_revids))
 
 static inline const struct i915_rev_steppings *
 tgl_revids_get(struct drm_i915_private *dev_priv)
 {
-	if (IS_TGL_U(dev_priv) || IS_TGL_Y(dev_priv))
-		return tgl_uy_revids;
-	else
-		return tgl_revids;
+	const u8 revid = INTEL_REVID(dev_priv);
+
+	if (IS_TGL_U(dev_priv) || IS_TGL_Y(dev_priv)) {
+		if (TGL_UY_REVID_RANGE(revid)) {
+			return tgl_uy_revids + revid;
+		} else {
+			drm_dbg_kms(&dev_priv->drm,
+				    "Unsupported SOC stepping found %u, using %lu instead\n",
+				    revid, ARRAY_SIZE(tgl_uy_revids) - 1);
+			return tgl_uy_revids + (ARRAY_SIZE(tgl_uy_revids) - 1);
+		}
+	} else if (TGL_REVID_RANGE(revid)) {
+		return tgl_revids + revid;
+	} else	{
+		drm_dbg_kms(&dev_priv->drm,
+			    "Unsupported SOC stepping found %u, using %lu instead\n",
+			    revid, ARRAY_SIZE(tgl_revids) - 1);
+		return tgl_uy_revids + (ARRAY_SIZE(tgl_revids) - 1);
+	}
 }
 
 #define IS_TGL_DISP_REVID(p, since, until) \
@@ -1591,12 +1612,14 @@ tgl_revids_get(struct drm_i915_private *dev_priv)
 
 #define IS_TGL_UY_GT_REVID(p, since, until) \
 	((IS_TGL_U(p) || IS_TGL_Y(p)) && \
+	 TGL_UY_REVID_RANGE(INTEL_REVID(p)) && \
 	 tgl_uy_revids->gt_stepping >= (since) && \
 	 tgl_uy_revids->gt_stepping <= (until))
 
 #define IS_TGL_GT_REVID(p, since, until) \
 	(IS_TIGERLAKE(p) && \
 	 !(IS_TGL_U(p) || IS_TGL_Y(p)) && \
+	 TGL_REVID_RANGE(INTEL_REVID(p)) && \
 	 tgl_revids->gt_stepping >= (since) && \
 	 tgl_revids->gt_stepping <= (until))
 
-- 
2.27.0



More information about the Intel-gfx mailing list