aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorImre Deak <imre.deak@intel.com>2018-01-30 09:29:39 -0500
committerImre Deak <imre.deak@intel.com>2018-02-01 14:13:21 -0500
commit006bb4ccac3901d790b56ed4729cd4080a77a895 (patch)
treef385d96a4b83498b863e96f8b7bb03072d537a7b
parente76019a81921e87a4d9e7b3d86102bc708a6c227 (diff)
drm/i915/bxt, glk: Avoid long atomic poll during CDCLK change
There is no requirement for doing the PCODE request polling atomically, so do that only for a short time switching to sleeping poll afterwards. The specification requires a 150usec timeout for the change notification, so let's use that for the atomic poll. Do the extra 2ms poll - needed as a workaround on BXT/GLK - in sleeping mode. v2: - rebase on v2 of patchset dropping the sandybridge_pcode_read/write refactoring (Chris) Cc: Chris Wilson <chris@chris-wilson.co.uk> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Imre Deak <imre.deak@intel.com> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> Link: https://patchwork.freedesktop.org/patch/msgid/20180130142939.17983-2-imre.deak@intel.com
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h5
-rw-r--r--drivers/gpu/drm/i915/intel_cdclk.c4
-rw-r--r--drivers/gpu/drm/i915/intel_pm.c6
3 files changed, 9 insertions, 6 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 8cd4d6f3a160..c67385ed0f66 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -3729,9 +3729,10 @@ extern void intel_display_print_error_state(struct drm_i915_error_state_buf *e,
3729 3729
3730int sandybridge_pcode_read(struct drm_i915_private *dev_priv, u32 mbox, u32 *val); 3730int sandybridge_pcode_read(struct drm_i915_private *dev_priv, u32 mbox, u32 *val);
3731int sandybridge_pcode_write_timeout(struct drm_i915_private *dev_priv, u32 mbox, 3731int sandybridge_pcode_write_timeout(struct drm_i915_private *dev_priv, u32 mbox,
3732 u32 val, int timeout_us); 3732 u32 val, int fast_timeout_us,
3733 int slow_timeout_ms);
3733#define sandybridge_pcode_write(dev_priv, mbox, val) \ 3734#define sandybridge_pcode_write(dev_priv, mbox, val) \
3734 sandybridge_pcode_write_timeout(dev_priv, mbox, val, 500) 3735 sandybridge_pcode_write_timeout(dev_priv, mbox, val, 500, 0)
3735 3736
3736int skl_pcode_request(struct drm_i915_private *dev_priv, u32 mbox, u32 request, 3737int skl_pcode_request(struct drm_i915_private *dev_priv, u32 mbox, u32 request,
3737 u32 reply_mask, u32 reply, int timeout_base_ms); 3738 u32 reply_mask, u32 reply, int timeout_base_ms);
diff --git a/drivers/gpu/drm/i915/intel_cdclk.c b/drivers/gpu/drm/i915/intel_cdclk.c
index a423b674fcec..ee788d5be5e3 100644
--- a/drivers/gpu/drm/i915/intel_cdclk.c
+++ b/drivers/gpu/drm/i915/intel_cdclk.c
@@ -1378,7 +1378,7 @@ static void bxt_set_cdclk(struct drm_i915_private *dev_priv,
1378 mutex_lock(&dev_priv->pcu_lock); 1378 mutex_lock(&dev_priv->pcu_lock);
1379 ret = sandybridge_pcode_write_timeout(dev_priv, 1379 ret = sandybridge_pcode_write_timeout(dev_priv,
1380 HSW_PCODE_DE_WRITE_FREQ_REQ, 1380 HSW_PCODE_DE_WRITE_FREQ_REQ,
1381 0x80000000, 2000); 1381 0x80000000, 150, 2);
1382 mutex_unlock(&dev_priv->pcu_lock); 1382 mutex_unlock(&dev_priv->pcu_lock);
1383 1383
1384 if (ret) { 1384 if (ret) {
@@ -1417,7 +1417,7 @@ static void bxt_set_cdclk(struct drm_i915_private *dev_priv,
1417 */ 1417 */
1418 ret = sandybridge_pcode_write_timeout(dev_priv, 1418 ret = sandybridge_pcode_write_timeout(dev_priv,
1419 HSW_PCODE_DE_WRITE_FREQ_REQ, 1419 HSW_PCODE_DE_WRITE_FREQ_REQ,
1420 cdclk_state->voltage_level, 2000); 1420 cdclk_state->voltage_level, 150, 2);
1421 mutex_unlock(&dev_priv->pcu_lock); 1421 mutex_unlock(&dev_priv->pcu_lock);
1422 1422
1423 if (ret) { 1423 if (ret) {
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 3cc2e6fdd98a..eb68abf6a8e9 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -9215,7 +9215,8 @@ int sandybridge_pcode_read(struct drm_i915_private *dev_priv, u32 mbox, u32 *val
9215} 9215}
9216 9216
9217int sandybridge_pcode_write_timeout(struct drm_i915_private *dev_priv, 9217int sandybridge_pcode_write_timeout(struct drm_i915_private *dev_priv,
9218 u32 mbox, u32 val, int timeout_us) 9218 u32 mbox, u32 val,
9219 int fast_timeout_us, int slow_timeout_ms)
9219{ 9220{
9220 int status; 9221 int status;
9221 9222
@@ -9238,7 +9239,8 @@ int sandybridge_pcode_write_timeout(struct drm_i915_private *dev_priv,
9238 9239
9239 if (__intel_wait_for_register_fw(dev_priv, 9240 if (__intel_wait_for_register_fw(dev_priv,
9240 GEN6_PCODE_MAILBOX, GEN6_PCODE_READY, 0, 9241 GEN6_PCODE_MAILBOX, GEN6_PCODE_READY, 0,
9241 timeout_us, 0, NULL)) { 9242 fast_timeout_us, slow_timeout_ms,
9243 NULL)) {
9242 DRM_ERROR("timeout waiting for pcode write of 0x%08x to mbox %x to finish for %ps\n", 9244 DRM_ERROR("timeout waiting for pcode write of 0x%08x to mbox %x to finish for %ps\n",
9243 val, mbox, __builtin_return_address(0)); 9245 val, mbox, __builtin_return_address(0));
9244 return -ETIMEDOUT; 9246 return -ETIMEDOUT;