Skip to contentSkip to conversation

Enable RC6/Turbo on CHV

PATCH In review [email protected] 4 participants 24 messages May 23, 2014 – May 27, 2014

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

cover Enable RC6/Turbo on CHV

From: Deepak S <[email protected]>

Squashed some of the patches and rebased the patches on latest nightly.

Deepak S (5):
drm/i915/chv: Enable Render Standby (RC6) for Cherryview drm/i915/chv: Added CHV specific register read and write and
Streamline CHV forcewake stuff
drm/i915/chv: Enable RPS (Turbo) for Cherryview drm/i915/chv: Added CHV specific DDR fetch into init_clock_gating drm/i915/chv: Freq(opcode) request for CHV.

Ville Syrjälä (2):
drm/i915/chv: CHV doesn't need WaRsForcewakeWaitTC0 drm/i915/chv: Skip gen6_gt_check_fifodbg() on CHV

 drivers/gpu/drm/i915/i915_drv.h       |   1 +
 drivers/gpu/drm/i915/i915_irq.c       |  12 +-
 drivers/gpu/drm/i915/i915_reg.h       |  12 ++
 drivers/gpu/drm/i915/intel_pm.c       | 219 +++++++++++++++++++++++++++++++++-
 drivers/gpu/drm/i915/intel_sideband.c |  14 +++
 drivers/gpu/drm/i915/intel_uncore.c   | 146 +++++++++++++++++++----
 6 files changed, 372 insertions(+), 32 deletions(-)
Signature · 6 lines
1.9.1

_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
#1 lore raw

PATCH 1/7 drm/i915/chv: Enable Render Standby (RC6) for Cherryview

From: Deepak S <[email protected]>

v2: Configure PCBR if BIOS fails allocate pcbr (deepak)

v3: Fix PCBR condition check during CHV RC6 Enable flag set

v4: Fixup PCBR comment msg. (Chris)
Rebase against latest code (Deak)
Fixup Spurious hunk (Ben)

v5: Fix PCBR and commentis msg (mika)

v6: Rebase patch on latest nightly (Deepak)

---
 drivers/gpu/drm/i915/i915_reg.h |   2 +
 drivers/gpu/drm/i915/intel_pm.c | 115 +++++++++++++++++++++++++++++++++++++---
 2 files changed, 111 insertions(+), 6 deletions(-)
drivers/gpu/drm/i915/i915_reg.h +2 -0
index 5122254..c1f36a5 100644
@@ -1167,6 +1167,8 @@ enum punit_power_well {
 #define VLV_IMR		(VLV_DISPLAY_BASE + 0x20a8)
 #define VLV_ISR		(VLV_DISPLAY_BASE + 0x20ac)
 #define VLV_PCBR	(VLV_DISPLAY_BASE + 0x2120)
+#define VLV_PCBR_ADDR_SHIFT	12
+
 #define   DISPLAY_PLANE_FLIP_PENDING(plane) (1<<(11-(plane))) /* A and B only */
 #define EIR		0x020b0
 #define EMR		0x020b4
drivers/gpu/drm/i915/intel_pm.c +109 -6

172 lines not on this page · raw message

Signature · 1 line
1.9.1
#2 lore raw

PATCH 2/7 drm/i915/chv: Added CHV specific register read and write and Streamline CHV forcewake stuff

In reply to [email protected]

From: Deepak S <[email protected]>

Support to individually control Media/Render well based on the register access. Add CHV specific write function to habdle difference between registers that are sadowed vs those that need forcewake even for writes.

Streamline the CHV forcewake functions just like was done for VLV.

This will also fix a bug in accessing the common well registers, where we'd end up trying to wake up the wells too many times since we'd call force_wake_get/put twice per register access, with FORCEFAKE_ALL both times.

v2: Drop write FIFO for CHV and add comman well forcewake (Ville)
Re-factor CHV/VLV Forcewake offsets (Ben)

v3: Fix for decrementing fw count in chv read/write. (Deepak)

v4: Squash the patches (Mika)

[vsyrjala: Move the register range macros into intel_uncore.c]
---
 drivers/gpu/drm/i915/intel_uncore.c | 135 +++++++++++++++++++++++++++++++-----
 1 file changed, 118 insertions(+), 17 deletions(-)
drivers/gpu/drm/i915/intel_uncore.c +118 -17
index 2f5d5d3..7409de0 100644
@@ -486,16 +486,43 @@ void assert_force_wake_inactive(struct drm_i915_private *dev_priv)
 #define NEEDS_FORCE_WAKE(dev_priv, reg) \
 	 ((reg) < 0x40000 && (reg) != FORCEWAKE)
 
-#define FORCEWAKE_VLV_RENDER_RANGE_OFFSET(reg) \
-	(((reg) >= 0x2000 && (reg) < 0x4000) ||\
-	((reg) >= 0x5000 && (reg) < 0x8000) ||\
-	((reg) >= 0xB000 && (reg) < 0x12000) ||\
-	((reg) >= 0x2E000 && (reg) < 0x30000))
+#define REG_RANGE(reg, start, end) ((reg) >= (start) && (reg) < (end))
 
-#define FORCEWAKE_VLV_MEDIA_RANGE_OFFSET(reg)\
-	(((reg) >= 0x12000 && (reg) < 0x14000) ||\
-	((reg) >= 0x22000 && (reg) < 0x24000) ||\
-	((reg) >= 0x30000 && (reg) < 0x40000))
+#define FORCEWAKE_VLV_RENDER_RANGE_OFFSET(reg) \
+	(REG_RANGE((reg), 0x2000, 0x4000) || \
+	 REG_RANGE((reg), 0x5000, 0x8000) || \
+	 REG_RANGE((reg), 0xB000, 0x12000) || \
+	 REG_RANGE((reg), 0x2E000, 0x30000))
+
+#define FORCEWAKE_VLV_MEDIA_RANGE_OFFSET(reg) \
+	(REG_RANGE((reg), 0x12000, 0x14000) || \
+	 REG_RANGE((reg), 0x22000, 0x24000) || \
+	 REG_RANGE((reg), 0x30000, 0x40000))
+
+#define FORCEWAKE_CHV_RENDER_RANGE_OFFSET(reg) \
+	(REG_RANGE((reg), 0x2000, 0x4000) || \
+	 REG_RANGE((reg), 0x5000, 0x8000) || \
+	 REG_RANGE((reg), 0x8300, 0x8500) || \
+	 REG_RANGE((reg), 0xB000, 0xC000) || \
+	 REG_RANGE((reg), 0xE000, 0xE800))
+
+#define FORCEWAKE_CHV_MEDIA_RANGE_OFFSET(reg) \
+	(REG_RANGE((reg), 0x8800, 0x8900) || \
+	 REG_RANGE((reg), 0xD000, 0xD800) || \
+	 REG_RANGE((reg), 0x12000, 0x14000) || \
+	 REG_RANGE((reg), 0x1A000, 0x1C000) || \
+	 REG_RANGE((reg), 0x1E800, 0x1EA00) || \
+	 REG_RANGE((reg), 0x30000, 0x40000))
+
+#define FORCEWAKE_CHV_COMMON_RANGE_OFFSET(reg) \
+	(REG_RANGE((reg), 0x4000, 0x5000) || \
+	 REG_RANGE((reg), 0x8000, 0x8300) || \
+	 REG_RANGE((reg), 0x8500, 0x8600) || \
+	 REG_RANGE((reg), 0x9000, 0xB000) || \
+	 REG_RANGE((reg), 0xC000, 0xC800) || \
+	 REG_RANGE((reg), 0xF000, 0x10000) || \
+	 REG_RANGE((reg), 0x14000, 0x14400) || \
+	 REG_RANGE((reg), 0x22000, 0x24000))
 
 static void
 ilk_dummy_write(struct drm_i915_private *dev_priv)
@@ -590,7 +617,35 @@ vlv_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \
 	REG_READ_FOOTER; \
 }
 
+#define __chv_read(x) \
+static u##x \
+chv_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \
+	unsigned fwengine = 0; \
+	REG_READ_HEADER(x); \
+	if (FORCEWAKE_CHV_RENDER_RANGE_OFFSET(reg)) { \
+		if (dev_priv->uncore.fw_rendercount == 0) \
+			fwengine = FORCEWAKE_RENDER; \
+	} else if (FORCEWAKE_CHV_MEDIA_RANGE_OFFSET(reg)) { \
+		if (dev_priv->uncore.fw_mediacount == 0) \
+			fwengine = FORCEWAKE_MEDIA; \
+	} else if (FORCEWAKE_CHV_COMMON_RANGE_OFFSET(reg)) { \
+		if (dev_priv->uncore.fw_rendercount == 0) \
+			fwengine |= FORCEWAKE_RENDER; \
+		if (dev_priv->uncore.fw_mediacount == 0) \
+			fwengine |= FORCEWAKE_MEDIA; \
+	} \
+	if (fwengine) \
+		dev_priv->uncore.funcs.force_wake_get(dev_priv, fwengine); \
+	val = __raw_i915_read##x(dev_priv, reg); \
+	if (fwengine) \
+		dev_priv->uncore.funcs.force_wake_put(dev_priv, fwengine); \
+	REG_READ_FOOTER; \
+}
 
+__chv_read(8)
+__chv_read(16)
+__chv_read(32)
+__chv_read(64)
 __vlv_read(8)
 __vlv_read(16)
 __vlv_read(32)
@@ -608,6 +663,7 @@ __gen4_read(16)
 __gen4_read(32)
 __gen4_read(64)
 
+#undef __chv_read
 #undef __vlv_read
 #undef __gen6_read
 #undef __gen5_read
@@ -712,6 +768,38 @@ gen8_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace
 	REG_WRITE_FOOTER; \
 }
 
+#define __chv_write(x) \
+static void \
+chv_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) { \
+	unsigned fwengine = 0; \
+	bool shadowed = is_gen8_shadowed(dev_priv, reg); \
+	REG_WRITE_HEADER; \
+	if (!shadowed) { \
+		if (FORCEWAKE_CHV_RENDER_RANGE_OFFSET(reg)) { \
+			if (dev_priv->uncore.fw_rendercount == 0) \
+				fwengine = FORCEWAKE_RENDER; \
+		} else if (FORCEWAKE_CHV_MEDIA_RANGE_OFFSET(reg)) { \
+			if (dev_priv->uncore.fw_mediacount == 0) \
+				fwengine = FORCEWAKE_MEDIA; \
+		} else if (FORCEWAKE_CHV_COMMON_RANGE_OFFSET(reg)) { \
+			if (dev_priv->uncore.fw_rendercount == 0) \
+				fwengine |= FORCEWAKE_RENDER; \
+			if (dev_priv->uncore.fw_mediacount == 0) \
+				fwengine |= FORCEWAKE_MEDIA; \
+		} \
+	} \
+	if (fwengine) \
+		dev_priv->uncore.funcs.force_wake_get(dev_priv, fwengine); \
+	__raw_i915_write##x(dev_priv, reg, val); \
+	if (fwengine) \
+		dev_priv->uncore.funcs.force_wake_put(dev_priv, fwengine); \
+	REG_WRITE_FOOTER; \
+}
+
+__chv_write(8)
+__chv_write(16)
+__chv_write(32)
+__chv_write(64)
 __gen8_write(8)
 __gen8_write(16)
 __gen8_write(32)
@@ -733,6 +821,7 @@ __gen4_write(16)
 __gen4_write(32)
 __gen4_write(64)
 
+#undef __chv_write
 #undef __gen8_write
 #undef __hsw_write
 #undef __gen6_write
@@ -796,14 +885,26 @@ void intel_uncore_init(struct drm_device *dev)
 
 	switch (INTEL_INFO(dev)->gen) {
 	default:
-		dev_priv->uncore.funcs.mmio_writeb  = gen8_write8;
-		dev_priv->uncore.funcs.mmio_writew  = gen8_write16;
-		dev_priv->uncore.funcs.mmio_writel  = gen8_write32;
-		dev_priv->uncore.funcs.mmio_writeq  = gen8_write64;
-		dev_priv->uncore.funcs.mmio_readb  = gen6_read8;
-		dev_priv->uncore.funcs.mmio_readw  = gen6_read16;
-		dev_priv->uncore.funcs.mmio_readl  = gen6_read32;
-		dev_priv->uncore.funcs.mmio_readq  = gen6_read64;
+		if (IS_CHERRYVIEW(dev)) {
+			dev_priv->uncore.funcs.mmio_writeb  = chv_write8;
+			dev_priv->uncore.funcs.mmio_writew  = chv_write16;
+			dev_priv->uncore.funcs.mmio_writel  = chv_write32;
+			dev_priv->uncore.funcs.mmio_writeq  = chv_write64;
+			dev_priv->uncore.funcs.mmio_readb  = chv_read8;
+			dev_priv->uncore.funcs.mmio_readw  = chv_read16;
+			dev_priv->uncore.funcs.mmio_readl  = chv_read32;
+			dev_priv->uncore.funcs.mmio_readq  = chv_read64;
+
+		} else {
+			dev_priv->uncore.funcs.mmio_writeb  = gen8_write8;
+			dev_priv->uncore.funcs.mmio_writew  = gen8_write16;
+			dev_priv->uncore.funcs.mmio_writel  = gen8_write32;
+			dev_priv->uncore.funcs.mmio_writeq  = gen8_write64;
+			dev_priv->uncore.funcs.mmio_readb  = gen6_read8;
+			dev_priv->uncore.funcs.mmio_readw  = gen6_read16;
+			dev_priv->uncore.funcs.mmio_readl  = gen6_read32;
+			dev_priv->uncore.funcs.mmio_readq  = gen6_read64;
+		}
 		break;
 	case 7:
 	case 6:
Signature · 6 lines
1.9.1

_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
#3 lore raw

Re: [PATCH 2/7] drm/i915/chv: Added CHV specific register read and write and Streamline CHV forcewake stuff

Quoted 16 lines · On Fri, May 23, 2014 at 09:00:16PM +0530, [email protected] wrote:

From: Deepak S <[email protected]>

Support to individually control Media/Render well based on the register access. Add CHV specific write function to habdle difference between registers that are sadowed vs those that need forcewake even for writes.

Streamline the CHV forcewake functions just like was done for VLV.

This will also fix a bug in accessing the common well registers, where we'd end up trying to wake up the wells too many times since we'd call force_wake_get/put twice per register access, with FORCEFAKE_ALL both times.

v2: Drop write FIFO for CHV and add comman well forcewake (Ville)
Re-factor CHV/VLV Forcewake offsets (Ben)

Quoted 8 lines

v3: Fix for decrementing fw count in chv read/write. (Deepak)

v4: Squash the patches (Mika)

[vsyrjala: Move the register range macros into intel_uncore.c]

Only merged up to this one stil the next patch is missing r-b still. Mika? -Daniel

Quoted 194 lines
---
 drivers/gpu/drm/i915/intel_uncore.c | 135 +++++++++++++++++++++++++++++++-----
 1 file changed, 118 insertions(+), 17 deletions(-)
drivers/gpu/drm/i915/intel_uncore.c +118 -17
index 2f5d5d3..7409de0 100644
@@ -486,16 +486,43 @@ void assert_force_wake_inactive(struct drm_i915_private *dev_priv)
 #define NEEDS_FORCE_WAKE(dev_priv, reg) \
 	 ((reg) < 0x40000 && (reg) != FORCEWAKE)
 
-#define FORCEWAKE_VLV_RENDER_RANGE_OFFSET(reg) \
-	(((reg) >= 0x2000 && (reg) < 0x4000) ||\
-	((reg) >= 0x5000 && (reg) < 0x8000) ||\
-	((reg) >= 0xB000 && (reg) < 0x12000) ||\
-	((reg) >= 0x2E000 && (reg) < 0x30000))
+#define REG_RANGE(reg, start, end) ((reg) >= (start) && (reg) < (end))
 
-#define FORCEWAKE_VLV_MEDIA_RANGE_OFFSET(reg)\
-	(((reg) >= 0x12000 && (reg) < 0x14000) ||\
-	((reg) >= 0x22000 && (reg) < 0x24000) ||\
-	((reg) >= 0x30000 && (reg) < 0x40000))
+#define FORCEWAKE_VLV_RENDER_RANGE_OFFSET(reg) \
+	(REG_RANGE((reg), 0x2000, 0x4000) || \
+	 REG_RANGE((reg), 0x5000, 0x8000) || \
+	 REG_RANGE((reg), 0xB000, 0x12000) || \
+	 REG_RANGE((reg), 0x2E000, 0x30000))
+
+#define FORCEWAKE_VLV_MEDIA_RANGE_OFFSET(reg) \
+	(REG_RANGE((reg), 0x12000, 0x14000) || \
+	 REG_RANGE((reg), 0x22000, 0x24000) || \
+	 REG_RANGE((reg), 0x30000, 0x40000))
+
+#define FORCEWAKE_CHV_RENDER_RANGE_OFFSET(reg) \
+	(REG_RANGE((reg), 0x2000, 0x4000) || \
+	 REG_RANGE((reg), 0x5000, 0x8000) || \
+	 REG_RANGE((reg), 0x8300, 0x8500) || \
+	 REG_RANGE((reg), 0xB000, 0xC000) || \
+	 REG_RANGE((reg), 0xE000, 0xE800))
+
+#define FORCEWAKE_CHV_MEDIA_RANGE_OFFSET(reg) \
+	(REG_RANGE((reg), 0x8800, 0x8900) || \
+	 REG_RANGE((reg), 0xD000, 0xD800) || \
+	 REG_RANGE((reg), 0x12000, 0x14000) || \
+	 REG_RANGE((reg), 0x1A000, 0x1C000) || \
+	 REG_RANGE((reg), 0x1E800, 0x1EA00) || \
+	 REG_RANGE((reg), 0x30000, 0x40000))
+
+#define FORCEWAKE_CHV_COMMON_RANGE_OFFSET(reg) \
+	(REG_RANGE((reg), 0x4000, 0x5000) || \
+	 REG_RANGE((reg), 0x8000, 0x8300) || \
+	 REG_RANGE((reg), 0x8500, 0x8600) || \
+	 REG_RANGE((reg), 0x9000, 0xB000) || \
+	 REG_RANGE((reg), 0xC000, 0xC800) || \
+	 REG_RANGE((reg), 0xF000, 0x10000) || \
+	 REG_RANGE((reg), 0x14000, 0x14400) || \
+	 REG_RANGE((reg), 0x22000, 0x24000))
 
 static void
 ilk_dummy_write(struct drm_i915_private *dev_priv)
@@ -590,7 +617,35 @@ vlv_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \
 	REG_READ_FOOTER; \
 }
 
