Re: [PATCH v6 2/3] drm/i915: Parse and set stepping for platforms with GMD

2022-09-23 Thread Lucas De Marchi

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

2022-09-15 Thread Radhakrishna Sripada
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