drm/i915/vlv: WA for Turbo and RC6 to work together.
Subsystems (2)
PATCH v6 1/1 drm/i915/vlv: WA for Turbo and RC6 to work together.
From: Deepak S <[email protected]>
With RC6 enabled, BYT has an HW issue in determining the right Gfx busyness.
WA for Turbo + RC6: Use SW based Gfx busy-ness detection to decide on increasing/decreasing the freq. This logic will monitor C0 counters of render/media power-wells over EI period and takes necessary action based on these values
v2: Refactor duplicate code. (Ville)
v3: Reformat the comments. (Ville)
v4: Enable required counters and remove unwanted code (Ville)
v5: Added frequency change acceleration support and remove kernel-doc style comments. (Ville)
v6: Updated comment section and Fix w/a comment. (Ville)
Signed-off-by Deepak S <[email protected]>
Reviewed-by Ville Syrjälä <[email protected]>
--- drivers/gpu/drm/i915/i915_drv.h | 15 +++++ drivers/gpu/drm/i915/i915_irq.c | 133 +++++++++++++++++++++++++++++++++++++++- drivers/gpu/drm/i915/i915_reg.h | 11 ++++ drivers/gpu/drm/i915/intel_pm.c | 12 +++- 4 files changed, 167 insertions(+), 4 deletions(-)
drivers/gpu/drm/i915/i915_drv.h +15 -0
@@ -819,6 +819,12 @@ struct i915_suspend_saved_registers {u32 savePCH_PORT_HOTPLUG; }; +struct intel_rps_ei_calc { +u32 cz_ts_ei; +u32 render_ei_c0; +u32 media_ei_c0; +}; +struct intel_gen6_power_mgmt {/* work and pm_iir are protected by dev_priv->irq_lock */ struct work_struct work;
@@ -843,6 +849,8 @@ struct intel_gen6_power_mgmt {u8 rp1_freq;/* "less than" RP0 power/freqency */ u8 rp0_freq;/* Non-overclocked max frequency. */ +u32 ei_interrupt_count; +int last_adj;enum {LOW_POWER ,BETWEEN ,HIGH_POWER } power;
@@ -1414,6 +1422,13 @@ struct drm_i915_private {/* gen6+ rps state */ struct intel_gen6_power_mgmt rps; +/* rps wa up ei calculation */ +struct intel_rps_ei_calc rps_up_ei; + +/* rps wa down ei calculation */ +struct intel_rps_ei_calc rps_down_ei; + +/* ilk-only ips/rps state. Everything in here is protected by the global * mchdev_lock in intel_pm.c */ struct intel_ilk_power_mgmt ips;
drivers/gpu/drm/i915/i915_irq.c +132 -1
151 lines not on this page · raw message
drivers/gpu/drm/i915/i915_reg.h +11 -0
@@ -516,6 +516,7 @@ enum punit_power_well {#define PUNIT_REG_GPU_FREQ_STS 0xd8#define GENFREQSTATUS (1<<0)#define PUNIT_REG_MEDIA_TURBO_FREQ_REQ 0xdc +#define PUNIT_REG_CZ_TIMESTAMP 0xce#define PUNIT_FUSE_BUS2 0xf6/* bits 47:40 */ #define PUNIT_FUSE_BUS1 0xf5/* bits 55:48 */
@@ -531,6 +532,11 @@ enum punit_power_well {#define FB_FMAX_VMIN_FREQ_LO_SHIFT 27#define FB_FMAX_VMIN_FREQ_LO_MASK 0xf8000000 +#define VLV_CZ_CLOCK_TO_MILLI_SEC 100000 +#define VLV_RP_UP_EI_THRESHOLD 90 +#define VLV_RP_DOWN_EI_THRESHOLD 70 +#define VLV_INT_COUNT_FOR_DOWN_EI 5 +/* vlv2 north clock has */ #define CCK_FUSE_REG 0x8#define CCK_FUSE_HPLL_FREQ_MASK 0x3
@@ -5006,6 +5012,7 @@ enum punit_power_well {#define VLV_GTLC_ALLOWWAKEERR (1 << 1)#define VLV_GTLC_PW_MEDIA_STATUS_MASK (1 << 5)#define VLV_GTLC_PW_RENDER_STATUS_MASK (1 << 7) +#define VLV_GTLC_SURVIVABILITY_REG 0x130098#define FORCEWAKE_MT 0xa188/* multi-threaded */ #define FORCEWAKE_KERNEL 0x1#define FORCEWAKE_USER 0x2
@@ -5134,6 +5141,8 @@ enum punit_power_well {#define GEN6_GT_GFX_RC6_LOCKED 0x138104#define VLV_COUNTER_CONTROL 0x138104#define VLV_COUNT_RANGE_HIGH (1<<15) +#define VLV_MEDIA_RC0_COUNT_EN (1<<5) +#define VLV_RENDER_RC0_COUNT_EN (1<<4)#define VLV_MEDIA_RC6_COUNT_EN (1<<1)#define VLV_RENDER_RC6_COUNT_EN (1<<0)#define GEN6_GT_GFX_RC6 0x138108
@@ -5142,6 +5151,8 @@ enum punit_power_well {#define GEN6_GT_GFX_RC6p 0x13810C#define GEN6_GT_GFX_RC6pp 0x138110 +#define VLV_RENDER_C0_COUNT_REG 0x138118 +#define VLV_MEDIA_C0_COUNT_REG 0x13811C#define GEN6_PCODE_MAILBOX 0x138124#define GEN6_PCODE_READY (1<<31)
drivers/gpu/drm/i915/intel_pm.c +9 -3
@@ -3142,8 +3142,11 @@ static void vlv_set_rps_idle(struct drm_i915_private *dev_priv)vlv_force_gfx_clock (dev_priv, false); -I915_WRITE (GEN6_PMINTRMSK , -gen6_rps_pm_mask (dev_priv, dev_priv->rps.cur_freq)); +if (dev_priv->pm_rps_events &GEN6_PM_RP_UP_EI_EXPIRED ) +I915_WRITE (GEN6_PMINTRMSK , ~dev_priv->pm_rps_events); +else +I915_WRITE (GEN6_PMINTRMSK , +gen6_rps_pm_mask (dev_priv, dev_priv->rps.cur_freq)); }void gen6_rps_idle (struct drm_i915_private *dev_priv)
@@ -3754,6 +3757,7 @@ static void valleyview_enable_rps(struct drm_device *dev)I915_WRITE (GEN6_RP_DOWN_EI ,350000 );I915_WRITE (GEN6_RP_IDLE_HYSTERSIS ,10 ); +I915_WRITE (GEN6_RP_DOWN_TIMEOUT ,0xf4240 ); I915_WRITE(GEN6_RP_CONTROL, GEN6_RP_MEDIA_TURBO |
@@ -3774,9 +3778,11 @@ static void valleyview_enable_rps(struct drm_device *dev)/* allows RC6 residency counter to work */ I915_WRITE (VLV_COUNTER_CONTROL , -_MASKED_BIT_ENABLE (VLV_COUNT_RANGE_HIGH | +_MASKED_BIT_ENABLE (VLV_MEDIA_RC0_COUNT_EN | +VLV_RENDER_RC0_COUNT_EN |VLV_MEDIA_RC6_COUNT_EN |VLV_RENDER_RC6_COUNT_EN )); +if (intel_enable_rc6 (dev) &INTEL_RC6_ENABLE ) rc6_mode =GEN7_RC_CTL_TO_MODE |VLV_RC_CTL_CTX_RST_PARALLEL ;
Signature · 6 lines
1.8.5.2 _______________________________________________ Intel-gfx mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/intel-gfx