Enable RC6/Turbo on CHV
Subsystems (2)
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
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
@@ -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
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)
--- drivers/gpu/drm/i915/intel_uncore.c | 135 +++++++++++++++++++++++++++++++----- 1 file changed, 118 insertions(+), 17 deletions(-)
drivers/gpu/drm/i915/intel_uncore.c +118 -17
@@ -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 traceREG_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
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_ALLboth 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)
Reviewed-by Mika Kuoppala <[email protected]>[vsyrjala: Move the register range macros into intel_uncore.c]Signed-off-by Ville Syrjälä <[email protected]>Signed-off-by Deepak S <[email protected]>
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@@ -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 traceREG_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
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
@@ -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
@@ -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
@@ -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
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_AVGsupport (Ville)v3: Mass rename of the
dev_priv->rpsvariables in upstream.v4: Rebase against latest code. (Deepak)
v5: Rebase against latest nightly code. (Deepak)
Signed-off-by Deepak S <[email protected]>Signed-off-by Daniel Vetter <[email protected]>--- 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@@ -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
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 0xffPUNIT_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
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@@ -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
-0u32 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
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_AVGsupport (Ville)v3: Mass rename of the
dev_priv->rpsvariables in upstream.v4: Rebase against latest code. (Deepak)
v5: Rebase against latest nightly code. (Deepak)
Signed-off-by Deepak S <[email protected]>Signed-off-by Daniel Vetter <[email protected]>--- 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@@ -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@@ -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 0x04Use
IOSF_PORT_PUNITinstead 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_STATUS0xdb
PUNIT_GPU_STATUS_MAX_FREQ_SHIFT16
PUNIT_GPU_STATUS_MAX_FREQ_MASK0xffPUNIT_REG_GPU_DUTYCYCLE0xdf
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@@ -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@@ -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
-0u32 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
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_AVGsupport (Ville)v3: Mass rename of the
dev_priv->rpsvariables in upstream.v4: Rebase against latest code. (Deepak)
v5: Rebase against latest nightly code. (Deepak)
Signed-off-by Deepak S <[email protected]>Signed-off-by Daniel Vetter <[email protected]>--- 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@@ -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@@ -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 0x04Use
IOSF_PORT_PUNITinstead 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_STATUS0xdb
PUNIT_GPU_STATUS_MAX_FREQ_SHIFT16
PUNIT_GPU_STATUS_MAX_FREQ_MASK0xffPUNIT_REG_GPU_DUTYCYCLE0xdfQuoted 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@@ -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
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_AVGsupport (Ville)v3: Mass rename of the
dev_priv->rpsvariables in upstream.v4: Rebase against latest code. (Deepak)
v5: Rebase against latest nightly code. (Deepak)
Signed-off-by Deepak S <[email protected]>Signed-off-by Daniel Vetter <[email protected]>--- 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@@ -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@@ -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 0x04Use
IOSF_PORT_PUNITinstead 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_STATUS0xdbQuoted 5 lines
PUNIT_GPU_STATUS_MAX_FREQ_SHIFT 16 PUNIT_GPU_STATUS_MAX_FREQ_MASK 0xff
PUNIT_REG_GPU_DUTYCYCLE0xdfetc...
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@@ -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.
Re: [PATCH 3/7] drm/i915/chv: Enable RPS (Turbo) for Cherryview
In reply to Deepak SQuoted 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_AVGsupport (Ville)v3: Mass rename of the
dev_priv->rpsvariables in upstream.v4: Rebase against latest code. (Deepak)
v5: Rebase against latest nightly code. (Deepak)
Signed-off-by Deepak S <[email protected]>Signed-off-by Daniel Vetter <[email protected]>--- 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@@ -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@@ -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 0x04Use
IOSF_PORT_PUNITinstead 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_STATUS0xdb
PUNIT_GPU_STATUS_MAX_FREQ_SHIFT16
PUNIT_GPU_STATUS_MAX_FREQ_MASK0xffPUNIT_REG_GPU_DUTYCYCLE0xdf
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@@ -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@@ -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
-0u32 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
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_AVGsupport (Ville)v3: Mass rename of the
dev_priv->rpsvariables in upstream.v4: Rebase against latest code. (Deepak)
v5: Rebase against latest nightly code. (Deepak)
Signed-off-by Deepak S <[email protected]>Signed-off-by Daniel Vetter <[email protected]>--- 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@@ -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@@ -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 0x04Use
IOSF_PORT_PUNITinstead 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_STATUS0xdbPUNIT_GPU_STATUS_MAX_FREQ_SHIFT 16 PUNIT_GPU_STATUS_MAX_FREQ_MASK 0xff
PUNIT_REG_GPU_DUTYCYCLE0xdfQuoted 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@@ -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@@ -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,
-MikaQuoted 12 lines
Quoted 12 lines
-Mika
Quoted 10 lines
drivers/gpu/drm/i915/intel_sideband.c +0
-0u32 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
PATCH v6 1/1 drm/i915/chv: Enable RPS (Turbo) for Cherryview
In reply to Deepak SFrom: 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
@@ -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
PATCH v7 1/1 drm/i915/chv: Enable RPS (Turbo) for Cherryview
In reply to Deepak SFrom: 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
@@ -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
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_AVGsupport (Ville)v3: Mass rename of the
dev_priv->rpsvariables 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)
Signed-off-by Deepak S <[email protected]>Signed-off-by Daniel Vetter <[email protected]>---
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@@ -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@@ -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
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_AVGsupport (Ville)v3: Mass rename of the
dev_priv->rpsvariables 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)
Signed-off-by Deepak S <[email protected]>Signed-off-by Daniel Vetter <[email protected]>---
Reviewed-by Mika Kuoppala <[email protected]>
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@@ -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@@ -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
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
@@ -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
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
@@ -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
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
@@ -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
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]>
Signed-off-by Deepak S <[email protected]>[vsyrjala: Fix merge fubmle where the code ended up in
g4x_disable_trickle_feed()instead ofcherryview_init_clock_gating()]Signed-off-by Ville Syrjälä <[email protected]>Acked-by Ben Widawsky <[email protected]>--- drivers/gpu/drm/i915/intel_pm.c | 11 +++++++++++ 1 file changed, 11 insertions(+)drivers/gpu/drm/i915/intel_pm.c +0
-0
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
-0val =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
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]>
Signed-off-by Deepak S <[email protected]>[vsyrjala: Fix merge fubmle where the code ended up in
g4x_disable_trickle_feed()instead ofcherryview_init_clock_gating()]Signed-off-by Ville Syrjälä <[email protected]>Acked-by Ben Widawsky <[email protected]>--- drivers/gpu/drm/i915/intel_pm.c | 11 +++++++++++ 1 file changed, 11 insertions(+)drivers/gpu/drm/i915/intel_pm.c +0
-0@@ -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
-0val =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
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]>
Signed-off-by Deepak S <[email protected]>[vsyrjala: Fix merge fubmle where the code ended up in
g4x_disable_trickle_feed()instead ofcherryview_init_clock_gating()]Signed-off-by Ville Syrjälä <[email protected]>Acked-by Ben Widawsky <[email protected]>--- drivers/gpu/drm/i915/intel_pm.c | 11 +++++++++++ 1 file changed, 11 insertions(+)drivers/gpu/drm/i915/intel_pm.c +0
-0@@ -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
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]>
Signed-off-by Deepak S <[email protected]>[vsyrjala: Fix merge fubmle where the code ended up in
g4x_disable_trickle_feed()instead ofcherryview_init_clock_gating()]Signed-off-by Ville Syrjälä <[email protected]>Acked-by Ben Widawsky <[email protected]>--- drivers/gpu/drm/i915/intel_pm.c | 11 +++++++++++ 1 file changed, 11 insertions(+)drivers/gpu/drm/i915/intel_pm.c +0
-0@@ -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
f6d519481b662d9fc52836e6e6107520f03e0122Author: Deepak S <[email protected]> Date: Thu Apr 3 21:01:28 2014 +0530Revert "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.
Re: [PATCH 6/7] drm/i915/chv: Added CHV specific DDR fetch into init_clock_gating
In reply to Daniel VetterQuoted 22 lines · Daniel Vetter
Quoted 21 lines · Mika Kuoppala
Quoted 19 lines · [email protected] writes:
From: Deepak S <[email protected]>
Signed-off-by Deepak S <[email protected]>[vsyrjala: Fix merge fubmle where the code ended up in
g4x_disable_trickle_feed()instead ofcherryview_init_clock_gating()]Signed-off-by Ville Syrjälä <[email protected]>Acked-by Ben Widawsky <[email protected]>--- drivers/gpu/drm/i915/intel_pm.c | 11 +++++++++++ 1 file changed, 11 insertions(+)drivers/gpu/drm/i915/intel_pm.c +0
-0@@ -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
-0val =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
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
@@ -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