aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_psr.c
diff options
context:
space:
mode:
authorSonika Jindal <sonika.jindal@intel.com>2015-04-02 01:32:44 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2015-04-07 04:06:38 -0400
commit474d1ec4a3d7775b071e60fdbe431cae37b84ff3 (patch)
tree4a53aca8d67a522d82e69086ba04d33cfc294587 /drivers/gpu/drm/i915/intel_psr.c
parent2d1070b21e004609a5bebafdb4303bb021f5477c (diff)
drm/i915/skl: Enabling PSR2 SU with frame sync
We make use of HW tracking for Selective update region and enable frame sync on sink. We use hardware's hardcoded data values for frame sync and GTC. v2: Add 3200x2000 resolution restriction with PSR2, move psr2_support to i915_psr struct, add aux_frame_sync to independently control aux frame sync, rename the TP2 TIME macro for 2500us (Rodrigo, Siva) v3: Moving the resolution restriction to intel_psr_enable so that we check it only once(Durga) Cc: Durgadoss R <durgadoss.r@intel.com> Cc: Rodrigo Vivi <rodrigo.vivi@intel.com> Signed-off-by: Sonika Jindal <sonika.jindal@intel.com> Reviewed-by: Durgadoss R <durgadoss.r@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_psr.c')
-rw-r--r--drivers/gpu/drm/i915/intel_psr.c38
1 files changed, 37 insertions, 1 deletions
diff --git a/drivers/gpu/drm/i915/intel_psr.c b/drivers/gpu/drm/i915/intel_psr.c
index 9668735fce52..27608ce19b1c 100644
--- a/drivers/gpu/drm/i915/intel_psr.c
+++ b/drivers/gpu/drm/i915/intel_psr.c
@@ -117,6 +117,19 @@ static void vlv_psr_setup_vsc(struct intel_dp *intel_dp)
117 I915_WRITE(VLV_VSCSDP(pipe), val); 117 I915_WRITE(VLV_VSCSDP(pipe), val);
118} 118}
119 119
120static void skl_psr_setup_su_vsc(struct intel_dp *intel_dp)
121{
122 struct edp_vsc_psr psr_vsc;
123
124 /* Prepare VSC Header for SU as per EDP 1.4 spec, Table 6.11 */
125 memset(&psr_vsc, 0, sizeof(psr_vsc));
126 psr_vsc.sdp_header.HB0 = 0;
127 psr_vsc.sdp_header.HB1 = 0x7;
128 psr_vsc.sdp_header.HB2 = 0x3;
129 psr_vsc.sdp_header.HB3 = 0xb;
130 intel_psr_write_vsc(intel_dp, &psr_vsc);
131}
132
120static void hsw_psr_setup_vsc(struct intel_dp *intel_dp) 133static void hsw_psr_setup_vsc(struct intel_dp *intel_dp)
121{ 134{
122 struct edp_vsc_psr psr_vsc; 135 struct edp_vsc_psr psr_vsc;
@@ -165,6 +178,12 @@ static void hsw_psr_enable_sink(struct intel_dp *intel_dp)
165 drm_dp_dpcd_writeb(&intel_dp->aux, DP_PSR_EN_CFG, 178 drm_dp_dpcd_writeb(&intel_dp->aux, DP_PSR_EN_CFG,
166 DP_PSR_ENABLE & ~DP_PSR_MAIN_LINK_ACTIVE); 179 DP_PSR_ENABLE & ~DP_PSR_MAIN_LINK_ACTIVE);
167 180
181 /* Enable AUX frame sync at sink */
182 if (dev_priv->psr.aux_frame_sync)
183 drm_dp_dpcd_writeb(&intel_dp->aux,
184 DP_SINK_DEVICE_AUX_FRAME_SYNC_CONF,
185 DP_AUX_FRAME_SYNC_ENABLE);
186
168 aux_data_reg = (INTEL_INFO(dev)->gen >= 9) ? 187 aux_data_reg = (INTEL_INFO(dev)->gen >= 9) ?
169 DPA_AUX_CH_DATA1 : EDP_PSR_AUX_DATA1(dev); 188 DPA_AUX_CH_DATA1 : EDP_PSR_AUX_DATA1(dev);
170 aux_ctl_reg = (INTEL_INFO(dev)->gen >= 9) ? 189 aux_ctl_reg = (INTEL_INFO(dev)->gen >= 9) ?
@@ -183,8 +202,10 @@ static void hsw_psr_enable_sink(struct intel_dp *intel_dp)
183 val |= DP_AUX_CH_CTL_TIME_OUT_1600us; 202 val |= DP_AUX_CH_CTL_TIME_OUT_1600us;
184 val &= ~DP_AUX_CH_CTL_MESSAGE_SIZE_MASK; 203 val &= ~DP_AUX_CH_CTL_MESSAGE_SIZE_MASK;
185 val |= (sizeof(aux_msg) << DP_AUX_CH_CTL_MESSAGE_SIZE_SHIFT); 204 val |= (sizeof(aux_msg) << DP_AUX_CH_CTL_MESSAGE_SIZE_SHIFT);
186 /* Use hardcoded data values for PSR */ 205 /* Use hardcoded data values for PSR, frame sync and GTC */
187 val &= ~DP_AUX_CH_CTL_PSR_DATA_AUX_REG_SKL; 206 val &= ~DP_AUX_CH_CTL_PSR_DATA_AUX_REG_SKL;
207 val &= ~DP_AUX_CH_CTL_FS_DATA_AUX_REG_SKL;
208 val &= ~DP_AUX_CH_CTL_GTC_DATA_AUX_REG_SKL;
188 I915_WRITE(aux_ctl_reg, val); 209 I915_WRITE(aux_ctl_reg, val);
189 } else { 210 } else {
190 I915_WRITE(aux_ctl_reg, 211 I915_WRITE(aux_ctl_reg,
@@ -232,6 +253,7 @@ static void hsw_psr_enable_source(struct intel_dp *intel_dp)
232 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); 253 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
233 struct drm_device *dev = dig_port->base.base.dev; 254 struct drm_device *dev = dig_port->base.base.dev;
234 struct drm_i915_private *dev_priv = dev->dev_private; 255 struct drm_i915_private *dev_priv = dev->dev_private;
256
235 uint32_t max_sleep_time = 0x1f; 257 uint32_t max_sleep_time = 0x1f;
236 /* Lately it was identified that depending on panel idle frame count 258 /* Lately it was identified that depending on panel idle frame count
237 * calculated at HW can be off by 1. So let's use what came 259 * calculated at HW can be off by 1. So let's use what came
@@ -255,6 +277,10 @@ static void hsw_psr_enable_source(struct intel_dp *intel_dp)
255 max_sleep_time << EDP_PSR_MAX_SLEEP_TIME_SHIFT | 277 max_sleep_time << EDP_PSR_MAX_SLEEP_TIME_SHIFT |
256 idle_frames << EDP_PSR_IDLE_FRAME_SHIFT | 278 idle_frames << EDP_PSR_IDLE_FRAME_SHIFT |
257 EDP_PSR_ENABLE); 279 EDP_PSR_ENABLE);
280
281 if (dev_priv->psr.psr2_support)
282 I915_WRITE(EDP_PSR2_CTL, EDP_PSR2_ENABLE |
283 EDP_SU_TRACK_ENABLE | EDP_PSR2_TP2_TIME_100);
258} 284}
259 285
260static bool intel_psr_match_conditions(struct intel_dp *intel_dp) 286static bool intel_psr_match_conditions(struct intel_dp *intel_dp)
@@ -332,6 +358,7 @@ void intel_psr_enable(struct intel_dp *intel_dp)
332 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); 358 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
333 struct drm_device *dev = intel_dig_port->base.base.dev; 359 struct drm_device *dev = intel_dig_port->base.base.dev;
334 struct drm_i915_private *dev_priv = dev->dev_private; 360 struct drm_i915_private *dev_priv = dev->dev_private;
361 struct intel_crtc *crtc = to_intel_crtc(intel_dig_port->base.base.crtc);
335 362
336 if (!HAS_PSR(dev)) { 363 if (!HAS_PSR(dev)) {
337 DRM_DEBUG_KMS("PSR not supported on this platform\n"); 364 DRM_DEBUG_KMS("PSR not supported on this platform\n");
@@ -364,6 +391,15 @@ void intel_psr_enable(struct intel_dp *intel_dp)
364 if (HAS_DDI(dev)) { 391 if (HAS_DDI(dev)) {
365 hsw_psr_setup_vsc(intel_dp); 392 hsw_psr_setup_vsc(intel_dp);
366 393
394 if (dev_priv->psr.psr2_support) {
395 /* PSR2 is restricted to work with panel resolutions upto 3200x2000 */
396 if (crtc->config->pipe_src_w > 3200 ||
397 crtc->config->pipe_src_h > 2000)
398 dev_priv->psr.psr2_support = false;
399 else
400 skl_psr_setup_su_vsc(intel_dp);
401 }
402
367 /* Avoid continuous PSR exit by masking memup and hpd */ 403 /* Avoid continuous PSR exit by masking memup and hpd */
368 I915_WRITE(EDP_PSR_DEBUG_CTL(dev), EDP_PSR_DEBUG_MASK_MEMUP | 404 I915_WRITE(EDP_PSR_DEBUG_CTL(dev), EDP_PSR_DEBUG_MASK_MEMUP |
369 EDP_PSR_DEBUG_MASK_HPD | EDP_PSR_DEBUG_MASK_LPSP); 405 EDP_PSR_DEBUG_MASK_HPD | EDP_PSR_DEBUG_MASK_LPSP);