From: Deepak S <deepa...@linux.intel.com>

Use new Sideband offset to read max/min/gaur freq based on the SKU it
is running on. Based on the Number of EU, we read different bits to
identify the max frequencies at which system can run.

v2: reuse mask definitions & INTEL_INFO() to get device info (Ville)

v3: add break in switch conditions (Ville)

Signed-off-by: Deepak S <deepa...@linux.intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
Signed-off-by: Daniel Vetter <daniel.vet...@ffwll.ch>
(cherry picked from commit 095acd5f8739aa8322820d460e617898baf092df)
Signed-off-by: cheah, vincent beng keat <vincent.beng.keat.ch...@intel.com>

Conflicts:
        drivers/gpu/drm/i915/i915_reg.h

(cherry picked from commit cf3329c09d1c90542d7c6998de3882fd7b2e4bc0)
Signed-off-by: cheah, vincent beng keat <vincent.beng.keat.ch...@intel.com>
---
 drivers/gpu/drm/i915/i915_reg.h |    8 ++++++
 drivers/gpu/drm/i915/intel_pm.c |   54 ++++++++++++++++++++++++++++++++++-----
 2 files changed, 55 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index d60962f..498517c 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -605,6 +605,14 @@ enum punit_power_well {
 #define   FORCE_DDR_FREQ_REQ_ACK               (1 << 8)
 #define   FORCE_DDR_LOW_FREQ                   (1 << 1)
 #define   FORCE_DDR_HIGH_FREQ                  (1 << 0)
+#define FB_GFX_FMAX_AT_VMAX_FUSE               0x136
+#define FB_GFX_FREQ_FUSE_MASK                  0xff
+#define FB_GFX_FMAX_AT_VMAX_2SS4EU_FUSE_SHIFT  24
+#define FB_GFX_FMAX_AT_VMAX_2SS6EU_FUSE_SHIFT  16
+#define FB_GFX_FMAX_AT_VMAX_2SS8EU_FUSE_SHIFT  8
+
+#define FB_GFX_FMIN_AT_VMIN_FUSE               0x137
+#define FB_GFX_FMIN_AT_VMIN_FUSE_SHIFT         8
 
 #define PUNIT_GPU_STATUS_REG                   0xdb
 #define PUNIT_GPU_STATUS_MAX_FREQ_SHIFT        16
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 6cd02fc..b948e8c 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -5069,11 +5069,35 @@ void gen6_update_ring_freq(struct drm_device *dev)
 
 static int cherryview_rps_max_freq(struct drm_i915_private *dev_priv)
 {
+       struct drm_device *dev = dev_priv->dev;
        u32 val, rp0;
 
-       val = vlv_punit_read(dev_priv, PUNIT_GPU_STATUS_REG);
-       rp0 = (val >> PUNIT_GPU_STATUS_MAX_FREQ_SHIFT) & 
PUNIT_GPU_STATUS_MAX_FREQ_MASK;
+       if (dev->pdev->revision >= 0x20) {
+               val = vlv_punit_read(dev_priv, FB_GFX_FMAX_AT_VMAX_FUSE);
 
+               switch (INTEL_INFO(dev)->eu_total) {
+               case 8:
+                               /* (2 * 4) config */
+                               rp0 = (val >> 
FB_GFX_FMAX_AT_VMAX_2SS4EU_FUSE_SHIFT);
+                               break;
+               case 12:
+                               /* (2 * 6) config */
+                               rp0 = (val >> 
FB_GFX_FMAX_AT_VMAX_2SS6EU_FUSE_SHIFT);
+                               break;
+               case 16:
+                               /* (2 * 8) config */
+               default:
+                               /* Setting (2 * 8) Min RP0 for any other 
combination */
+                               rp0 = (val >> 
FB_GFX_FMAX_AT_VMAX_2SS8EU_FUSE_SHIFT);
+                               break;
+               }
+               rp0 = (rp0 & FB_GFX_FREQ_FUSE_MASK);
+       } else {
+               /* For pre-production hardware */
+               val = vlv_punit_read(dev_priv, PUNIT_GPU_STATUS_REG);
+               rp0 = (val >> PUNIT_GPU_STATUS_MAX_FREQ_SHIFT) &
+                      PUNIT_GPU_STATUS_MAX_FREQ_MASK;
+       }
        return rp0;
 }
 
@@ -5089,20 +5113,36 @@ static int cherryview_rps_rpe_freq(struct 
drm_i915_private *dev_priv)
 
 static int cherryview_rps_guar_freq(struct drm_i915_private *dev_priv)
 {
+       struct drm_device *dev = dev_priv->dev;
        u32 val, rp1;
 
-       val = vlv_punit_read(dev_priv, PUNIT_REG_GPU_FREQ_STS);
-       rp1 = (val >> PUNIT_GPU_STATUS_MAX_FREQ_SHIFT) & 
PUNIT_GPU_STATUS_MAX_FREQ_MASK;
-
+       if (dev->pdev->revision >= 0x20) {
+               val = vlv_punit_read(dev_priv, FB_GFX_FMAX_AT_VMAX_FUSE);
+               rp1 = (val & FB_GFX_FREQ_FUSE_MASK);
+       } else {
+               /* For pre-production hardware */
+               val = vlv_punit_read(dev_priv, PUNIT_REG_GPU_FREQ_STS);
+               rp1 = ((val >> PUNIT_GPU_STATUS_MAX_FREQ_SHIFT) &
+                      PUNIT_GPU_STATUS_MAX_FREQ_MASK);
+       }
        return rp1;
 }
 
 static int cherryview_rps_min_freq(struct drm_i915_private *dev_priv)
 {
+       struct drm_device *dev = dev_priv->dev;
        u32 val, rpn;
 
-       val = vlv_punit_read(dev_priv, PUNIT_GPU_STATUS_REG);
-       rpn = (val >> PUNIT_GPU_STATIS_GFX_MIN_FREQ_SHIFT) & 
PUNIT_GPU_STATUS_GFX_MIN_FREQ_MASK;
+       if (dev->pdev->revision >= 0x20) {
+               val = vlv_punit_read(dev_priv, FB_GFX_FMIN_AT_VMIN_FUSE);
+               rpn = ((val >> FB_GFX_FMIN_AT_VMIN_FUSE_SHIFT) &
+                      FB_GFX_FREQ_FUSE_MASK);
+       } else { /* For pre-production hardware */
+               val = vlv_punit_read(dev_priv, PUNIT_GPU_STATUS_REG);
+               rpn = ((val >> PUNIT_GPU_STATIS_GFX_MIN_FREQ_SHIFT) &
+                      PUNIT_GPU_STATUS_GFX_MIN_FREQ_MASK);
+       }
+
        return rpn;
 }
 
-- 
1.7.9.5

-- 
_______________________________________________
linux-yocto mailing list
linux-yocto@yoctoproject.org
https://lists.yoctoproject.org/listinfo/linux-yocto

Reply via email to