diff options
author | Imre Deak <imre.deak@intel.com> | 2018-01-30 09:29:39 -0500 |
---|---|---|
committer | Imre Deak <imre.deak@intel.com> | 2018-02-01 14:13:21 -0500 |
commit | 006bb4ccac3901d790b56ed4729cd4080a77a895 (patch) | |
tree | f385d96a4b83498b863e96f8b7bb03072d537a7b | |
parent | e76019a81921e87a4d9e7b3d86102bc708a6c227 (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.h | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_cdclk.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_pm.c | 6 |
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 | ||
3730 | int sandybridge_pcode_read(struct drm_i915_private *dev_priv, u32 mbox, u32 *val); | 3730 | int sandybridge_pcode_read(struct drm_i915_private *dev_priv, u32 mbox, u32 *val); |
3731 | int sandybridge_pcode_write_timeout(struct drm_i915_private *dev_priv, u32 mbox, | 3731 | int 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 | ||
3736 | int skl_pcode_request(struct drm_i915_private *dev_priv, u32 mbox, u32 request, | 3737 | int 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 | ||
9217 | int sandybridge_pcode_write_timeout(struct drm_i915_private *dev_priv, | 9217 | int 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; |