+#define __chv_read(x) \
+static u##x \
+chv_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \
+	unsigned fwengine = 0; \
+	REG_READ_HEADER(x); \
+	if (FORCEWAKE_CHV_RENDER_RANGE_OFFSET(reg)) { \
+		if (dev_priv->uncore.fw_rendercount == 0) \
+			fwengine = FORCEWAKE_RENDER; \
+	} else if (FORCEWAKE_CHV_MEDIA_RANGE_OFFSET(reg)) { \
+		if (dev_priv->uncore.fw_mediacount == 0) \
+			fwengine = FORCEWAKE_MEDIA; \
+	} else if (FORCEWAKE_CHV_COMMON_RANGE_OFFSET(reg)) { \
+		if (dev_priv->uncore.fw_rendercount == 0) \
+			fwengine |= FORCEWAKE_RENDER; \
+		if (dev_priv->uncore.fw_mediacount == 0) \
+			fwengine |= FORCEWAKE_MEDIA; \
+	} \
+	if (fwengine) \
+		dev_priv->uncore.funcs.force_wake_get(dev_priv, fwengine); \
+	val = __raw_i915_read##x(dev_priv, reg); \
+	if (fwengine) \
+		dev_priv->uncore.funcs.force_wake_put(dev_priv, fwengine); \
+	REG_READ_FOOTER; \
+}
 
+__chv_read(8)
+__chv_read(16)
+__chv_read(32)
+__chv_read(64)
 __vlv_read(8)
 __vlv_read(16)
 __vlv_read(32)
@@ -608,6 +663,7 @@ __gen4_read(16)
 __gen4_read(32)
 __gen4_read(64)
 
+#undef __chv_read
 #undef __vlv_read
 #undef __gen6_read
 #undef __gen5_read
@@ -712,6 +768,38 @@ gen8_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace
 	REG_WRITE_FOOTER; \
 }
 
+#define __chv_write(x) \
+static void \
+chv_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) { \
+	unsigned fwengine = 0; \
+	bool shadowed = is_gen8_shadowed(dev_priv, reg); \
+	REG_WRITE_HEADER; \
+	if (!shadowed) { \
+		if (FORCEWAKE_CHV_RENDER_RANGE_OFFSET(reg)) { \
+			if (dev_priv->uncore.fw_rendercount == 0) \
+				fwengine = FORCEWAKE_RENDER; \
+		} else if (FORCEWAKE_CHV_MEDIA_RANGE_OFFSET(reg)) { \
+			if (dev_priv->uncore.fw_mediacount == 0) \
+				fwengine = FORCEWAKE_MEDIA; \
+		} else if (FORCEWAKE_CHV_COMMON_RANGE_OFFSET(reg)) { \
+			if (dev_priv->uncore.fw_rendercount == 0) \
+				fwengine |= FORCEWAKE_RENDER; \
+			if (dev_priv->uncore.fw_mediacount == 0) \
+				fwengine |= FORCEWAKE_MEDIA; \
+		} \
+	} \
+	if (fwengine) \
+		dev_priv->uncore.funcs.force_wake_get(dev_priv, fwengine); \
+	__raw_i915_write##x(dev_priv, reg, val); \
+	if (fwengine) \
+		dev_priv->uncore.funcs.force_wake_put(dev_priv, fwengine); \
+	REG_WRITE_FOOTER; \
+}
+
+__chv_write(8)
+__chv_write(16)
+__chv_write(32)
+__chv_write(64)
 __gen8_write(8)
 __gen8_write(16)
 __gen8_write(32)
@@ -733,6 +821,7 @@ __gen4_write(16)
 __gen4_write(32)
 __gen4_write(64)
 
+#undef __chv_write
 #undef __gen8_write
 #undef __hsw_write
 #undef __gen6_write
