Commit 0a982c15 authored by Aditya Swarup's avatar Aditya Swarup Committed by Lucas De Marchi

drm/i915/tgl: Add bound checks and simplify TGL REVID macros

Add bound checks for TGL REV ID array. Since, there might
be a possibility of using older kernels on latest platform
revisions, resulting in out of bounds access for rev ID array.
In this scenario, use the latest rev ID available and apply
those WAs.

Also, modify GT macros for TGL rev ID to reuse tgl_revids_get().

Cc: José Roberto de Souza <jose.souza@intel.com>
Cc: Matt Roper <matthew.d.roper@intel.com>
Cc: Lucas De Marchi <lucas.demarchi@intel.com>
Cc: Jani Nikula <jani.nikula@intel.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: default avatarAditya Swarup <aditya.swarup@intel.com>
Signed-off-by: default avatarLucas De Marchi <lucas.demarchi@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20201203072359.156682-2-aditya.swarup@intel.com
parent 83dbd74f
...@@ -1568,16 +1568,30 @@ enum { ...@@ -1568,16 +1568,30 @@ enum {
TGL_REVID_D0, TGL_REVID_D0,
}; };
extern const struct i915_rev_steppings tgl_uy_revids[]; #define TGL_UY_REVIDS_SIZE 4
extern const struct i915_rev_steppings tgl_revids[]; #define TGL_REVIDS_SIZE 2
extern const struct i915_rev_steppings tgl_uy_revids[TGL_UY_REVIDS_SIZE];
extern const struct i915_rev_steppings tgl_revids[TGL_REVIDS_SIZE];
static inline const struct i915_rev_steppings * static inline const struct i915_rev_steppings *
tgl_revids_get(struct drm_i915_private *dev_priv) tgl_revids_get(struct drm_i915_private *dev_priv)
{ {
if (IS_TGL_U(dev_priv) || IS_TGL_Y(dev_priv)) u8 revid = INTEL_REVID(dev_priv);
return &tgl_uy_revids[INTEL_REVID(dev_priv)]; u8 size;
else const struct i915_rev_steppings *tgl_revid_tbl;
return &tgl_revids[INTEL_REVID(dev_priv)];
if (IS_TGL_U(dev_priv) || IS_TGL_Y(dev_priv)) {
tgl_revid_tbl = tgl_uy_revids;
size = ARRAY_SIZE(tgl_uy_revids);
} else {
tgl_revid_tbl = tgl_revids;
size = ARRAY_SIZE(tgl_revids);
}
revid = min_t(u8, revid, size - 1);
return &tgl_revid_tbl[revid];
} }
#define IS_TGL_DISP_REVID(p, since, until) \ #define IS_TGL_DISP_REVID(p, since, until) \
...@@ -1587,14 +1601,14 @@ tgl_revids_get(struct drm_i915_private *dev_priv) ...@@ -1587,14 +1601,14 @@ tgl_revids_get(struct drm_i915_private *dev_priv)
#define IS_TGL_UY_GT_REVID(p, since, until) \ #define IS_TGL_UY_GT_REVID(p, since, until) \
((IS_TGL_U(p) || IS_TGL_Y(p)) && \ ((IS_TGL_U(p) || IS_TGL_Y(p)) && \
tgl_uy_revids[INTEL_REVID(p)].gt_stepping >= (since) && \ tgl_revids_get(p)->gt_stepping >= (since) && \
tgl_uy_revids[INTEL_REVID(p)].gt_stepping <= (until)) tgl_revids_get(p)->gt_stepping <= (until))
#define IS_TGL_GT_REVID(p, since, until) \ #define IS_TGL_GT_REVID(p, since, until) \
(IS_TIGERLAKE(p) && \ (IS_TIGERLAKE(p) && \
!(IS_TGL_U(p) || IS_TGL_Y(p)) && \ !(IS_TGL_U(p) || IS_TGL_Y(p)) && \
tgl_revids[INTEL_REVID(p)].gt_stepping >= (since) && \ tgl_revids_get(p)->gt_stepping >= (since) && \
tgl_revids[INTEL_REVID(p)].gt_stepping <= (until)) tgl_revids_get(p)->gt_stepping <= (until))
#define RKL_REVID_A0 0x0 #define RKL_REVID_A0 0x0
#define RKL_REVID_B0 0x1 #define RKL_REVID_B0 0x1
......
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