Re: [PATCH v6 2/3] drm/i915: Parse and set stepping for platforms with GMD
On Thu, Sep 15, 2022 at 06:46:47PM -0700, Radhakrishna Sripada wrote: From: José Roberto de Souza Expand the current stepping convention to accommodate the GMD stepping info. Typically GMD step maps to letter stepping by "A + step %4" and number to "A + step /4" i.e, GMD step 0 maps to STEP_A0, 1 to _A1, 2 to _A2, 3 to _A3, 4 to STEP_B0... Future platforms might break this formulae and may require a table mapping to decode GMD step compatible with the convention. v2: - Pass the updated ip version structure v3: - Skip using GMD to step table(MattR) Cc: Balasubramani Vivekanandan Cc: Matt Roper Signed-off-by: Radhakrishna Sripada Signed-off-by: José Roberto de Souza --- drivers/gpu/drm/i915/intel_step.c | 25 + drivers/gpu/drm/i915/intel_step.h | 24 +++- 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/i915/intel_step.c b/drivers/gpu/drm/i915/intel_step.c index 42b3133d8387..91e7c51991b0 100644 --- a/drivers/gpu/drm/i915/intel_step.c +++ b/drivers/gpu/drm/i915/intel_step.c @@ -135,6 +135,19 @@ static const struct intel_step_info adlp_n_revids[] = { [0x0] = { COMMON_GT_MEDIA_STEP(A0), .display_step = STEP_D0 }, }; +static u8 gmd_to_intel_step(struct drm_i915_private *i915, + struct ip_version *gmd) +{ + u8 step = gmd->step + STEP_A0; + + if (step >= STEP_FUTURE) { + drm_dbg(>drm, "Using future steppings\n"); + return STEP_FUTURE; + } + + return step; +} + static void pvc_step_init(struct drm_i915_private *i915, int pci_revid); void intel_step_init(struct drm_i915_private *i915) @@ -144,6 +157,18 @@ void intel_step_init(struct drm_i915_private *i915) int revid = INTEL_REVID(i915); struct intel_step_info step = {}; + if (HAS_GMD_ID(i915)) { + step.graphics_step = gmd_to_intel_step(i915, + _INFO(i915)->graphics.ip); + step.media_step = gmd_to_intel_step(i915, + _INFO(i915)->media.ip); + step.display_step = gmd_to_intel_step(i915, + _INFO(i915)->display.ip); + RUNTIME_INFO(i915)->step = step; + + return; + } + if (IS_PONTEVECCHIO(i915)) { pvc_step_init(i915, revid); return; diff --git a/drivers/gpu/drm/i915/intel_step.h b/drivers/gpu/drm/i915/intel_step.h index a6b12bfa9744..57b9928ddca6 100644 --- a/drivers/gpu/drm/i915/intel_step.h +++ b/drivers/gpu/drm/i915/intel_step.h @@ -23,21 +23,43 @@ struct intel_step_info { missing comment in this struct that it's expected to have 4 number steps per letter. I don't want someone to add a stepping B4 in future without realizing that will render gmd_to_intel_step() invalid with that added: Reviewed-by: Lucas De Marchi Lucas De Marchi
[PATCH v6 2/3] drm/i915: Parse and set stepping for platforms with GMD
From: José Roberto de Souza Expand the current stepping convention to accommodate the GMD stepping info. Typically GMD step maps to letter stepping by "A + step %4" and number to "A + step /4" i.e, GMD step 0 maps to STEP_A0, 1 to _A1, 2 to _A2, 3 to _A3, 4 to STEP_B0... Future platforms might break this formulae and may require a table mapping to decode GMD step compatible with the convention. v2: - Pass the updated ip version structure v3: - Skip using GMD to step table(MattR) Cc: Balasubramani Vivekanandan Cc: Matt Roper Signed-off-by: Radhakrishna Sripada Signed-off-by: José Roberto de Souza --- drivers/gpu/drm/i915/intel_step.c | 25 + drivers/gpu/drm/i915/intel_step.h | 24 +++- 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/i915/intel_step.c b/drivers/gpu/drm/i915/intel_step.c index 42b3133d8387..91e7c51991b0 100644 --- a/drivers/gpu/drm/i915/intel_step.c +++ b/drivers/gpu/drm/i915/intel_step.c @@ -135,6 +135,19 @@ static const struct intel_step_info adlp_n_revids[] = { [0x0] = { COMMON_GT_MEDIA_STEP(A0), .display_step = STEP_D0 }, }; +static u8 gmd_to_intel_step(struct drm_i915_private *i915, + struct ip_version *gmd) +{ + u8 step = gmd->step + STEP_A0; + + if (step >= STEP_FUTURE) { + drm_dbg(>drm, "Using future steppings\n"); + return STEP_FUTURE; + } + + return step; +} + static void pvc_step_init(struct drm_i915_private *i915, int pci_revid); void intel_step_init(struct drm_i915_private *i915) @@ -144,6 +157,18 @@ void intel_step_init(struct drm_i915_private *i915) int revid = INTEL_REVID(i915); struct intel_step_info step = {}; + if (HAS_GMD_ID(i915)) { + step.graphics_step = gmd_to_intel_step(i915, + _INFO(i915)->graphics.ip); + step.media_step = gmd_to_intel_step(i915, + _INFO(i915)->media.ip); + step.display_step = gmd_to_intel_step(i915, + _INFO(i915)->display.ip); + RUNTIME_INFO(i915)->step = step; + + return; + } + if (IS_PONTEVECCHIO(i915)) { pvc_step_init(i915, revid); return; diff --git a/drivers/gpu/drm/i915/intel_step.h b/drivers/gpu/drm/i915/intel_step.h index a6b12bfa9744..57b9928ddca6 100644 --- a/drivers/gpu/drm/i915/intel_step.h +++ b/drivers/gpu/drm/i915/intel_step.h @@ -23,21 +23,43 @@ struct intel_step_info { func(A0)\ func(A1)\ func(A2)\ + func(A3)\ func(B0)\ func(B1)\ func(B2)\ func(B3)\ func(C0)\ func(C1)\ + func(C2)\ + func(C3)\ func(D0)\ func(D1)\ + func(D2)\ + func(D3)\ func(E0)\ + func(E1)\ + func(E2)\ + func(E3)\ func(F0)\ + func(F1)\ + func(F2)\ + func(F3)\ func(G0)\ + func(G1)\ + func(G2)\ + func(G3)\ func(H0)\ + func(H1)\ + func(H2)\ + func(H3)\ func(I0)\ func(I1)\ - func(J0) + func(I2)\ + func(I3)\ + func(J0)\ + func(J1)\ + func(J2)\ + func(J3) /* * Symbolic steppings that do not match the hardware. These are valid both as gt -- 2.34.1