@@ -796,14 +885,26 @@ void intel_uncore_init(struct drm_device *dev)
 
 	switch (INTEL_INFO(dev)->gen) {
 	default:
-		dev_priv->uncore.funcs.mmio_writeb  = gen8_write8;
-		dev_priv->uncore.funcs.mmio_writew  = gen8_write16;
-		dev_priv->uncore.funcs.mmio_writel  = gen8_write32;
-		dev_priv->uncore.funcs.mmio_writeq  = gen8_write64;
-		dev_priv->uncore.funcs.mmio_readb  = gen6_read8;
-		dev_priv->uncore.funcs.mmio_readw  = gen6_read16;
-		dev_priv->uncore.funcs.mmio_readl  = gen6_read32;
-		dev_priv->uncore.funcs.mmio_readq  = gen6_read64;
+		if (IS_CHERRYVIEW(dev)) {
+			dev_priv->uncore.funcs.mmio_writeb  = chv_write8;
+			dev_priv->uncore.funcs.mmio_writew  = chv_write16;
+			dev_priv->uncore.funcs.mmio_writel  = chv_write32;
+			dev_priv->uncore.funcs.mmio_writeq  = chv_write64;
+			dev_priv->uncore.funcs.mmio_readb  = chv_read8;
+			dev_priv->uncore.funcs.mmio_readw  = chv_read16;
+			dev_priv->uncore.funcs.mmio_readl  = chv_read32;
+			dev_priv->uncore.funcs.mmio_readq  = chv_read64;
+
+		} else {
+			dev_priv->uncore.funcs.mmio_writeb  = gen8_write8;
+			dev_priv->uncore.funcs.mmio_writew  = gen8_write16;
+			dev_priv->uncore.funcs.mmio_writel  = gen8_write32;
+			dev_priv->uncore.funcs.mmio_writeq  = gen8_write64;
+			dev_priv->uncore.funcs.mmio_readb  = gen6_read8;
+			dev_priv->uncore.funcs.mmio_readw  = gen6_read16;
+			dev_priv->uncore.funcs.mmio_readl  = gen6_read32;
+			dev_priv->uncore.funcs.mmio_readq  = gen6_read64;
+		}
 		break;
 	case 7:
 	case 6:
Signature · 6 lines
1.9.1

_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
Signature · 3 lines
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch
#4 lore raw

PATCH 3/7 drm/i915/chv: Enable RPS (Turbo) for Cherryview

In reply to [email protected]

From: Deepak S <[email protected]>

v2: Disable media turbo and Add DOWN_IDLE_AVG support (Ville)

v3: Mass rename of the dev_priv->rps variables in upstream.

v4: Rebase against latest code. (Deepak)

v5: Rebase against latest nightly code. (Deepak)

---
 drivers/gpu/drm/i915/i915_drv.h       |  1 +
 drivers/gpu/drm/i915/i915_reg.h       | 10 ++++
 drivers/gpu/drm/i915/intel_pm.c       | 95 ++++++++++++++++++++++++++++++++++-
 drivers/gpu/drm/i915/intel_sideband.c | 14 ++++++
 4 files changed, 119 insertions(+), 1 deletion(-)
drivers/gpu/drm/i915/i915_drv.h +1 -0
index 0412b12..5f0e338 100644
@@ -2621,6 +2621,7 @@ int sandybridge_pcode_write(struct drm_i915_private *dev_priv, u8 mbox, u32 val)
 u32 vlv_punit_read(struct drm_i915_private *dev_priv, u8 addr);
 void vlv_punit_write(struct drm_i915_private *dev_priv, u8 addr, u32 val);
 u32 vlv_nc_read(struct drm_i915_private *dev_priv, u8 addr);
+u32 chv_nc_read(struct drm_i915_private *dev_priv, u8 addr);
 u32 vlv_gpio_nc_read(struct drm_i915_private *dev_priv, u32 reg);
 void vlv_gpio_nc_write(struct drm_i915_private *dev_priv, u32 reg, u32 val);
 u32 vlv_cck_read(struct drm_i915_private *dev_priv, u32 reg);
drivers/gpu/drm/i915/i915_reg.h +10 -0
index c1f36a5..37f4b12 100644
@@ -487,6 +487,7 @@
 #define VLV_IOSF_DATA				(VLV_DISPLAY_BASE + 0x2104)
 #define VLV_IOSF_ADDR				(VLV_DISPLAY_BASE + 0x2108)
 
+#define   CHV_IOSF_PORT_NC			0x04
 /* See configdb bunit SB addr map */
 #define BUNIT_REG_BISOC				0x11
 
@@ -529,6 +530,14 @@ enum punit_power_well {
 #define PUNIT_FUSE_BUS2				0xf6 /* bits 47:40 */
 #define PUNIT_FUSE_BUS1				0xf5 /* bits 55:48 */
 
+#define CHV_IOSF_NC_FB_GFX_FREQ_FUSE		0xdb
+#define CHV_FB_GFX_MAX_FREQ_FUSE_SHIFT		16
+#define CHV_FB_GFX_MAX_FREQ_FUSE_MASK		0xff
+
+#define CHV_IOSF_NC_FB_GFX_RPE_FUSE		0xdf
+#define CHV_FB_RPE_FREQ_SHIFT			8
+#define CHV_FB_RPE_FREQ_MASK			0xff
+
 #define IOSF_NC_FB_GFX_FREQ_FUSE		0x1c
 #define   FB_GFX_MAX_FREQ_FUSE_SHIFT		3
 #define   FB_GFX_MAX_FREQ_FUSE_MASK		0x000007f8
@@ -933,6 +942,7 @@ enum punit_power_well {
 #define   SANDYBRIDGE_FENCE_PITCH_SHIFT	32
 #define   GEN7_FENCE_MAX_PITCH_VAL	0x0800
 
+
 /* control register for cpu gtt access */
 #define TILECTL				0x101000
 #define   TILECTL_SWZCTL			(1 << 0)
drivers/gpu/drm/i915/intel_pm.c +94 -1

120 lines not on this page · raw message

drivers/gpu/drm/i915/intel_sideband.c +14 -0
index 01d841e..a74f60b 100644
@@ -115,6 +115,20 @@ void vlv_bunit_write(struct drm_i915_private *dev_priv, u32 reg, u32 val)
 			SB_CRWRDA_NP, reg, &val);
 }
 
+u32 chv_nc_read(struct drm_i915_private *dev_priv, u8 addr)
+{
+	u32 val = 0;
+
+	WARN_ON(!mutex_is_locked(&dev_priv->rps.hw_lock));
+
+	mutex_lock(&dev_priv->dpio_lock);
+	vlv_sideband_rw(dev_priv, PCI_DEVFN(2, 0), CHV_IOSF_PORT_NC,
+			SB_CRRDDA_NP, addr, &val);
+	mutex_unlock(&dev_priv->dpio_lock);
+
+	return val;
+}
+
 u32 vlv_nc_read(struct drm_i915_private *dev_priv, u8 addr)
 {
 	u32 val = 0;
Signature · 1 line
1.9.1
#5 lore raw

Re: [PATCH 3/7] drm/i915/chv: Enable RPS (Turbo) for Cherryview

Hi Deepak,

Quoted 36 lines · [email protected] writes:

From: Deepak S <[email protected]>

v2: Disable media turbo and Add DOWN_IDLE_AVG support (Ville)

v3: Mass rename of the dev_priv->rps variables in upstream.

v4: Rebase against latest code. (Deepak)

v5: Rebase against latest nightly code. (Deepak)

---
 drivers/gpu/drm/i915/i915_drv.h       |  1 +
 drivers/gpu/drm/i915/i915_reg.h       | 10 ++++
 drivers/gpu/drm/i915/intel_pm.c       | 95 ++++++++++++++++++++++++++++++++++-
 drivers/gpu/drm/i915/intel_sideband.c | 14 ++++++
 4 files changed, 119 insertions(+), 1 deletion(-)
drivers/gpu/drm/i915/i915_drv.h +1 -0
index 0412b12..5f0e338 100644
@@ -2621,6 +2621,7 @@ int sandybridge_pcode_write(struct drm_i915_private *dev_priv, u8 mbox, u32 val)
 u32 vlv_punit_read(struct drm_i915_private *dev_priv, u8 addr);
 void vlv_punit_write(struct drm_i915_private *dev_priv, u8 addr, u32 val);
 u32 vlv_nc_read(struct drm_i915_private *dev_priv, u8 addr);
+u32 chv_nc_read(struct drm_i915_private *dev_priv, u8 addr);
 u32 vlv_gpio_nc_read(struct drm_i915_private *dev_priv, u32 reg);
 void vlv_gpio_nc_write(struct drm_i915_private *dev_priv, u32 reg, u32 val);
 u32 vlv_cck_read(struct drm_i915_private *dev_priv, u32 reg);
drivers/gpu/drm/i915/i915_reg.h +0 -0
index c1f36a5..37f4b12 100644

drivers/gpu/drm/i915/i915_reg.h line 490

Quoted 4 lines
drivers/gpu/drm/i915/i915_reg.h +1 -0
@@ -487,6 +487,7 @@
 #define VLV_IOSF_DATA				(VLV_DISPLAY_BASE + 0x2104)
 #define VLV_IOSF_ADDR				(VLV_DISPLAY_BASE + 0x2108)
 
+#define   CHV_IOSF_PORT_NC			0x04

Use IOSF_PORT_PUNIT instead of defining this?

Quoted 5 lines
drivers/gpu/drm/i915/i915_reg.h +0 -0
 /* See configdb bunit SB addr map */
 #define BUNIT_REG_BISOC				0x11
 
@@ -529,6 +530,14 @@ enum punit_power_well {
 #define PUNIT_FUSE_BUS2				0xf6 /* bits 47:40 */

drivers/gpu/drm/i915/i915_reg.h enum punit_power_well { · line 540

Quoted 10 lines
drivers/gpu/drm/i915/i915_reg.h +8 -0
 #define PUNIT_FUSE_BUS1				0xf5 /* bits 55:48 */
 
+#define CHV_IOSF_NC_FB_GFX_FREQ_FUSE		0xdb
+#define CHV_FB_GFX_MAX_FREQ_FUSE_SHIFT		16
+#define CHV_FB_GFX_MAX_FREQ_FUSE_MASK		0xff
+
+#define CHV_IOSF_NC_FB_GFX_RPE_FUSE		0xdf
+#define CHV_FB_RPE_FREQ_SHIFT			8
+#define CHV_FB_RPE_FREQ_MASK			0xff
+

These seem to be also part of punit space so I would prefer:

PUNIT_REG_GPU_STATUS 0xdb
PUNIT_GPU_STATUS_MAX_FREQ_SHIFT 16
PUNIT_GPU_STATUS_MAX_FREQ_MASK 0xff
PUNIT_REG_GPU_DUTYCYCLE 0xdf

etc...

Quoted 16 lines
drivers/gpu/drm/i915/i915_reg.h +1 -0
 #define IOSF_NC_FB_GFX_FREQ_FUSE		0x1c
 #define   FB_GFX_MAX_FREQ_FUSE_SHIFT		3
 #define   FB_GFX_MAX_FREQ_FUSE_MASK		0x000007f8
@@ -933,6 +942,7 @@ enum punit_power_well {
 #define   SANDYBRIDGE_FENCE_PITCH_SHIFT	32
 #define   GEN7_FENCE_MAX_PITCH_VAL	0x0800
 
+
 /* control register for cpu gtt access */
 #define TILECTL				0x101000
 #define   TILECTL_SWZCTL			(1 << 0)
drivers/gpu/drm/i915/intel_pm.c +0 -0
index 1816c52..08dcdc5 100644

drivers/gpu/drm/i915/intel_pm.c void gen6_update_ring_freq(struct drm_device *dev) · line 3739

Quoted 9 lines
drivers/gpu/drm/i915/intel_pm.c +6 -0
@@ -3731,6 +3731,38 @@ void gen6_update_ring_freq(struct drm_device *dev)
 	mutex_unlock(&dev_priv->rps.hw_lock);
 }
 
+int cherryview_rps_max_freq(struct drm_i915_private *dev_priv)
+{
+	u32 val, rp0;
+
+	val = chv_nc_read(dev_priv, CHV_IOSF_NC_FB_GFX_FREQ_FUSE);
+

I didn't find any reason we couldn't use vlv_punit_read().

Quoted 13 lines
drivers/gpu/drm/i915/intel_pm.c +13 -0
+	rp0 = (val >> CHV_FB_GFX_MAX_FREQ_FUSE_SHIFT) &
+					CHV_FB_GFX_MAX_FREQ_FUSE_MASK;
+
+	return rp0;
+}
+
+static int cherryview_rps_rpe_freq(struct drm_i915_private *dev_priv)
+{
+	u32 val, rpe;
+
+	val = chv_nc_read(dev_priv, CHV_IOSF_NC_FB_GFX_RPE_FUSE);
+	rpe = (val >> CHV_FB_RPE_FREQ_SHIFT) & CHV_FB_RPE_FREQ_MASK;
+

drivers/gpu/drm/i915/intel_pm.c void gen6_update_ring_freq(struct drm_device *dev) · line 3762

Quoted 10 lines
drivers/gpu/drm/i915/intel_pm.c +10 -0
+	return rpe;
+}
+
+int cherryview_rps_min_freq(struct drm_i915_private *dev_priv)
+{
+	u32 val, rpn;
+
+	val = chv_nc_read(dev_priv, CHV_IOSF_NC_FB_GFX_FREQ_FUSE);
+	rpn = (val >> CHV_FB_RPE_FREQ_SHIFT) & CHV_FB_RPE_FREQ_MASK;
+

Please don't reuse mask/shift from other register even tho they happen to be identical. This confuses the reader alot. Define new ones with proper naming.

Quoted 103 lines
drivers/gpu/drm/i915/intel_pm.c +65 -1
+	return rpn;
+}
+
 int valleyview_rps_max_freq(struct drm_i915_private *dev_priv)
 {
 	u32 val, rp0;
@@ -3890,7 +3922,36 @@ static void valleyview_init_gt_powersave(struct drm_device *dev)
 
 static void cherryview_init_gt_powersave(struct drm_device *dev)
 {
+	struct drm_i915_private *dev_priv = dev->dev_private;
+
 	cherryview_setup_pctx(dev);
+
+	mutex_lock(&dev_priv->rps.hw_lock);
+
+	dev_priv->rps.max_freq = cherryview_rps_max_freq(dev_priv);
+	dev_priv->rps.rp0_freq = dev_priv->rps.max_freq;
+	DRM_DEBUG_DRIVER("max GPU freq: %d MHz (%u)\n",
+			 vlv_gpu_freq(dev_priv, dev_priv->rps.max_freq),
+			 dev_priv->rps.max_freq);
+
+	dev_priv->rps.efficient_freq = cherryview_rps_rpe_freq(dev_priv);
+	DRM_DEBUG_DRIVER("RPe GPU freq: %d MHz (%u)\n",
+			 vlv_gpu_freq(dev_priv, dev_priv->rps.efficient_freq),
+			 dev_priv->rps.efficient_freq);
+
+	dev_priv->rps.min_freq = cherryview_rps_min_freq(dev_priv);
+	DRM_DEBUG_DRIVER("min GPU freq: %d MHz (%u)\n",
+			 vlv_gpu_freq(dev_priv, dev_priv->rps.min_freq),
+			 dev_priv->rps.min_freq);
+
+	/* Preserve min/max settings in case of re-init */
+	if (dev_priv->rps.max_freq_softlimit == 0)
+		dev_priv->rps.max_freq_softlimit = dev_priv->rps.max_freq;
+
+	if (dev_priv->rps.min_freq_softlimit == 0)
+		dev_priv->rps.min_freq_softlimit = dev_priv->rps.min_freq;
+
+	mutex_unlock(&dev_priv->rps.hw_lock);
 }
 
 static void valleyview_cleanup_gt_powersave(struct drm_device *dev)
@@ -3902,7 +3963,7 @@ static void cherryview_enable_rps(struct drm_device *dev)
 {
 	struct drm_i915_private *dev_priv = dev->dev_private;
 	struct intel_engine_cs *ring;
-	u32 gtfifodbg, rc6_mode = 0, pcbr;
+	u32 gtfifodbg, val, rc6_mode = 0, pcbr;
 	int i;
 
 	WARN_ON(!mutex_is_locked(&dev_priv->rps.hw_lock));
@@ -3949,6 +4010,38 @@ static void cherryview_enable_rps(struct drm_device *dev)
 
 	I915_WRITE(GEN6_RC_CONTROL, rc6_mode);
 
+	/* 4 Program defaults and thresholds for RPS*/
+	I915_WRITE(GEN6_RP_UP_THRESHOLD, 59400);
+	I915_WRITE(GEN6_RP_DOWN_THRESHOLD, 245000);
+	I915_WRITE(GEN6_RP_UP_EI, 66000);
+	I915_WRITE(GEN6_RP_DOWN_EI, 350000);
+
+	I915_WRITE(GEN6_RP_IDLE_HYSTERSIS, 10);
+
+	/* 5: Enable RPS */
+	I915_WRITE(GEN6_RP_CONTROL,
+		   GEN6_RP_MEDIA_HW_NORMAL_MODE |
+		   GEN6_RP_MEDIA_IS_GFX |
+		   GEN6_RP_ENABLE |
+		   GEN6_RP_UP_BUSY_AVG |
+		   GEN6_RP_DOWN_IDLE_AVG);
+
+	val = vlv_punit_read(dev_priv, PUNIT_REG_GPU_FREQ_STS);
+
+	DRM_DEBUG_DRIVER("GPLL enabled? %s\n", val & 0x10 ? "yes" : "no");
+	DRM_DEBUG_DRIVER("GPU status: 0x%08x\n", val);
+
+	dev_priv->rps.cur_freq = (val >> 8) & 0xff;
+	DRM_DEBUG_DRIVER("current GPU freq: %d MHz (%u)\n",
+			 vlv_gpu_freq(dev_priv, dev_priv->rps.cur_freq),
+			 dev_priv->rps.cur_freq);
+
+	DRM_DEBUG_DRIVER("setting GPU freq to %d MHz (%u)\n",
+			 vlv_gpu_freq(dev_priv, dev_priv->rps.efficient_freq),
+			 dev_priv->rps.efficient_freq);
+
+	valleyview_set_rps(dev_priv->dev, dev_priv->rps.efficient_freq);
+
 	gen6_gt_force_wake_put(dev_priv, FORCEWAKE_ALL);
 }
 
drivers/gpu/drm/i915/intel_sideband.c +4 -0
index 01d841e..a74f60b 100644
@@ -115,6 +115,20 @@ void vlv_bunit_write(struct drm_i915_private *dev_priv, u32 reg, u32 val)
 			SB_CRWRDA_NP, reg, &val);
 }
 
+u32 chv_nc_read(struct drm_i915_private *dev_priv, u8 addr)
+{
+	u32 val = 0;
+

drivers/gpu/drm/i915/intel_sideband.c void vlv_bunit_write(struct drm_i915_private *dev_priv, u32 reg, u32 val) · line 131

Quoted 10 lines
drivers/gpu/drm/i915/intel_sideband.c +10 -0
+	WARN_ON(!mutex_is_locked(&dev_priv->rps.hw_lock));
+
+	mutex_lock(&dev_priv->dpio_lock);
+	vlv_sideband_rw(dev_priv, PCI_DEVFN(2, 0), CHV_IOSF_PORT_NC,
+			SB_CRRDDA_NP, addr, &val);
+	mutex_unlock(&dev_priv->dpio_lock);
+
+	return val;
+}
+

Use vlv_punit_read() and you can get rid of this function.

-Mika

Quoted 10 lines
drivers/gpu/drm/i915/intel_sideband.c +0 -0
 u32 vlv_nc_read(struct drm_i915_private *dev_priv, u8 addr)
 {
 	u32 val = 0;
Signature · 6 lines
1.9.1

_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
author
#6 lore raw

Re: [PATCH 3/7] drm/i915/chv: Enable RPS (Turbo) for Cherryview

Quoted 43 lines · Mika Kuoppala

Hi Deepak,

Quoted 39 lines · [email protected] writes:

From: Deepak S <[email protected]>

v2: Disable media turbo and Add DOWN_IDLE_AVG support (Ville)

v3: Mass rename of the dev_priv->rps variables in upstream.

v4: Rebase against latest code. (Deepak)

v5: Rebase against latest nightly code. (Deepak)

---
  drivers/gpu/drm/i915/i915_drv.h       |  1 +
  drivers/gpu/drm/i915/i915_reg.h       | 10 ++++
  drivers/gpu/drm/i915/intel_pm.c       | 95 ++++++++++++++++++++++++++++++++++-
  drivers/gpu/drm/i915/intel_sideband.c | 14 ++++++
  4 files changed, 119 insertions(+), 1 deletion(-)
drivers/gpu/drm/i915/i915_drv.h +1 -0
index 0412b12..5f0e338 100644
@@ -2621,6 +2621,7 @@ int sandybridge_pcode_write(struct drm_i915_private *dev_priv, u8 mbox, u32 val)
  u32 vlv_punit_read(struct drm_i915_private *dev_priv, u8 addr);
  void vlv_punit_write(struct drm_i915_private *dev_priv, u8 addr, u32 val);
  u32 vlv_nc_read(struct drm_i915_private *dev_priv, u8 addr);
+u32 chv_nc_read(struct drm_i915_private *dev_priv, u8 addr);
  u32 vlv_gpio_nc_read(struct drm_i915_private *dev_priv, u32 reg);
  void vlv_gpio_nc_write(struct drm_i915_private *dev_priv, u32 reg, u32 val);
  u32 vlv_cck_read(struct drm_i915_private *dev_priv, u32 reg);
drivers/gpu/drm/i915/i915_reg.h +0 -0
index c1f36a5..37f4b12 100644
@@ -487,6 +487,7 @@
  #define VLV_IOSF_DATA				(VLV_DISPLAY_BASE + 0x2104)
  #define VLV_IOSF_ADDR				(VLV_DISPLAY_BASE + 0x2108)
 
Quoted 2 lines

drivers/gpu/drm/i915/i915_reg.h line 490

Quoted 1 line
drivers/gpu/drm/i915/i915_reg.h +1 -0
+#define   CHV_IOSF_PORT_NC			0x04

Use IOSF_PORT_PUNIT instead of defining this?

Yes, Agreed, I will address this

Quoted 21 lines
Quoted 5 lines
drivers/gpu/drm/i915/i915_reg.h +0 -0
  /* See configdb bunit SB addr map */
  #define BUNIT_REG_BISOC				0x11
 
@@ -529,6 +530,14 @@ enum punit_power_well {
  #define PUNIT_FUSE_BUS2				0xf6 /* bits 47:40 */

drivers/gpu/drm/i915/i915_reg.h enum punit_power_well { · line 540

Quoted 10 lines
drivers/gpu/drm/i915/i915_reg.h +8 -0
  #define PUNIT_FUSE_BUS1				0xf5 /* bits 55:48 */
 
+#define CHV_IOSF_NC_FB_GFX_FREQ_FUSE		0xdb
+#define CHV_FB_GFX_MAX_FREQ_FUSE_SHIFT		16
+#define CHV_FB_GFX_MAX_FREQ_FUSE_MASK		0xff
+
+#define CHV_IOSF_NC_FB_GFX_RPE_FUSE		0xdf
+#define CHV_FB_RPE_FREQ_SHIFT			8
+#define CHV_FB_RPE_FREQ_MASK			0xff
+

These seem to be also part of punit space so I would prefer:
PUNIT_REG_GPU_STATUS 0xdb
PUNIT_GPU_STATUS_MAX_FREQ_SHIFT 16
PUNIT_GPU_STATUS_MAX_FREQ_MASK 0xff
PUNIT_REG_GPU_DUTYCYCLE 0xdf

Quoted 1 line

etc...

I can change. Q? don't we want to identify the register with CHV?

Quoted 19 lines
Quoted 19 lines
drivers/gpu/drm/i915/i915_reg.h +1 -0
  #define IOSF_NC_FB_GFX_FREQ_FUSE		0x1c
  #define   FB_GFX_MAX_FREQ_FUSE_SHIFT		3
  #define   FB_GFX_MAX_FREQ_FUSE_MASK		0x000007f8
@@ -933,6 +942,7 @@ enum punit_power_well {
  #define   SANDYBRIDGE_FENCE_PITCH_SHIFT	32
  #define   GEN7_FENCE_MAX_PITCH_VAL	0x0800
 
+
  /* control register for cpu gtt access */
  #define TILECTL				0x101000
  #define   TILECTL_SWZCTL			(1 << 0)
drivers/gpu/drm/i915/intel_pm.c +0 -0
index 1816c52..08dcdc5 100644
@@ -3731,6 +3731,38 @@ void gen6_update_ring_freq(struct drm_device *dev)
  	mutex_unlock(&dev_priv->rps.hw_lock);
  }
 
Quoted 7 lines

drivers/gpu/drm/i915/intel_pm.c void gen6_update_ring_freq(struct drm_device *dev) · line 3739

Quoted 6 lines
drivers/gpu/drm/i915/intel_pm.c +6 -0
+int cherryview_rps_max_freq(struct drm_i915_private *dev_priv)
+{
+	u32 val, rp0;
+
+	val = chv_nc_read(dev_priv, CHV_IOSF_NC_FB_GFX_FREQ_FUSE);
+

I didn't find any reason we couldn't use vlv_punit_read().

I am adding separate function to be inline with VLV. If needed we can modify both VLV and CHV I would prefer to keep distinguish between fuse and punit read.

Quoted 126 lines
Quoted 13 lines
drivers/gpu/drm/i915/intel_pm.c +13 -0
+	rp0 = (val >> CHV_FB_GFX_MAX_FREQ_FUSE_SHIFT) &
+					CHV_FB_GFX_MAX_FREQ_FUSE_MASK;
+
+	return rp0;
+}
+
+static int cherryview_rps_rpe_freq(struct drm_i915_private *dev_priv)
+{
+	u32 val, rpe;
+
+	val = chv_nc_read(dev_priv, CHV_IOSF_NC_FB_GFX_RPE_FUSE);
+	rpe = (val >> CHV_FB_RPE_FREQ_SHIFT) & CHV_FB_RPE_FREQ_MASK;
+

drivers/gpu/drm/i915/intel_pm.c void gen6_update_ring_freq(struct drm_device *dev) · line 3762

Quoted 10 lines
drivers/gpu/drm/i915/intel_pm.c +10 -0
+	return rpe;
+}
+
+int cherryview_rps_min_freq(struct drm_i915_private *dev_priv)
+{
+	u32 val, rpn;
+
+	val = chv_nc_read(dev_priv, CHV_IOSF_NC_FB_GFX_FREQ_FUSE);
+	rpn = (val >> CHV_FB_RPE_FREQ_SHIFT) & CHV_FB_RPE_FREQ_MASK;
+

Please don't reuse mask/shift from other register even tho they happen to be identical. This confuses the reader alot. Define new ones with proper naming.

Quoted 99 lines
drivers/gpu/drm/i915/intel_pm.c +65 -1
+	return rpn;
+}
+
  int valleyview_rps_max_freq(struct drm_i915_private *dev_priv)
  {
  	u32 val, rp0;
@@ -3890,7 +3922,36 @@ static void valleyview_init_gt_powersave(struct drm_device *dev)
 
  static void cherryview_init_gt_powersave(struct drm_device *dev)
  {
+	struct drm_i915_private *dev_priv = dev->dev_private;
+
  	cherryview_setup_pctx(dev);
+
+	mutex_lock(&dev_priv->rps.hw_lock);
+
+	dev_priv->rps.max_freq = cherryview_rps_max_freq(dev_priv);
+	dev_priv->rps.rp0_freq = dev_priv->rps.max_freq;
+	DRM_DEBUG_DRIVER("max GPU freq: %d MHz (%u)\n",
+			 vlv_gpu_freq(dev_priv, dev_priv->rps.max_freq),
+			 dev_priv->rps.max_freq);
+
+	dev_priv->rps.efficient_freq = cherryview_rps_rpe_freq(dev_priv);
+	DRM_DEBUG_DRIVER("RPe GPU freq: %d MHz (%u)\n",
+			 vlv_gpu_freq(dev_priv, dev_priv->rps.efficient_freq),
+			 dev_priv->rps.efficient_freq);
+
+	dev_priv->rps.min_freq = cherryview_rps_min_freq(dev_priv);
+	DRM_DEBUG_DRIVER("min GPU freq: %d MHz (%u)\n",
+			 vlv_gpu_freq(dev_priv, dev_priv->rps.min_freq),
+			 dev_priv->rps.min_freq);
+
+	/* Preserve min/max settings in case of re-init */
+	if (dev_priv->rps.max_freq_softlimit == 0)
+		dev_priv->rps.max_freq_softlimit = dev_priv->rps.max_freq;
+
+	if (dev_priv->rps.min_freq_softlimit == 0)
+		dev_priv->rps.min_freq_softlimit = dev_priv->rps.min_freq;
+
+	mutex_unlock(&dev_priv->rps.hw_lock);
  }
 
  static void valleyview_cleanup_gt_powersave(struct drm_device *dev)
@@ -3902,7 +3963,7 @@ static void cherryview_enable_rps(struct drm_device *dev)
  {
  	struct drm_i915_private *dev_priv = dev->dev_private;
  	struct intel_engine_cs *ring;
-	u32 gtfifodbg, rc6_mode = 0, pcbr;
+	u32 gtfifodbg, val, rc6_mode = 0, pcbr;
  	int i;
 
  	WARN_ON(!mutex_is_locked(&dev_priv->rps.hw_lock));
@@ -3949,6 +4010,38 @@ static void cherryview_enable_rps(struct drm_device *dev)
 
  	I915_WRITE(GEN6_RC_CONTROL, rc6_mode);
 
+	/* 4 Program defaults and thresholds for RPS*/
+	I915_WRITE(GEN6_RP_UP_THRESHOLD, 59400);
+	I915_WRITE(GEN6_RP_DOWN_THRESHOLD, 245000);
+	I915_WRITE(GEN6_RP_UP_EI, 66000);
+	I915_WRITE(GEN6_RP_DOWN_EI, 350000);
+
+	I915_WRITE(GEN6_RP_IDLE_HYSTERSIS, 10);
+
+	/* 5: Enable RPS */
+	I915_WRITE(GEN6_RP_CONTROL,
+		   GEN6_RP_MEDIA_HW_NORMAL_MODE |
+		   GEN6_RP_MEDIA_IS_GFX |
+		   GEN6_RP_ENABLE |
+		   GEN6_RP_UP_BUSY_AVG |
+		   GEN6_RP_DOWN_IDLE_AVG);
+
+	val = vlv_punit_read(dev_priv, PUNIT_REG_GPU_FREQ_STS);
+
+	DRM_DEBUG_DRIVER("GPLL enabled? %s\n", val & 0x10 ? "yes" : "no");
+	DRM_DEBUG_DRIVER("GPU status: 0x%08x\n", val);
+
+	dev_priv->rps.cur_freq = (val >> 8) & 0xff;
+	DRM_DEBUG_DRIVER("current GPU freq: %d MHz (%u)\n",
+			 vlv_gpu_freq(dev_priv, dev_priv->rps.cur_freq),
+			 dev_priv->rps.cur_freq);
+
+	DRM_DEBUG_DRIVER("setting GPU freq to %d MHz (%u)\n",
+			 vlv_gpu_freq(dev_priv, dev_priv->rps.efficient_freq),
+			 dev_priv->rps.efficient_freq);
+
+	valleyview_set_rps(dev_priv->dev, dev_priv->rps.efficient_freq);
+
  	gen6_gt_force_wake_put(dev_priv, FORCEWAKE_ALL);
  }
 
drivers/gpu/drm/i915/intel_sideband.c +0 -0
index 01d841e..a74f60b 100644
@@ -115,6 +115,20 @@ void vlv_bunit_write(struct drm_i915_private *dev_priv, u32 reg, u32 val)
  			SB_CRWRDA_NP, reg, &val);
  }
 
Quoted 15 lines
Quoted 4 lines
drivers/gpu/drm/i915/intel_sideband.c +4 -0
+u32 chv_nc_read(struct drm_i915_private *dev_priv, u8 addr)
+{
+	u32 val = 0;
+

drivers/gpu/drm/i915/intel_sideband.c void vlv_bunit_write(struct drm_i915_private *dev_priv, u32 reg, u32 val) · line 131

Quoted 10 lines
drivers/gpu/drm/i915/intel_sideband.c +10 -0
+	WARN_ON(!mutex_is_locked(&dev_priv->rps.hw_lock));
+
+	mutex_lock(&dev_priv->dpio_lock);
+	vlv_sideband_rw(dev_priv, PCI_DEVFN(2, 0), CHV_IOSF_PORT_NC,
+			SB_CRRDDA_NP, addr, &val);
+	mutex_unlock(&dev_priv->dpio_lock);
+
+	return val;
+}
+

Use vlv_punit_read() and you can get rid of this function.

Same as above. I would prefer to keep distinguish between fuse and punit read. If needed i can change Let me know you thoughts?

Quoted 12 lines

-Mika

Quoted 10 lines
drivers/gpu/drm/i915/intel_sideband.c +0 -0
  u32 vlv_nc_read(struct drm_i915_private *dev_priv, u8 addr)
  {
  	u32 val = 0;
Signature · 6 lines
1.9.1

_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
#7 lore raw

Re: [PATCH 3/7] drm/i915/chv: Enable RPS (Turbo) for Cherryview

Quoted 102 lines · Deepak S
Quoted 43 lines · Mika Kuoppala

Hi Deepak,

Quoted 39 lines · [email protected] writes:

From: Deepak S <[email protected]>

v2: Disable media turbo and Add DOWN_IDLE_AVG support (Ville)

v3: Mass rename of the dev_priv->rps variables in upstream.

v4: Rebase against latest code. (Deepak)

v5: Rebase against latest nightly code. (Deepak)

---
  drivers/gpu/drm/i915/i915_drv.h       |  1 +
  drivers/gpu/drm/i915/i915_reg.h       | 10 ++++
  drivers/gpu/drm/i915/intel_pm.c       | 95 ++++++++++++++++++++++++++++++++++-
  drivers/gpu/drm/i915/intel_sideband.c | 14 ++++++
  4 files changed, 119 insertions(+), 1 deletion(-)
drivers/gpu/drm/i915/i915_drv.h +1 -0
index 0412b12..5f0e338 100644
@@ -2621,6 +2621,7 @@ int sandybridge_pcode_write(struct drm_i915_private *dev_priv, u8 mbox, u32 val)
  u32 vlv_punit_read(struct drm_i915_private *dev_priv, u8 addr);
  void vlv_punit_write(struct drm_i915_private *dev_priv, u8 addr, u32 val);
  u32 vlv_nc_read(struct drm_i915_private *dev_priv, u8 addr);
+u32 chv_nc_read(struct drm_i915_private *dev_priv, u8 addr);
  u32 vlv_gpio_nc_read(struct drm_i915_private *dev_priv, u32 reg);
  void vlv_gpio_nc_write(struct drm_i915_private *dev_priv, u32 reg, u32 val);
  u32 vlv_cck_read(struct drm_i915_private *dev_priv, u32 reg);
drivers/gpu/drm/i915/i915_reg.h +0 -0
index c1f36a5..37f4b12 100644
@@ -487,6 +487,7 @@
  #define VLV_IOSF_DATA				(VLV_DISPLAY_BASE + 0x2104)
  #define VLV_IOSF_ADDR				(VLV_DISPLAY_BASE + 0x2108)
 
Quoted 2 lines

drivers/gpu/drm/i915/i915_reg.h line 490

Quoted 1 line
drivers/gpu/drm/i915/i915_reg.h +1 -0
+#define   CHV_IOSF_PORT_NC			0x04

Use IOSF_PORT_PUNIT instead of defining this?

Yes, Agreed, I will address this

Quoted 21 lines
Quoted 5 lines
drivers/gpu/drm/i915/i915_reg.h +0 -0
  /* See configdb bunit SB addr map */
  #define BUNIT_REG_BISOC				0x11
 
@@ -529,6 +530,14 @@ enum punit_power_well {
  #define PUNIT_FUSE_BUS2				0xf6 /* bits 47:40 */

drivers/gpu/drm/i915/i915_reg.h enum punit_power_well { · line 540

Quoted 10 lines
drivers/gpu/drm/i915/i915_reg.h +8 -0
  #define PUNIT_FUSE_BUS1				0xf5 /* bits 55:48 */
 
+#define CHV_IOSF_NC_FB_GFX_FREQ_FUSE		0xdb
+#define CHV_FB_GFX_MAX_FREQ_FUSE_SHIFT		16
+#define CHV_FB_GFX_MAX_FREQ_FUSE_MASK		0xff
+
+#define CHV_IOSF_NC_FB_GFX_RPE_FUSE		0xdf
+#define CHV_FB_RPE_FREQ_SHIFT			8
+#define CHV_FB_RPE_FREQ_MASK			0xff
+

These seem to be also part of punit space so I would prefer:
PUNIT_REG_GPU_STATUS 0xdb
PUNIT_GPU_STATUS_MAX_FREQ_SHIFT 16
PUNIT_GPU_STATUS_MAX_FREQ_MASK 0xff
PUNIT_REG_GPU_DUTYCYCLE 0xdf

Quoted 1 line

etc...

I can change. Q? don't we want to identify the register with CHV?

Quoted 19 lines
Quoted 19 lines
drivers/gpu/drm/i915/i915_reg.h +1 -0
  #define IOSF_NC_FB_GFX_FREQ_FUSE		0x1c
  #define   FB_GFX_MAX_FREQ_FUSE_SHIFT		3
  #define   FB_GFX_MAX_FREQ_FUSE_MASK		0x000007f8
@@ -933,6 +942,7 @@ enum punit_power_well {
  #define   SANDYBRIDGE_FENCE_PITCH_SHIFT	32
  #define   GEN7_FENCE_MAX_PITCH_VAL	0x0800
 
+
  /* control register for cpu gtt access */
  #define TILECTL				0x101000
  #define   TILECTL_SWZCTL			(1 << 0)
drivers/gpu/drm/i915/intel_pm.c +0 -0
index 1816c52..08dcdc5 100644
@@ -3731,6 +3731,38 @@ void gen6_update_ring_freq(struct drm_device *dev)
  	mutex_unlock(&dev_priv->rps.hw_lock);
  }
 
Quoted 7 lines

drivers/gpu/drm/i915/intel_pm.c void gen6_update_ring_freq(struct drm_device *dev) · line 3739

Quoted 6 lines
drivers/gpu/drm/i915/intel_pm.c +6 -0
+int cherryview_rps_max_freq(struct drm_i915_private *dev_priv)
+{
+	u32 val, rp0;
+
+	val = chv_nc_read(dev_priv, CHV_IOSF_NC_FB_GFX_FREQ_FUSE);
+

I didn't find any reason we couldn't use vlv_punit_read().

Quoted 2 lines

I am adding separate function to be inline with VLV. If needed we can modify both VLV and CHV I would prefer to keep distinguish between fuse and punit read.

If the register is in the punit you should use the punit funcs. If there's something special about those registers just add a comment which explains it.

The whole nc unit seems to have disappeared in CHV, so it's rather confusing when you see NC being mentioned and then you go digging through the docs and can't find anything like it.

Signature · 2 lines
Ville Syrjälä
Intel OTC
author
#8 lore raw

Re: [PATCH 3/7] drm/i915/chv: Enable RPS (Turbo) for Cherryview

Quoted 101 lines · Ville Syrjälä
Quoted 98 lines · Deepak S
Quoted 43 lines · Mika Kuoppala

Hi Deepak,

Quoted 39 lines · [email protected] writes:

From: Deepak S <[email protected]>

v2: Disable media turbo and Add DOWN_IDLE_AVG support (Ville)

v3: Mass rename of the dev_priv->rps variables in upstream.

v4: Rebase against latest code. (Deepak)

v5: Rebase against latest nightly code. (Deepak)

---
   drivers/gpu/drm/i915/i915_drv.h       |  1 +
   drivers/gpu/drm/i915/i915_reg.h       | 10 ++++
   drivers/gpu/drm/i915/intel_pm.c       | 95 ++++++++++++++++++++++++++++++++++-
   drivers/gpu/drm/i915/intel_sideband.c | 14 ++++++
   4 files changed, 119 insertions(+), 1 deletion(-)
drivers/gpu/drm/i915/i915_drv.h +1 -0
index 0412b12..5f0e338 100644
@@ -2621,6 +2621,7 @@ int sandybridge_pcode_write(struct drm_i915_private *dev_priv, u8 mbox, u32 val)
   u32 vlv_punit_read(struct drm_i915_private *dev_priv, u8 addr);
   void vlv_punit_write(struct drm_i915_private *dev_priv, u8 addr, u32 val);
   u32 vlv_nc_read(struct drm_i915_private *dev_priv, u8 addr);
+u32 chv_nc_read(struct drm_i915_private *dev_priv, u8 addr);
   u32 vlv_gpio_nc_read(struct drm_i915_private *dev_priv, u32 reg);
   void vlv_gpio_nc_write(struct drm_i915_private *dev_priv, u32 reg, u32 val);
   u32 vlv_cck_read(struct drm_i915_private *dev_priv, u32 reg);
drivers/gpu/drm/i915/i915_reg.h +0 -0
index c1f36a5..37f4b12 100644
@@ -487,6 +487,7 @@
   #define VLV_IOSF_DATA				(VLV_DISPLAY_BASE + 0x2104)
   #define VLV_IOSF_ADDR				(VLV_DISPLAY_BASE + 0x2108)
 
Quoted 2 lines

drivers/gpu/drm/i915/i915_reg.h line 490

Quoted 1 line
drivers/gpu/drm/i915/i915_reg.h +1 -0
+#define   CHV_IOSF_PORT_NC			0x04

Use IOSF_PORT_PUNIT instead of defining this?

Yes, Agreed, I will address this

Quoted 17 lines
Quoted 5 lines
drivers/gpu/drm/i915/i915_reg.h +0 -0
   /* See configdb bunit SB addr map */
   #define BUNIT_REG_BISOC				0x11
 
@@ -529,6 +530,14 @@ enum punit_power_well {
   #define PUNIT_FUSE_BUS2				0xf6 /* bits 47:40 */

drivers/gpu/drm/i915/i915_reg.h enum punit_power_well { · line 540

Quoted 10 lines
drivers/gpu/drm/i915/i915_reg.h +8 -0
   #define PUNIT_FUSE_BUS1				0xf5 /* bits 55:48 */
 
+#define CHV_IOSF_NC_FB_GFX_FREQ_FUSE		0xdb
+#define CHV_FB_GFX_MAX_FREQ_FUSE_SHIFT		16
+#define CHV_FB_GFX_MAX_FREQ_FUSE_MASK		0xff
+
+#define CHV_IOSF_NC_FB_GFX_RPE_FUSE		0xdf
+#define CHV_FB_RPE_FREQ_SHIFT			8
+#define CHV_FB_RPE_FREQ_MASK			0xff
+

These seem to be also part of punit space so I would prefer:
PUNIT_REG_GPU_STATUS 0xdb

Quoted 5 lines
    PUNIT_GPU_STATUS_MAX_FREQ_SHIFT	16
    PUNIT_GPU_STATUS_MAX_FREQ_MASK	0xff

PUNIT_REG_GPU_DUTYCYCLE 0xdf

etc...

I can change. Q? don't we want to identify the register with CHV?

Quoted 19 lines
Quoted 19 lines
drivers/gpu/drm/i915/i915_reg.h +1 -0
   #define IOSF_NC_FB_GFX_FREQ_FUSE		0x1c
   #define   FB_GFX_MAX_FREQ_FUSE_SHIFT		3
   #define   FB_GFX_MAX_FREQ_FUSE_MASK		0x000007f8
@@ -933,6 +942,7 @@ enum punit_power_well {
   #define   SANDYBRIDGE_FENCE_PITCH_SHIFT	32
   #define   GEN7_FENCE_MAX_PITCH_VAL	0x0800
 
+
   /* control register for cpu gtt access */
   #define TILECTL				0x101000
   #define   TILECTL_SWZCTL			(1 << 0)
drivers/gpu/drm/i915/intel_pm.c +0 -0
index 1816c52..08dcdc5 100644
@@ -3731,6 +3731,38 @@ void gen6_update_ring_freq(struct drm_device *dev)
   	mutex_unlock(&dev_priv->rps.hw_lock);
   }
 
Quoted 7 lines

drivers/gpu/drm/i915/intel_pm.c void gen6_update_ring_freq(struct drm_device *dev) · line 3739

Quoted 6 lines
drivers/gpu/drm/i915/intel_pm.c +6 -0
+int cherryview_rps_max_freq(struct drm_i915_private *dev_priv)
+{
+	u32 val, rp0;
+
+	val = chv_nc_read(dev_priv, CHV_IOSF_NC_FB_GFX_FREQ_FUSE);
+

I didn't find any reason we couldn't use vlv_punit_read().

Quoted 2 lines

I am adding separate function to be inline with VLV. If needed we can modify both VLV and CHV I would prefer to keep distinguish between fuse and punit read.

Quoted 8 lines

If the register is in the punit you should use the punit funcs. If there's something special about those registers just add a comment which explains it.

The whole nc unit seems to have disappeared in CHV, so it's rather confusing when you see NC being mentioned and then you go digging through the docs and can't find anything like it.

Reading the latest Docs, I will address the comments.

#9 lore raw

Re: [PATCH 3/7] drm/i915/chv: Enable RPS (Turbo) for Cherryview

In reply to Deepak S
Quoted 70 lines · Deepak S
Quoted 43 lines · Mika Kuoppala

Hi Deepak,

Quoted 39 lines · [email protected] writes:

From: Deepak S <[email protected]>

v2: Disable media turbo and Add DOWN_IDLE_AVG support (Ville)

v3: Mass rename of the dev_priv->rps variables in upstream.

v4: Rebase against latest code. (Deepak)

v5: Rebase against latest nightly code. (Deepak)

---
  drivers/gpu/drm/i915/i915_drv.h       |  1 +
  drivers/gpu/drm/i915/i915_reg.h       | 10 ++++
  drivers/gpu/drm/i915/intel_pm.c       | 95 ++++++++++++++++++++++++++++++++++-
  drivers/gpu/drm/i915/intel_sideband.c | 14 ++++++
  4 files changed, 119 insertions(+), 1 deletion(-)
drivers/gpu/drm/i915/i915_drv.h +1 -0
index 0412b12..5f0e338 100644
@@ -2621,6 +2621,7 @@ int sandybridge_pcode_write(struct drm_i915_private *dev_priv, u8 mbox, u32 val)
  u32 vlv_punit_read(struct drm_i915_private *dev_priv, u8 addr);
  void vlv_punit_write(struct drm_i915_private *dev_priv, u8 addr, u32 val);
  u32 vlv_nc_read(struct drm_i915_private *dev_priv, u8 addr);
+u32 chv_nc_read(struct drm_i915_private *dev_priv, u8 addr);
  u32 vlv_gpio_nc_read(struct drm_i915_private *dev_priv, u32 reg);
  void vlv_gpio_nc_write(struct drm_i915_private *dev_priv, u32 reg, u32 val);
  u32 vlv_cck_read(struct drm_i915_private *dev_priv, u32 reg);
drivers/gpu/drm/i915/i915_reg.h +0 -0
index c1f36a5..37f4b12 100644
@@ -487,6 +487,7 @@
  #define VLV_IOSF_DATA				(VLV_DISPLAY_BASE + 0x2104)
  #define VLV_IOSF_ADDR				(VLV_DISPLAY_BASE + 0x2108)
 
Quoted 2 lines

drivers/gpu/drm/i915/i915_reg.h line 490

Quoted 1 line
drivers/gpu/drm/i915/i915_reg.h +1 -0
+#define   CHV_IOSF_PORT_NC			0x04

Use IOSF_PORT_PUNIT instead of defining this?

Yes, Agreed, I will address this

Quoted 21 lines
Quoted 5 lines
drivers/gpu/drm/i915/i915_reg.h +0 -0
  /* See configdb bunit SB addr map */
  #define BUNIT_REG_BISOC				0x11
 
@@ -529,6 +530,14 @@ enum punit_power_well {
  #define PUNIT_FUSE_BUS2				0xf6 /* bits 47:40 */

drivers/gpu/drm/i915/i915_reg.h enum punit_power_well { · line 540

Quoted 10 lines
drivers/gpu/drm/i915/i915_reg.h +8 -0
  #define PUNIT_FUSE_BUS1				0xf5 /* bits 55:48 */
 
+#define CHV_IOSF_NC_FB_GFX_FREQ_FUSE		0xdb
+#define CHV_FB_GFX_MAX_FREQ_FUSE_SHIFT		16
+#define CHV_FB_GFX_MAX_FREQ_FUSE_MASK		0xff
+
+#define CHV_IOSF_NC_FB_GFX_RPE_FUSE		0xdf
+#define CHV_FB_RPE_FREQ_SHIFT			8
+#define CHV_FB_RPE_FREQ_MASK			0xff
+

These seem to be also part of punit space so I would prefer:
PUNIT_REG_GPU_STATUS 0xdb
PUNIT_GPU_STATUS_MAX_FREQ_SHIFT 16
PUNIT_GPU_STATUS_MAX_FREQ_MASK 0xff
PUNIT_REG_GPU_DUTYCYCLE 0xdf

Quoted 3 lines
Quoted 1 line

etc...

I can change. Q? don't we want to identify the register with CHV?

If you like, add /* chv */ after those punit regs you add.

I would not globber the namespace more. As in this case only chv code will use these inside cherryview_* named functions.

Quoted 172 lines
Quoted 19 lines
Quoted 19 lines
drivers/gpu/drm/i915/i915_reg.h +1 -0
  #define IOSF_NC_FB_GFX_FREQ_FUSE		0x1c
  #define   FB_GFX_MAX_FREQ_FUSE_SHIFT		3
  #define   FB_GFX_MAX_FREQ_FUSE_MASK		0x000007f8
@@ -933,6 +942,7 @@ enum punit_power_well {
  #define   SANDYBRIDGE_FENCE_PITCH_SHIFT	32
  #define   GEN7_FENCE_MAX_PITCH_VAL	0x0800
 
+
  /* control register for cpu gtt access */
  #define TILECTL				0x101000
  #define   TILECTL_SWZCTL			(1 << 0)
drivers/gpu/drm/i915/intel_pm.c +0 -0
index 1816c52..08dcdc5 100644
@@ -3731,6 +3731,38 @@ void gen6_update_ring_freq(struct drm_device *dev)
  	mutex_unlock(&dev_priv->rps.hw_lock);
  }
 
Quoted 7 lines

drivers/gpu/drm/i915/intel_pm.c void gen6_update_ring_freq(struct drm_device *dev) · line 3739

Quoted 6 lines
drivers/gpu/drm/i915/intel_pm.c +6 -0
+int cherryview_rps_max_freq(struct drm_i915_private *dev_priv)
+{
+	u32 val, rp0;
+
+	val = chv_nc_read(dev_priv, CHV_IOSF_NC_FB_GFX_FREQ_FUSE);
+

I didn't find any reason we couldn't use vlv_punit_read().

I am adding separate function to be inline with VLV. If needed we can modify both VLV and CHV I would prefer to keep distinguish between fuse and punit read.

Quoted 126 lines
Quoted 13 lines
drivers/gpu/drm/i915/intel_pm.c +13 -0
+	rp0 = (val >> CHV_FB_GFX_MAX_FREQ_FUSE_SHIFT) &
+					CHV_FB_GFX_MAX_FREQ_FUSE_MASK;
+
+	return rp0;
+}
+
+static int cherryview_rps_rpe_freq(struct drm_i915_private *dev_priv)
+{
+	u32 val, rpe;
+
+	val = chv_nc_read(dev_priv, CHV_IOSF_NC_FB_GFX_RPE_FUSE);
+	rpe = (val >> CHV_FB_RPE_FREQ_SHIFT) & CHV_FB_RPE_FREQ_MASK;
+

drivers/gpu/drm/i915/intel_pm.c void gen6_update_ring_freq(struct drm_device *dev) · line 3762

Quoted 10 lines
drivers/gpu/drm/i915/intel_pm.c +10 -0
+	return rpe;
+}
+
+int cherryview_rps_min_freq(struct drm_i915_private *dev_priv)
+{
+	u32 val, rpn;
+
+	val = chv_nc_read(dev_priv, CHV_IOSF_NC_FB_GFX_FREQ_FUSE);
+	rpn = (val >> CHV_FB_RPE_FREQ_SHIFT) & CHV_FB_RPE_FREQ_MASK;
+

Please don't reuse mask/shift from other register even tho they happen to be identical. This confuses the reader alot. Define new ones with proper naming.

Quoted 99 lines
drivers/gpu/drm/i915/intel_pm.c +65 -1
+	return rpn;
+}
+
  int valleyview_rps_max_freq(struct drm_i915_private *dev_priv)
  {
  	u32 val, rp0;
@@ -3890,7 +3922,36 @@ static void valleyview_init_gt_powersave(struct drm_device *dev)
 
  static void cherryview_init_gt_powersave(struct drm_device *dev)
  {
+	struct drm_i915_private *dev_priv = dev->dev_private;
+
  	cherryview_setup_pctx(dev);
+
+	mutex_lock(&dev_priv->rps.hw_lock);
+
+	dev_priv->rps.max_freq = cherryview_rps_max_freq(dev_priv);
+	dev_priv->rps.rp0_freq = dev_priv->rps.max_freq;
+	DRM_DEBUG_DRIVER("max GPU freq: %d MHz (%u)\n",
+			 vlv_gpu_freq(dev_priv, dev_priv->rps.max_freq),
+			 dev_priv->rps.max_freq);
+
+	dev_priv->rps.efficient_freq = cherryview_rps_rpe_freq(dev_priv);
+	DRM_DEBUG_DRIVER("RPe GPU freq: %d MHz (%u)\n",
+			 vlv_gpu_freq(dev_priv, dev_priv->rps.efficient_freq),
+			 dev_priv->rps.efficient_freq);
+
+	dev_priv->rps.min_freq = cherryview_rps_min_freq(dev_priv);
+	DRM_DEBUG_DRIVER("min GPU freq: %d MHz (%u)\n",
+			 vlv_gpu_freq(dev_priv, dev_priv->rps.min_freq),
+			 dev_priv->rps.min_freq);
+
+	/* Preserve min/max settings in case of re-init */
+	if (dev_priv->rps.max_freq_softlimit == 0)
+		dev_priv->rps.max_freq_softlimit = dev_priv->rps.max_freq;
+
+	if (dev_priv->rps.min_freq_softlimit == 0)
+		dev_priv->rps.min_freq_softlimit = dev_priv->rps.min_freq;
+
+	mutex_unlock(&dev_priv->rps.hw_lock);
  }
 
  static void valleyview_cleanup_gt_powersave(struct drm_device *dev)
@@ -3902,7 +3963,7 @@ static void cherryview_enable_rps(struct drm_device *dev)
  {
  	struct drm_i915_private *dev_priv = dev->dev_private;
  	struct intel_engine_cs *ring;
-	u32 gtfifodbg, rc6_mode = 0, pcbr;
+	u32 gtfifodbg, val, rc6_mode = 0, pcbr;
  	int i;
 
  	WARN_ON(!mutex_is_locked(&dev_priv->rps.hw_lock));
@@ -3949,6 +4010,38 @@ static void cherryview_enable_rps(struct drm_device *dev)
 
  	I915_WRITE(GEN6_RC_CONTROL, rc6_mode);
 
+	/* 4 Program defaults and thresholds for RPS*/
+	I915_WRITE(GEN6_RP_UP_THRESHOLD, 59400);
+	I915_WRITE(GEN6_RP_DOWN_THRESHOLD, 245000);
+	I915_WRITE(GEN6_RP_UP_EI, 66000);
+	I915_WRITE(GEN6_RP_DOWN_EI, 350000);
+
+	I915_WRITE(GEN6_RP_IDLE_HYSTERSIS, 10);
+
+	/* 5: Enable RPS */
+	I915_WRITE(GEN6_RP_CONTROL,
+		   GEN6_RP_MEDIA_HW_NORMAL_MODE |
+		   GEN6_RP_MEDIA_IS_GFX |
+		   GEN6_RP_ENABLE |
+		   GEN6_RP_UP_BUSY_AVG |
+		   GEN6_RP_DOWN_IDLE_AVG);
+
+	val = vlv_punit_read(dev_priv, PUNIT_REG_GPU_FREQ_STS);
+
+	DRM_DEBUG_DRIVER("GPLL enabled? %s\n", val & 0x10 ? "yes" : "no");
+	DRM_DEBUG_DRIVER("GPU status: 0x%08x\n", val);
+
+	dev_priv->rps.cur_freq = (val >> 8) & 0xff;
+	DRM_DEBUG_DRIVER("current GPU freq: %d MHz (%u)\n",
+			 vlv_gpu_freq(dev_priv, dev_priv->rps.cur_freq),
+			 dev_priv->rps.cur_freq);
+
+	DRM_DEBUG_DRIVER("setting GPU freq to %d MHz (%u)\n",
+			 vlv_gpu_freq(dev_priv, dev_priv->rps.efficient_freq),
+			 dev_priv->rps.efficient_freq);
+
+	valleyview_set_rps(dev_priv->dev, dev_priv->rps.efficient_freq);
+
  	gen6_gt_force_wake_put(dev_priv, FORCEWAKE_ALL);
  }
 
drivers/gpu/drm/i915/intel_sideband.c +0 -0
index 01d841e..a74f60b 100644
@@ -115,6 +115,20 @@ void vlv_bunit_write(struct drm_i915_private *dev_priv, u32 reg, u32 val)
  			SB_CRWRDA_NP, reg, &val);
  }
 
Quoted 15 lines
Quoted 4 lines
drivers/gpu/drm/i915/intel_sideband.c +4 -0
+u32 chv_nc_read(struct drm_i915_private *dev_priv, u8 addr)
+{
+	u32 val = 0;
+

drivers/gpu/drm/i915/intel_sideband.c void vlv_bunit_write(struct drm_i915_private *dev_priv, u32 reg, u32 val) · line 131

Quoted 10 lines
drivers/gpu/drm/i915/intel_sideband.c +10 -0
+	WARN_ON(!mutex_is_locked(&dev_priv->rps.hw_lock));
+
+	mutex_lock(&dev_priv->dpio_lock);
+	vlv_sideband_rw(dev_priv, PCI_DEVFN(2, 0), CHV_IOSF_PORT_NC,
+			SB_CRRDDA_NP, addr, &val);
+	mutex_unlock(&dev_priv->dpio_lock);
+
+	return val;
+}
+

Use vlv_punit_read() and you can get rid of this function.

Quoted 2 lines

Same as above. I would prefer to keep distinguish between fuse and punit read. If needed i can change Let me know you thoughts?

The registers are in the punit space. The sideband target address is punit target address. For what I know, this is a punit access. Please explain why this fuse distingtion is needed/comes from.

If it has been fuse read in past then we have opportunity to forget the ugly past in here and match the code with the documentation. If this is the case, please change it to punit read and remove references to 'nc'

Thanks,
-Mika

Quoted 12 lines
Quoted 12 lines

-Mika

Quoted 10 lines
drivers/gpu/drm/i915/intel_sideband.c +0 -0
  u32 vlv_nc_read(struct drm_i915_private *dev_priv, u8 addr)
  {
  	u32 val = 0;
Signature · 6 lines
1.9.1

_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
author
#10 lore raw

Re: [PATCH 3/7] drm/i915/chv: Enable RPS (Turbo) for Cherryview

Thanks for the Review. I will address the comments

Quoted 272 lines · Mika Kuoppala
Quoted 69 lines · Deepak S
Quoted 43 lines · Mika Kuoppala

Hi Deepak,

Quoted 39 lines · [email protected] writes:

From: Deepak S <[email protected]>

v2: Disable media turbo and Add DOWN_IDLE_AVG support (Ville)

v3: Mass rename of the dev_priv->rps variables in upstream.

v4: Rebase against latest code. (Deepak)

v5: Rebase against latest nightly code. (Deepak)

---
   drivers/gpu/drm/i915/i915_drv.h       |  1 +
   drivers/gpu/drm/i915/i915_reg.h       | 10 ++++
   drivers/gpu/drm/i915/intel_pm.c       | 95 ++++++++++++++++++++++++++++++++++-
   drivers/gpu/drm/i915/intel_sideband.c | 14 ++++++
   4 files changed, 119 insertions(+), 1 deletion(-)
drivers/gpu/drm/i915/i915_drv.h +1 -0
index 0412b12..5f0e338 100644
@@ -2621,6 +2621,7 @@ int sandybridge_pcode_write(struct drm_i915_private *dev_priv, u8 mbox, u32 val)
   u32 vlv_punit_read(struct drm_i915_private *dev_priv, u8 addr);
   void vlv_punit_write(struct drm_i915_private *dev_priv, u8 addr, u32 val);
   u32 vlv_nc_read(struct drm_i915_private *dev_priv, u8 addr);
+u32 chv_nc_read(struct drm_i915_private *dev_priv, u8 addr);
   u32 vlv_gpio_nc_read(struct drm_i915_private *dev_priv, u32 reg);
   void vlv_gpio_nc_write(struct drm_i915_private *dev_priv, u32 reg, u32 val);
   u32 vlv_cck_read(struct drm_i915_private *dev_priv, u32 reg);
drivers/gpu/drm/i915/i915_reg.h +0 -0
index c1f36a5..37f4b12 100644
@@ -487,6 +487,7 @@
   #define VLV_IOSF_DATA				(VLV_DISPLAY_BASE + 0x2104)
   #define VLV_IOSF_ADDR				(VLV_DISPLAY_BASE + 0x2108)
 
Quoted 2 lines

drivers/gpu/drm/i915/i915_reg.h line 490

Quoted 1 line
drivers/gpu/drm/i915/i915_reg.h +1 -0
+#define   CHV_IOSF_PORT_NC			0x04

Use IOSF_PORT_PUNIT instead of defining this?

Yes, Agreed, I will address this

Quoted 21 lines
Quoted 5 lines
drivers/gpu/drm/i915/i915_reg.h +0 -0
   /* See configdb bunit SB addr map */
   #define BUNIT_REG_BISOC				0x11
 
@@ -529,6 +530,14 @@ enum punit_power_well {
   #define PUNIT_FUSE_BUS2				0xf6 /* bits 47:40 */

drivers/gpu/drm/i915/i915_reg.h enum punit_power_well { · line 540

Quoted 10 lines
drivers/gpu/drm/i915/i915_reg.h +8 -0
   #define PUNIT_FUSE_BUS1				0xf5 /* bits 55:48 */
 
+#define CHV_IOSF_NC_FB_GFX_FREQ_FUSE		0xdb
+#define CHV_FB_GFX_MAX_FREQ_FUSE_SHIFT		16
+#define CHV_FB_GFX_MAX_FREQ_FUSE_MASK		0xff
+
+#define CHV_IOSF_NC_FB_GFX_RPE_FUSE		0xdf
+#define CHV_FB_RPE_FREQ_SHIFT			8
+#define CHV_FB_RPE_FREQ_MASK			0xff
+

These seem to be also part of punit space so I would prefer:
PUNIT_REG_GPU_STATUS 0xdb

    PUNIT_GPU_STATUS_MAX_FREQ_SHIFT	16
    PUNIT_GPU_STATUS_MAX_FREQ_MASK	0xff

PUNIT_REG_GPU_DUTYCYCLE 0xdf

Quoted 2 lines
Quoted 1 line

etc...

I can change. Q? don't we want to identify the register with CHV?

If you like, add /* chv */ after those punit regs you add.

I would not globber the namespace more. As in this case only chv code will use these inside cherryview_* named functions.

Quoted 169 lines
Quoted 19 lines
Quoted 19 lines
drivers/gpu/drm/i915/i915_reg.h +1 -0
   #define IOSF_NC_FB_GFX_FREQ_FUSE		0x1c
   #define   FB_GFX_MAX_FREQ_FUSE_SHIFT		3
   #define   FB_GFX_MAX_FREQ_FUSE_MASK		0x000007f8
@@ -933,6 +942,7 @@ enum punit_power_well {
   #define   SANDYBRIDGE_FENCE_PITCH_SHIFT	32
   #define   GEN7_FENCE_MAX_PITCH_VAL	0x0800
 
+
   /* control register for cpu gtt access */
   #define TILECTL				0x101000
   #define   TILECTL_SWZCTL			(1 << 0)
drivers/gpu/drm/i915/intel_pm.c +0 -0
index 1816c52..08dcdc5 100644
@@ -3731,6 +3731,38 @@ void gen6_update_ring_freq(struct drm_device *dev)
   	mutex_unlock(&dev_priv->rps.hw_lock);
   }
 
Quoted 7 lines

drivers/gpu/drm/i915/intel_pm.c void gen6_update_ring_freq(struct drm_device *dev) · line 3739

Quoted 6 lines
drivers/gpu/drm/i915/intel_pm.c +6 -0
+int cherryview_rps_max_freq(struct drm_i915_private *dev_priv)
+{
+	u32 val, rp0;
+
+	val = chv_nc_read(dev_priv, CHV_IOSF_NC_FB_GFX_FREQ_FUSE);
+

I didn't find any reason we couldn't use vlv_punit_read().

I am adding separate function to be inline with VLV. If needed we can modify both VLV and CHV I would prefer to keep distinguish between fuse and punit read.

Quoted 126 lines
Quoted 13 lines
drivers/gpu/drm/i915/intel_pm.c +13 -0
+	rp0 = (val >> CHV_FB_GFX_MAX_FREQ_FUSE_SHIFT) &
+					CHV_FB_GFX_MAX_FREQ_FUSE_MASK;
+
+	return rp0;
+}
+
+static int cherryview_rps_rpe_freq(struct drm_i915_private *dev_priv)
+{
+	u32 val, rpe;
+
+	val = chv_nc_read(dev_priv, CHV_IOSF_NC_FB_GFX_RPE_FUSE);
+	rpe = (val >> CHV_FB_RPE_FREQ_SHIFT) & CHV_FB_RPE_FREQ_MASK;
+

drivers/gpu/drm/i915/intel_pm.c void gen6_update_ring_freq(struct drm_device *dev) · line 3762

Quoted 10 lines
drivers/gpu/drm/i915/intel_pm.c +10 -0
+	return rpe;
+}
+
+int cherryview_rps_min_freq(struct drm_i915_private *dev_priv)
+{
+	u32 val, rpn;
+
+	val = chv_nc_read(dev_priv, CHV_IOSF_NC_FB_GFX_FREQ_FUSE);
+	rpn = (val >> CHV_FB_RPE_FREQ_SHIFT) & CHV_FB_RPE_FREQ_MASK;
+

Please don't reuse mask/shift from other register even tho they happen to be identical. This confuses the reader alot. Define new ones with proper naming.

Quoted 99 lines
drivers/gpu/drm/i915/intel_pm.c +65 -1
+	return rpn;
+}
+
   int valleyview_rps_max_freq(struct drm_i915_private *dev_priv)
   {
   	u32 val, rp0;
@@ -3890,7 +3922,36 @@ static void valleyview_init_gt_powersave(struct drm_device *dev)
 
   static void cherryview_init_gt_powersave(struct drm_device *dev)
   {
+	struct drm_i915_private *dev_priv = dev->dev_private;
+
   	cherryview_setup_pctx(dev);
+
+	mutex_lock(&dev_priv->rps.hw_lock);
+
+	dev_priv->rps.max_freq = cherryview_rps_max_freq(dev_priv);
+	dev_priv->rps.rp0_freq = dev_priv->rps.max_freq;
+	DRM_DEBUG_DRIVER("max GPU freq: %d MHz (%u)\n",
+			 vlv_gpu_freq(dev_priv, dev_priv->rps.max_freq),
+			 dev_priv->rps.max_freq);
+
+	dev_priv->rps.efficient_freq = cherryview_rps_rpe_freq(dev_priv);
+	DRM_DEBUG_DRIVER("RPe GPU freq: %d MHz (%u)\n",
+			 vlv_gpu_freq(dev_priv, dev_priv->rps.efficient_freq),
+			 dev_priv->rps.efficient_freq);
+
+	dev_priv->rps.min_freq = cherryview_rps_min_freq(dev_priv);
+	DRM_DEBUG_DRIVER("min GPU freq: %d MHz (%u)\n",
+			 vlv_gpu_freq(dev_priv, dev_priv->rps.min_freq),
+			 dev_priv->rps.min_freq);
+
+	/* Preserve min/max settings in case of re-init */
+	if (dev_priv->rps.max_freq_softlimit == 0)
+		dev_priv->rps.max_freq_softlimit = dev_priv->rps.max_freq;
+
+	if (dev_priv->rps.min_freq_softlimit == 0)
+		dev_priv->rps.min_freq_softlimit = dev_priv->rps.min_freq;
+
+	mutex_unlock(&dev_priv->rps.hw_lock);
   }
 
   static void valleyview_cleanup_gt_powersave(struct drm_device *dev)
@@ -3902,7 +3963,7 @@ static void cherryview_enable_rps(struct drm_device *dev)
   {
   	struct drm_i915_private *dev_priv = dev->dev_private;
   	struct intel_engine_cs *ring;
-	u32 gtfifodbg, rc6_mode = 0, pcbr;
+	u32 gtfifodbg, val, rc6_mode = 0, pcbr;
   	int i;
 
   	WARN_ON(!mutex_is_locked(&dev_priv->rps.hw_lock));
@@ -3949,6 +4010,38 @@ static void cherryview_enable_rps(struct drm_device *dev)
 
   	I915_WRITE(GEN6_RC_CONTROL, rc6_mode);
 
+	/* 4 Program defaults and thresholds for RPS*/
+	I915_WRITE(GEN6_RP_UP_THRESHOLD, 59400);
+	I915_WRITE(GEN6_RP_DOWN_THRESHOLD, 245000);
+	I915_WRITE(GEN6_RP_UP_EI, 66000);
+	I915_WRITE(GEN6_RP_DOWN_EI, 350000);
+
+	I915_WRITE(GEN6_RP_IDLE_HYSTERSIS, 10);
+
+	/* 5: Enable RPS */
+	I915_WRITE(GEN6_RP_CONTROL,
+		   GEN6_RP_MEDIA_HW_NORMAL_MODE |
+		   GEN6_RP_MEDIA_IS_GFX |
+		   GEN6_RP_ENABLE |
+		   GEN6_RP_UP_BUSY_AVG |
+		   GEN6_RP_DOWN_IDLE_AVG);
+
+	val = vlv_punit_read(dev_priv, PUNIT_REG_GPU_FREQ_STS);
+
+	DRM_DEBUG_DRIVER("GPLL enabled? %s\n", val & 0x10 ? "yes" : "no");
+	DRM_DEBUG_DRIVER("GPU status: 0x%08x\n", val);
+
+	dev_priv->rps.cur_freq = (val >> 8) & 0xff;
+	DRM_DEBUG_DRIVER("current GPU freq: %d MHz (%u)\n",
+			 vlv_gpu_freq(dev_priv, dev_priv->rps.cur_freq),
+			 dev_priv->rps.cur_freq);
+
+	DRM_DEBUG_DRIVER("setting GPU freq to %d MHz (%u)\n",
+			 vlv_gpu_freq(dev_priv, dev_priv->rps.efficient_freq),
+			 dev_priv->rps.efficient_freq);
+
+	valleyview_set_rps(dev_priv->dev, dev_priv->rps.efficient_freq);
+
   	gen6_gt_force_wake_put(dev_priv, FORCEWAKE_ALL);
   }
 
drivers/gpu/drm/i915/intel_sideband.c +0 -0
index 01d841e..a74f60b 100644
@@ -115,6 +115,20 @@ void vlv_bunit_write(struct drm_i915_private *dev_priv, u32 reg, u32 val)
   			SB_CRWRDA_NP, reg, &val);
   }
 
Quoted 15 lines
Quoted 4 lines
drivers/gpu/drm/i915/intel_sideband.c +4 -0
+u32 chv_nc_read(struct drm_i915_private *dev_priv, u8 addr)
+{
+	u32 val = 0;
+

drivers/gpu/drm/i915/intel_sideband.c void vlv_bunit_write(struct drm_i915_private *dev_priv, u32 reg, u32 val) · line 131

Quoted 10 lines
drivers/gpu/drm/i915/intel_sideband.c +10 -0
+	WARN_ON(!mutex_is_locked(&dev_priv->rps.hw_lock));
+
+	mutex_lock(&dev_priv->dpio_lock);
+	vlv_sideband_rw(dev_priv, PCI_DEVFN(2, 0), CHV_IOSF_PORT_NC,
+			SB_CRRDDA_NP, addr, &val);
+	mutex_unlock(&dev_priv->dpio_lock);
+
+	return val;
+}
+

Use vlv_punit_read() and you can get rid of this function.

Quoted 2 lines

Same as above. I would prefer to keep distinguish between fuse and punit read. If needed i can change Let me know you thoughts?

The registers are in the punit space. The sideband target address is punit target address. For what I know, this is a punit access. Please explain why this fuse distingtion is needed/comes from.

If it has been fuse read in past then we have opportunity to forget the ugly past in here and match the code with the documentation. If this is the case, please change it to punit read and remove references to 'nc'

Thanks,
-Mika

Quoted 12 lines
Quoted 12 lines

-Mika

Quoted 10 lines
drivers/gpu/drm/i915/intel_sideband.c +0 -0
   u32 vlv_nc_read(struct drm_i915_private *dev_priv, u8 addr)
   {
   	u32 val = 0;
Signature · 6 lines
1.9.1

_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
#11 lore raw

PATCH v6 1/1 drm/i915/chv: Enable RPS (Turbo) for Cherryview

In reply to Deepak S

From: Deepak S <[email protected]>

v2: Disable media turbo and Add DOWN_IDLE_AVG support (Ville)

v3: Mass rename of the dev_priv->rps variables in upstream.

v4: Rebase against latest code. (Deepak)

v5: Rebase against latest nightly code. (Deepak)

v6: Rename the variables to match the spec (Mika)

---
 drivers/gpu/drm/i915/i915_reg.h | 11 +++++
 drivers/gpu/drm/i915/intel_pm.c | 95 ++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 105 insertions(+), 1 deletion(-)
drivers/gpu/drm/i915/i915_reg.h +11 -0
index c1f36a5..7e8968b 100644
@@ -529,6 +529,16 @@ enum punit_power_well {
 #define PUNIT_FUSE_BUS2				0xf6 /* bits 47:40 */
 #define PUNIT_FUSE_BUS1				0xf5 /* bits 55:48 */
 
+#define CHV_IOSF_PUNIT_FB_GFX_FREQ_REG		0xdb
+#define CHV_FB_GFX_MAX_FREQ_SHIFT		16
+#define CHV_FB_GFX_MAX_FREQ_MASK		0xff
+#define CHV_FB_GFX_MIN_FREQ_SHIFT		8
+#define CHV_FB_GFX_MIN_FREQ_MASK		0xff
+
+#define CHV_IOSF_PUNIT_FB_GFX_RPE_REG		0xdf
+#define CHV_FB_GFX_RPE_FREQ_SHIFT		8
+#define CHV_FB_GFX_RPE_FREQ_MASK		0xff
+
 #define IOSF_NC_FB_GFX_FREQ_FUSE		0x1c
 #define   FB_GFX_MAX_FREQ_FUSE_SHIFT		3
 #define   FB_GFX_MAX_FREQ_FUSE_MASK		0x000007f8
@@ -933,6 +943,7 @@ enum punit_power_well {
 #define   SANDYBRIDGE_FENCE_PITCH_SHIFT	32
 #define   GEN7_FENCE_MAX_PITCH_VAL	0x0800
 
+
 /* control register for cpu gtt access */
 #define TILECTL				0x101000
 #define   TILECTL_SWZCTL			(1 << 0)
drivers/gpu/drm/i915/intel_pm.c +94 -1

120 lines not on this page · raw message

Signature · 1 line
1.9.1
#12 lore raw

PATCH v7 1/1 drm/i915/chv: Enable RPS (Turbo) for Cherryview

In reply to Deepak S

From: Deepak S <[email protected]>

v2: Disable media turbo and Add DOWN_IDLE_AVG support (Ville)

v3: Mass rename of the dev_priv->rps variables in upstream.

v4: Rebase against latest code. (Deepak)

v5: Rebase against latest nightly code. (Deepak)

v6: Rename the variables to match the spec (Mika)

v7: change min/max freq variable naming to match spec (Mika)

---
 drivers/gpu/drm/i915/i915_reg.h | 11 +++++
 drivers/gpu/drm/i915/intel_pm.c | 92 ++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 102 insertions(+), 1 deletion(-)
drivers/gpu/drm/i915/i915_reg.h +11 -0
index c1f36a5..8a935cf 100644
@@ -529,6 +529,16 @@ enum punit_power_well {
 #define PUNIT_FUSE_BUS2				0xf6 /* bits 47:40 */
 #define PUNIT_FUSE_BUS1				0xf5 /* bits 55:48 */
 
+#define PUNIT_GPU_STATUS_REG			0xdb
+#define PUNIT_GPU_STATUS_MAX_FREQ_SHIFT	16
+#define PUNIT_GPU_STATUS_MAX_FREQ_MASK		0xff
+#define PUNIT_GPU_STATIS_GFX_MIN_FREQ_SHIFT	8
+#define PUNIT_GPU_STATUS_GFX_MIN_FREQ_MASK	0xff
+
+#define PUNIT_GPU_DUTYCYCLE_REG		0xdf
+#define PUNIT_GPU_DUTYCYCLE_RPE_FREQ_SHIFT	8
+#define PUNIT_GPU_DUTYCYCLE_RPE_FREQ_MASK	0xff
+
 #define IOSF_NC_FB_GFX_FREQ_FUSE		0x1c
 #define   FB_GFX_MAX_FREQ_FUSE_SHIFT		3
 #define   FB_GFX_MAX_FREQ_FUSE_MASK		0x000007f8
@@ -933,6 +943,7 @@ enum punit_power_well {
 #define   SANDYBRIDGE_FENCE_PITCH_SHIFT	32
 #define   GEN7_FENCE_MAX_PITCH_VAL	0x0800
 
+
 /* control register for cpu gtt access */
 #define TILECTL				0x101000
 #define   TILECTL_SWZCTL			(1 << 0)
drivers/gpu/drm/i915/intel_pm.c +91 -1

117 lines not on this page · raw message

Signature · 1 line
1.9.1
Reviewed-by on v7 1/1
#13 lore raw

Re: [PATCH v7] drm/i915/chv: Enable RPS (Turbo) for Cherryview

Quoted 10 lines · [email protected] writes:

From: Deepak S <[email protected]>

v2: Disable media turbo and Add DOWN_IDLE_AVG support (Ville)

v3: Mass rename of the dev_priv->rps variables in upstream.

v4: Rebase against latest code. (Deepak)

v5: Rebase against latest nightly code. (Deepak)

Quoted 7 lines

v6: Rename the variables to match the spec (Mika)

v7: change min/max freq variable naming to match spec (Mika)

---

Quoted 165 lines
 drivers/gpu/drm/i915/i915_reg.h | 11 +++++
 drivers/gpu/drm/i915/intel_pm.c | 92 ++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 102 insertions(+), 1 deletion(-)
drivers/gpu/drm/i915/i915_reg.h +11 -0
index c1f36a5..8a935cf 100644
@@ -529,6 +529,16 @@ enum punit_power_well {
 #define PUNIT_FUSE_BUS2				0xf6 /* bits 47:40 */
 #define PUNIT_FUSE_BUS1				0xf5 /* bits 55:48 */
 
+#define PUNIT_GPU_STATUS_REG			0xdb
+#define PUNIT_GPU_STATUS_MAX_FREQ_SHIFT	16
+#define PUNIT_GPU_STATUS_MAX_FREQ_MASK		0xff
+#define PUNIT_GPU_STATIS_GFX_MIN_FREQ_SHIFT	8
+#define PUNIT_GPU_STATUS_GFX_MIN_FREQ_MASK	0xff
+
+#define PUNIT_GPU_DUTYCYCLE_REG		0xdf
+#define PUNIT_GPU_DUTYCYCLE_RPE_FREQ_SHIFT	8
+#define PUNIT_GPU_DUTYCYCLE_RPE_FREQ_MASK	0xff
+
 #define IOSF_NC_FB_GFX_FREQ_FUSE		0x1c
 #define   FB_GFX_MAX_FREQ_FUSE_SHIFT		3
 #define   FB_GFX_MAX_FREQ_FUSE_MASK		0x000007f8
@@ -933,6 +943,7 @@ enum punit_power_well {
 #define   SANDYBRIDGE_FENCE_PITCH_SHIFT	32
 #define   GEN7_FENCE_MAX_PITCH_VAL	0x0800
 
+
 /* control register for cpu gtt access */
 #define TILECTL				0x101000
 #define   TILECTL_SWZCTL			(1 << 0)
drivers/gpu/drm/i915/intel_pm.c +91 -1
index 1816c52..0f36405 100644
@@ -3731,6 +3731,35 @@ void gen6_update_ring_freq(struct drm_device *dev)
 	mutex_unlock(&dev_priv->rps.hw_lock);
 }
 
+int cherryview_rps_max_freq(struct drm_i915_private *dev_priv)
+{
+	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;
+
+	return rp0;
+}
+
+static int cherryview_rps_rpe_freq(struct drm_i915_private *dev_priv)
+{
+	u32 val, rpe;
+
+	val = vlv_punit_read(dev_priv, PUNIT_GPU_DUTYCYCLE_REG);
+	rpe = (val >> PUNIT_GPU_DUTYCYCLE_RPE_FREQ_SHIFT) & PUNIT_GPU_DUTYCYCLE_RPE_FREQ_MASK;
+
+	return rpe;
+}
+
+int cherryview_rps_min_freq(struct drm_i915_private *dev_priv)
+{
+	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;
+	return rpn;
+}
+
 int valleyview_rps_max_freq(struct drm_i915_private *dev_priv)
 {
 	u32 val, rp0;
@@ -3890,7 +3919,36 @@ static void valleyview_init_gt_powersave(struct drm_device *dev)
 
 static void cherryview_init_gt_powersave(struct drm_device *dev)
 {
+	struct drm_i915_private *dev_priv = dev->dev_private;
+
 	cherryview_setup_pctx(dev);
+
+	mutex_lock(&dev_priv->rps.hw_lock);
+
+	dev_priv->rps.max_freq = cherryview_rps_max_freq(dev_priv);
+	dev_priv->rps.rp0_freq = dev_priv->rps.max_freq;
+	DRM_DEBUG_DRIVER("max GPU freq: %d MHz (%u)\n",
+			 vlv_gpu_freq(dev_priv, dev_priv->rps.max_freq),
+			 dev_priv->rps.max_freq);
+
+	dev_priv->rps.efficient_freq = cherryview_rps_rpe_freq(dev_priv);
+	DRM_DEBUG_DRIVER("RPe GPU freq: %d MHz (%u)\n",
+			 vlv_gpu_freq(dev_priv, dev_priv->rps.efficient_freq),
+			 dev_priv->rps.efficient_freq);
+
+	dev_priv->rps.min_freq = cherryview_rps_min_freq(dev_priv);
+	DRM_DEBUG_DRIVER("min GPU freq: %d MHz (%u)\n",
+			 vlv_gpu_freq(dev_priv, dev_priv->rps.min_freq),
+			 dev_priv->rps.min_freq);
+
+	/* Preserve min/max settings in case of re-init */
+	if (dev_priv->rps.max_freq_softlimit == 0)
+		dev_priv->rps.max_freq_softlimit = dev_priv->rps.max_freq;
+
+	if (dev_priv->rps.min_freq_softlimit == 0)
+		dev_priv->rps.min_freq_softlimit = dev_priv->rps.min_freq;
+
+	mutex_unlock(&dev_priv->rps.hw_lock);
 }
 
 static void valleyview_cleanup_gt_powersave(struct drm_device *dev)
@@ -3902,7 +3960,7 @@ static void cherryview_enable_rps(struct drm_device *dev)
 {
 	struct drm_i915_private *dev_priv = dev->dev_private;
 	struct intel_engine_cs *ring;
-	u32 gtfifodbg, rc6_mode = 0, pcbr;
+	u32 gtfifodbg, val, rc6_mode = 0, pcbr;
 	int i;
 
 	WARN_ON(!mutex_is_locked(&dev_priv->rps.hw_lock));
@@ -3949,6 +4007,38 @@ static void cherryview_enable_rps(struct drm_device *dev)
 
 	I915_WRITE(GEN6_RC_CONTROL, rc6_mode);
 
+	/* 4 Program defaults and thresholds for RPS*/
+	I915_WRITE(GEN6_RP_UP_THRESHOLD, 59400);
+	I915_WRITE(GEN6_RP_DOWN_THRESHOLD, 245000);
+	I915_WRITE(GEN6_RP_UP_EI, 66000);
+	I915_WRITE(GEN6_RP_DOWN_EI, 350000);
+
+	I915_WRITE(GEN6_RP_IDLE_HYSTERSIS, 10);
+
+	/* 5: Enable RPS */
+	I915_WRITE(GEN6_RP_CONTROL,
+		   GEN6_RP_MEDIA_HW_NORMAL_MODE |
+		   GEN6_RP_MEDIA_IS_GFX |
+		   GEN6_RP_ENABLE |
+		   GEN6_RP_UP_BUSY_AVG |
+		   GEN6_RP_DOWN_IDLE_AVG);
+
+	val = vlv_punit_read(dev_priv, PUNIT_REG_GPU_FREQ_STS);
+
+	DRM_DEBUG_DRIVER("GPLL enabled? %s\n", val & 0x10 ? "yes" : "no");
+	DRM_DEBUG_DRIVER("GPU status: 0x%08x\n", val);
+
+	dev_priv->rps.cur_freq = (val >> 8) & 0xff;
+	DRM_DEBUG_DRIVER("current GPU freq: %d MHz (%u)\n",
+			 vlv_gpu_freq(dev_priv, dev_priv->rps.cur_freq),
+			 dev_priv->rps.cur_freq);
+
+	DRM_DEBUG_DRIVER("setting GPU freq to %d MHz (%u)\n",
+			 vlv_gpu_freq(dev_priv, dev_priv->rps.efficient_freq),
+			 dev_priv->rps.efficient_freq);
+
+	valleyview_set_rps(dev_priv->dev, dev_priv->rps.efficient_freq);
+
 	gen6_gt_force_wake_put(dev_priv, FORCEWAKE_ALL);
 }
 
Signature · 6 lines
1.9.1

_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
#14 lore raw

Re: [PATCH v7] drm/i915/chv: Enable RPS (Turbo) for Cherryview

Quoted 14 lines · Mika Kuoppala
Quoted 12 lines · [email protected] writes:

From: Deepak S <[email protected]>

v2: Disable media turbo and Add DOWN_IDLE_AVG support (Ville)

v3: Mass rename of the dev_priv->rps variables in upstream.

v4: Rebase against latest code. (Deepak)

v5: Rebase against latest nightly code. (Deepak)

v6: Rename the variables to match the spec (Mika)

Quoted 7 lines
Quoted 5 lines

v7: change min/max freq variable naming to match spec (Mika)

---

Ok, I've merged all remaining patches except for patch 6. This one here angered checkpatch a bit, please check your patches before submission if you don't have a text editor which just gets all the little alignment recommendations right.

Thanks, Daniel

Quoted 166 lines
Quoted 166 lines
 drivers/gpu/drm/i915/i915_reg.h | 11 +++++
 drivers/gpu/drm/i915/intel_pm.c | 92 ++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 102 insertions(+), 1 deletion(-)
drivers/gpu/drm/i915/i915_reg.h +11 -0
index c1f36a5..8a935cf 100644
@@ -529,6 +529,16 @@ enum punit_power_well {
 #define PUNIT_FUSE_BUS2				0xf6 /* bits 47:40 */
 #define PUNIT_FUSE_BUS1				0xf5 /* bits 55:48 */
 
+#define PUNIT_GPU_STATUS_REG			0xdb
+#define PUNIT_GPU_STATUS_MAX_FREQ_SHIFT	16
+#define PUNIT_GPU_STATUS_MAX_FREQ_MASK		0xff
+#define PUNIT_GPU_STATIS_GFX_MIN_FREQ_SHIFT	8
+#define PUNIT_GPU_STATUS_GFX_MIN_FREQ_MASK	0xff
+
+#define PUNIT_GPU_DUTYCYCLE_REG		0xdf
+#define PUNIT_GPU_DUTYCYCLE_RPE_FREQ_SHIFT	8
+#define PUNIT_GPU_DUTYCYCLE_RPE_FREQ_MASK	0xff
+
 #define IOSF_NC_FB_GFX_FREQ_FUSE		0x1c
 #define   FB_GFX_MAX_FREQ_FUSE_SHIFT		3
 #define   FB_GFX_MAX_FREQ_FUSE_MASK		0x000007f8
@@ -933,6 +943,7 @@ enum punit_power_well {
 #define   SANDYBRIDGE_FENCE_PITCH_SHIFT	32
 #define   GEN7_FENCE_MAX_PITCH_VAL	0x0800
 
+
 /* control register for cpu gtt access */
 #define TILECTL				0x101000
 #define   TILECTL_SWZCTL			(1 << 0)
drivers/gpu/drm/i915/intel_pm.c +91 -1
index 1816c52..0f36405 100644
@@ -3731,6 +3731,35 @@ void gen6_update_ring_freq(struct drm_device *dev)
 	mutex_unlock(&dev_priv->rps.hw_lock);
 }
 
+int cherryview_rps_max_freq(struct drm_i915_private *dev_priv)
+{
+	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;
+
+	return rp0;
+}
+
+static int cherryview_rps_rpe_freq(struct drm_i915_private *dev_priv)
+{
+	u32 val, rpe;
+
+	val = vlv_punit_read(dev_priv, PUNIT_GPU_DUTYCYCLE_REG);
+	rpe = (val >> PUNIT_GPU_DUTYCYCLE_RPE_FREQ_SHIFT) & PUNIT_GPU_DUTYCYCLE_RPE_FREQ_MASK;
+
+	return rpe;
+}
+
+int cherryview_rps_min_freq(struct drm_i915_private *dev_priv)
+{
+	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;
+	return rpn;
+}
+
 int valleyview_rps_max_freq(struct drm_i915_private *dev_priv)
 {
 	u32 val, rp0;
@@ -3890,7 +3919,36 @@ static void valleyview_init_gt_powersave(struct drm_device *dev)
 
 static void cherryview_init_gt_powersave(struct drm_device *dev)
 {
+	struct drm_i915_private *dev_priv = dev->dev_private;
+
 	cherryview_setup_pctx(dev);
+
+	mutex_lock(&dev_priv->rps.hw_lock);
+
+	dev_priv->rps.max_freq = cherryview_rps_max_freq(dev_priv);
+	dev_priv->rps.rp0_freq = dev_priv->rps.max_freq;
+	DRM_DEBUG_DRIVER("max GPU freq: %d MHz (%u)\n",
+			 vlv_gpu_freq(dev_priv, dev_priv->rps.max_freq),
+			 dev_priv->rps.max_freq);
+
+	dev_priv->rps.efficient_freq = cherryview_rps_rpe_freq(dev_priv);
+	DRM_DEBUG_DRIVER("RPe GPU freq: %d MHz (%u)\n",
+			 vlv_gpu_freq(dev_priv, dev_priv->rps.efficient_freq),
+			 dev_priv->rps.efficient_freq);
+
+	dev_priv->rps.min_freq = cherryview_rps_min_freq(dev_priv);
+	DRM_DEBUG_DRIVER("min GPU freq: %d MHz (%u)\n",
+			 vlv_gpu_freq(dev_priv, dev_priv->rps.min_freq),
+			 dev_priv->rps.min_freq);
+
+	/* Preserve min/max settings in case of re-init */
+	if (dev_priv->rps.max_freq_softlimit == 0)
+		dev_priv->rps.max_freq_softlimit = dev_priv->rps.max_freq;
+
+	if (dev_priv->rps.min_freq_softlimit == 0)
+		dev_priv->rps.min_freq_softlimit = dev_priv->rps.min_freq;
+
+	mutex_unlock(&dev_priv->rps.hw_lock);
 }
 
 static void valleyview_cleanup_gt_powersave(struct drm_device *dev)
@@ -3902,7 +3960,7 @@ static void cherryview_enable_rps(struct drm_device *dev)
 {
 	struct drm_i915_private *dev_priv = dev->dev_private;
 	struct intel_engine_cs *ring;
-	u32 gtfifodbg, rc6_mode = 0, pcbr;
+	u32 gtfifodbg, val, rc6_mode = 0, pcbr;
 	int i;
 
 	WARN_ON(!mutex_is_locked(&dev_priv->rps.hw_lock));
@@ -3949,6 +4007,38 @@ static void cherryview_enable_rps(struct drm_device *dev)
 
 	I915_WRITE(GEN6_RC_CONTROL, rc6_mode);
 
+	/* 4 Program defaults and thresholds for RPS*/
+	I915_WRITE(GEN6_RP_UP_THRESHOLD, 59400);
+	I915_WRITE(GEN6_RP_DOWN_THRESHOLD, 245000);
+	I915_WRITE(GEN6_RP_UP_EI, 66000);
+	I915_WRITE(GEN6_RP_DOWN_EI, 350000);
+
+	I915_WRITE(GEN6_RP_IDLE_HYSTERSIS, 10);
+
+	/* 5: Enable RPS */
+	I915_WRITE(GEN6_RP_CONTROL,
+		   GEN6_RP_MEDIA_HW_NORMAL_MODE |
+		   GEN6_RP_MEDIA_IS_GFX |
+		   GEN6_RP_ENABLE |
+		   GEN6_RP_UP_BUSY_AVG |
+		   GEN6_RP_DOWN_IDLE_AVG);
+
+	val = vlv_punit_read(dev_priv, PUNIT_REG_GPU_FREQ_STS);
+
+	DRM_DEBUG_DRIVER("GPLL enabled? %s\n", val & 0x10 ? "yes" : "no");
+	DRM_DEBUG_DRIVER("GPU status: 0x%08x\n", val);
+
+	dev_priv->rps.cur_freq = (val >> 8) & 0xff;
+	DRM_DEBUG_DRIVER("current GPU freq: %d MHz (%u)\n",
+			 vlv_gpu_freq(dev_priv, dev_priv->rps.cur_freq),
+			 dev_priv->rps.cur_freq);
+
+	DRM_DEBUG_DRIVER("setting GPU freq to %d MHz (%u)\n",
+			 vlv_gpu_freq(dev_priv, dev_priv->rps.efficient_freq),
+			 dev_priv->rps.efficient_freq);
+
+	valleyview_set_rps(dev_priv->dev, dev_priv->rps.efficient_freq);
+
 	gen6_gt_force_wake_put(dev_priv, FORCEWAKE_ALL);
 }
 
Signature · 6 lines
1.9.1

_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
Signature · 3 lines
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch
#15 lore raw

PATCH 4/7 drm/i915/chv: CHV doesn't need WaRsForcewakeWaitTC0

In reply to [email protected]

From: Ville Syrjälä <[email protected]>

Skip __gen6_gt_wait_for_thread_c0() on CHV.

---
 drivers/gpu/drm/i915/intel_uncore.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/gpu/drm/i915/intel_uncore.c +2 -2
index 7409de0..5f9200a 100644
@@ -231,8 +231,8 @@ static void __vlv_force_wake_get(struct drm_i915_private *dev_priv,
 	}
 
 	/* WaRsForcewakeWaitTC0:vlv */
-	__gen6_gt_wait_for_thread_c0(dev_priv);
-
+	if (!IS_CHERRYVIEW(dev_priv->dev))
+		__gen6_gt_wait_for_thread_c0(dev_priv);
 }
 
 static void __vlv_force_wake_put(struct drm_i915_private *dev_priv,
Signature · 6 lines
1.9.1

_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
#16 lore raw

PATCH 5/7 drm/i915/chv: Skip gen6_gt_check_fifodbg() on CHV

In reply to [email protected]

From: Ville Syrjälä <[email protected]>

CHV uses the gen8 shadow register mechanism so we shouldn't be checking the GT FIFO status.

This effectively removes the posting read, so add an explicit posting read using FORCEWAKE_ACK_VLV (which is what use in vlv_forcewake_reset()).

---
 drivers/gpu/drm/i915/intel_uncore.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/gpu/drm/i915/intel_uncore.c +4 -3
index 5f9200a..d44941b 100644
@@ -250,9 +250,10 @@ static void __vlv_force_wake_put(struct drm_i915_private *dev_priv,
 		__raw_i915_write32(dev_priv, FORCEWAKE_MEDIA_VLV,
 				_MASKED_BIT_DISABLE(FORCEWAKE_KERNEL));
 
-	/* The below doubles as a POSTING_READ */
-	gen6_gt_check_fifodbg(dev_priv);
-
+	/* something from same cacheline, but !FORCEWAKE_VLV */
+	__raw_posting_read(dev_priv, FORCEWAKE_ACK_VLV);
+	if (!IS_CHERRYVIEW(dev_priv->dev))
+		gen6_gt_check_fifodbg(dev_priv);
 }
 
 static void vlv_force_wake_get(struct drm_i915_private *dev_priv, int fw_engine)
Signature · 6 lines
1.9.1

_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
#17 lore raw

PATCH 6/7 drm/i915/chv: Added CHV specific DDR fetch into init_clock_gating

In reply to [email protected]

From: Deepak S <[email protected]>

[vsyrjala: Fix merge fubmle where the code ended up in g4x_disable_trickle_feed() instead of cherryview_init_clock_gating()]

---
 drivers/gpu/drm/i915/intel_pm.c | 11 +++++++++++
 1 file changed, 11 insertions(+)
drivers/gpu/drm/i915/intel_pm.c +11 -0
index 08dcdc5..0b73a6d 100644
@@ -4026,7 +4026,18 @@ static void cherryview_enable_rps(struct drm_device *dev)
 		   GEN6_RP_UP_BUSY_AVG |
 		   GEN6_RP_DOWN_IDLE_AVG);
 
+	/* ToDo: Update the mem freq based on latest spec [CHV]*/
 	val = vlv_punit_read(dev_priv, PUNIT_REG_GPU_FREQ_STS);
+	switch ((val >> 6) & 3) {
+	case 0:
+	case 1:
+	case 2:
+		dev_priv->mem_freq = 1600;
+		break;
+	case 3:
+		dev_priv->mem_freq = 2000;
+		break;
+	}
 
 	DRM_DEBUG_DRIVER("GPLL enabled? %s\n", val & 0x10 ? "yes" : "no");
 	DRM_DEBUG_DRIVER("GPU status: 0x%08x\n", val);
Signature · 6 lines
1.9.1

_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
#18 lore raw

Re: [PATCH 6/7] drm/i915/chv: Added CHV specific DDR fetch into init_clock_gating

Quoted 16 lines · [email protected] writes:

From: Deepak S <[email protected]>

[vsyrjala: Fix merge fubmle where the code ended up in g4x_disable_trickle_feed() instead of cherryview_init_clock_gating()]

---
 drivers/gpu/drm/i915/intel_pm.c | 11 +++++++++++
 1 file changed, 11 insertions(+)
drivers/gpu/drm/i915/intel_pm.c +0 -0
index 08dcdc5..0b73a6d 100644

drivers/gpu/drm/i915/intel_pm.c static void cherryview_enable_rps(struct drm_device *dev) · line 4029

Quoted 4 lines
drivers/gpu/drm/i915/intel_pm.c +1 -0
@@ -4026,7 +4026,18 @@ static void cherryview_enable_rps(struct drm_device *dev)
 		   GEN6_RP_UP_BUSY_AVG |
 		   GEN6_RP_DOWN_IDLE_AVG);
 
+	/* ToDo: Update the mem freq based on latest spec [CHV]*/

Please do and consider fixing the vlv decoding. It seems to be off too.

-Mika

Quoted 21 lines
drivers/gpu/drm/i915/intel_pm.c +10 -0
 	val = vlv_punit_read(dev_priv, PUNIT_REG_GPU_FREQ_STS);
+	switch ((val >> 6) & 3) {
+	case 0:
+	case 1:
+	case 2:
+		dev_priv->mem_freq = 1600;
+		break;
+	case 3:
+		dev_priv->mem_freq = 2000;
+		break;
+	}
 
 	DRM_DEBUG_DRIVER("GPLL enabled? %s\n", val & 0x10 ? "yes" : "no");
 	DRM_DEBUG_DRIVER("GPU status: 0x%08x\n", val);
Signature · 6 lines
1.9.1

_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

#19 lore raw

Re: [PATCH 6/7] drm/i915/chv: Added CHV specific DDR fetch into init_clock_gating

Quoted 21 lines · Mika Kuoppala
Quoted 19 lines · [email protected] writes:

From: Deepak S <[email protected]>

[vsyrjala: Fix merge fubmle where the code ended up in g4x_disable_trickle_feed() instead of cherryview_init_clock_gating()]

---
 drivers/gpu/drm/i915/intel_pm.c | 11 +++++++++++
 1 file changed, 11 insertions(+)
drivers/gpu/drm/i915/intel_pm.c +0 -0
index 08dcdc5..0b73a6d 100644
@@ -4026,7 +4026,18 @@ static void cherryview_enable_rps(struct drm_device *dev)
 		   GEN6_RP_UP_BUSY_AVG |
 		   GEN6_RP_DOWN_IDLE_AVG);
 
Quoted 4 lines

drivers/gpu/drm/i915/intel_pm.c static void cherryview_enable_rps(struct drm_device *dev) · line 4029

Quoted 1 line
drivers/gpu/drm/i915/intel_pm.c +1 -0
+	/* ToDo: Update the mem freq based on latest spec [CHV]*/

Please do and consider fixing the vlv decoding. It seems to be off too.

Poke about this one here. Iirc the situation on vlv is simply terminal confusion, and iirc the current code matches reality of shipping vbiosen, but not any spec. I hope we're bettter for chv.
-Daniel

Quoted 28 lines

-Mika

Quoted 21 lines
drivers/gpu/drm/i915/intel_pm.c +10 -0
 	val = vlv_punit_read(dev_priv, PUNIT_REG_GPU_FREQ_STS);
+	switch ((val >> 6) & 3) {
+	case 0:
+	case 1:
+	case 2:
+		dev_priv->mem_freq = 1600;
+		break;
+	case 3:
+		dev_priv->mem_freq = 2000;
+		break;
+	}
 
 	DRM_DEBUG_DRIVER("GPLL enabled? %s\n", val & 0x10 ? "yes" : "no");
 	DRM_DEBUG_DRIVER("GPU status: 0x%08x\n", val);
Signature · 6 lines
1.9.1

_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Signature · 3 lines
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch
#20 lore raw

Re: [PATCH 6/7] drm/i915/chv: Added CHV specific DDR fetch into init_clock_gating

Quoted 22 lines · Daniel Vetter
Quoted 21 lines · Mika Kuoppala
Quoted 19 lines · [email protected] writes:

From: Deepak S <[email protected]>

[vsyrjala: Fix merge fubmle where the code ended up in g4x_disable_trickle_feed() instead of cherryview_init_clock_gating()]

---
 drivers/gpu/drm/i915/intel_pm.c | 11 +++++++++++
 1 file changed, 11 insertions(+)
drivers/gpu/drm/i915/intel_pm.c +0 -0
index 08dcdc5..0b73a6d 100644
@@ -4026,7 +4026,18 @@ static void cherryview_enable_rps(struct drm_device *dev)
 		   GEN6_RP_UP_BUSY_AVG |
 		   GEN6_RP_DOWN_IDLE_AVG);
 
Quoted 8 lines
Quoted 4 lines

drivers/gpu/drm/i915/intel_pm.c static void cherryview_enable_rps(struct drm_device *dev) · line 4029

Quoted 1 line
drivers/gpu/drm/i915/intel_pm.c +1 -0
+	/* ToDo: Update the mem freq based on latest spec [CHV]*/

Please do and consider fixing the vlv decoding. It seems to be off too.

Poke about this one here. Iirc the situation on vlv is simply terminal confusion, and iirc the current code matches reality of shipping vbiosen, but not any spec.

Yeah changed back here:

commit f6d519481b662d9fc52836e6e6107520f03e0122

Author: Deepak S <[email protected]>
Date:   Thu Apr 3 21:01:28 2014 +0530

Revert "drm/i915/vlv: fixup DDR freq detection per Punit spec"

As per the inputs provided by hardware team we still use DDR Rates as 0,1=800, 2=1066, 3=1333.
With this change, Turbo freqs used on current machines matches.

I think what we need is a comment there which states why we're going against the spec, just to avoid future confusion and someone accidentally changing it back again.

Quoted 1 line

I hope we're bettter for chv.

One can dream.

Signature · 2 lines
Ville Syrjälä
Intel OTC
author
#21 lore raw

Re: [PATCH 6/7] drm/i915/chv: Added CHV specific DDR fetch into init_clock_gating

Quoted 42 lines · Ville Syrjälä
Quoted 22 lines · Daniel Vetter
Quoted 21 lines · Mika Kuoppala
Quoted 19 lines · [email protected] writes:

From: Deepak S <[email protected]>

[vsyrjala: Fix merge fubmle where the code ended up in g4x_disable_trickle_feed() instead of cherryview_init_clock_gating()]

---
  drivers/gpu/drm/i915/intel_pm.c | 11 +++++++++++
  1 file changed, 11 insertions(+)
drivers/gpu/drm/i915/intel_pm.c +0 -0
index 08dcdc5..0b73a6d 100644
@@ -4026,7 +4026,18 @@ static void cherryview_enable_rps(struct drm_device *dev)
  		   GEN6_RP_UP_BUSY_AVG |
  		   GEN6_RP_DOWN_IDLE_AVG);
 
Quoted 6 lines
Quoted 3 lines

drivers/gpu/drm/i915/intel_pm.c static void cherryview_enable_rps(struct drm_device *dev) · line 4029

Quoted 1 line
drivers/gpu/drm/i915/intel_pm.c +1 -0
+	/* ToDo: Update the mem freq based on latest spec [CHV]*/

Please do and consider fixing the vlv decoding. It seems to be off too.

Poke about this one here. Iirc the situation on vlv is simply terminal confusion, and iirc the current code matches reality of shipping vbiosen, but not any spec.

Yeah changed back here:

commit f6d519481b662d9fc52836e6e6107520f03e0122

Author: Deepak S <[email protected]>
Date:   Thu Apr 3 21:01:28 2014 +0530

Revert "drm/i915/vlv: fixup DDR freq detection per Punit spec"

As per the inputs provided by hardware team we still use DDR Rates as 0,1=800, 2=1066, 3=1333.
With this change, Turbo freqs used on current machines matches.

Quoted 6 lines

I think what we need is a comment there which states why we're going against the spec, just to avoid future confusion and someone accidentally changing it back again.

Quoted 1 line

I hope we're bettter for chv.

One can dream.

Problem is the spec is not update to latest. Based on the communication from the HW team i update the proper value. For CHV, I have updated based on the values i got from HW team.

author
#22 lore raw

Re: [PATCH 6/7] drm/i915/chv: Added CHV specific DDR fetch into init_clock_gating

In reply to Daniel Vetter
Quoted 22 lines · Daniel Vetter
Quoted 21 lines · Mika Kuoppala
Quoted 19 lines · [email protected] writes:

From: Deepak S <[email protected]>

[vsyrjala: Fix merge fubmle where the code ended up in g4x_disable_trickle_feed() instead of cherryview_init_clock_gating()]

---
  drivers/gpu/drm/i915/intel_pm.c | 11 +++++++++++
  1 file changed, 11 insertions(+)
drivers/gpu/drm/i915/intel_pm.c +0 -0
index 08dcdc5..0b73a6d 100644
@@ -4026,7 +4026,18 @@ static void cherryview_enable_rps(struct drm_device *dev)
  		   GEN6_RP_UP_BUSY_AVG |
  		   GEN6_RP_DOWN_IDLE_AVG);
 
Quoted 7 lines
Quoted 3 lines

drivers/gpu/drm/i915/intel_pm.c static void cherryview_enable_rps(struct drm_device *dev) · line 4029

Quoted 1 line
drivers/gpu/drm/i915/intel_pm.c +1 -0
+	/* ToDo: Update the mem freq based on latest spec [CHV]*/

Please do and consider fixing the vlv decoding. It seems to be off too.

Poke about this one here. Iirc the situation on vlv is simply terminal confusion, and iirc the current code matches reality of shipping vbiosen, but not any spec. I hope we're bettter for chv.
-Daniel

I am trying to get proper values updated in the spec so that we dont have confusion. Once it is available I will update the code accordingly.

Quoted 27 lines
Quoted 27 lines

-Mika

Quoted 21 lines
drivers/gpu/drm/i915/intel_pm.c +10 -0
  	val = vlv_punit_read(dev_priv, PUNIT_REG_GPU_FREQ_STS);
+	switch ((val >> 6) & 3) {
+	case 0:
+	case 1:
+	case 2:
+		dev_priv->mem_freq = 1600;
+		break;
+	case 3:
+		dev_priv->mem_freq = 2000;
+		break;
+	}
 
  	DRM_DEBUG_DRIVER("GPLL enabled? %s\n", val & 0x10 ? "yes" : "no");
  	DRM_DEBUG_DRIVER("GPU status: 0x%08x\n", val);
Signature · 6 lines
1.9.1

_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

#23 lore raw

PATCH 7/7 drm/i915/chv: Freq(opcode) request for CHV.

In reply to [email protected]

From: Deepak S <[email protected]>

On CHV, All the freq request should be even. So, we need to make sure we request the opcode accordingly.

v2: Avoid vairable for freq request (ville)

---
 drivers/gpu/drm/i915/i915_irq.c | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)
drivers/gpu/drm/i915/i915_irq.c +8 -4
index 28bae6e..671d751 100644
@@ -1258,8 +1258,10 @@ static void gen6_pm_rps_work(struct work_struct *work)
 	if (pm_iir & GEN6_PM_RP_UP_THRESHOLD) {
 		if (adj > 0)
 			adj *= 2;
-		else
-			adj = 1;
+		else {
+			/* CHV needs even encode values */
+			adj = IS_CHERRYVIEW(dev_priv->dev) ? 2 : 1;
+		}
 		new_delay = dev_priv->rps.cur_freq + adj;
 
 		/*
@@ -1277,8 +1279,10 @@ static void gen6_pm_rps_work(struct work_struct *work)
 	} else if (pm_iir & GEN6_PM_RP_DOWN_THRESHOLD) {
 		if (adj < 0)
 			adj *= 2;
-		else
-			adj = -1;
+		else {
+			/* CHV needs even encode values */
+			adj = IS_CHERRYVIEW(dev_priv->dev) ? -2 : -1;
+		}
 		new_delay = dev_priv->rps.cur_freq + adj;
 	} else { /* unknown event */
 		new_delay = dev_priv->rps.cur_freq;
Signature · 1 line
1.9.1