[PATCH 1/2] drm/i915: Split resume time display HW readout and modeset
Imre Deak
imre.deak at intel.com
Sat Sep 15 19:49:12 UTC 2018
Signed-off-by: Imre Deak <imre.deak at intel.com>
---
drivers/gpu/drm/i915/i915_drv.c | 1 +
drivers/gpu/drm/i915/i915_drv.h | 1 +
drivers/gpu/drm/i915/intel_display.c | 29 ++++++++++++++++++++++++++---
3 files changed, 28 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index 44e2c0f5ec50..643473d8d1d6 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -2070,6 +2070,7 @@ static int i915_drm_resume(struct drm_device *dev)
intel_dp_mst_resume(dev_priv);
+ intel_display_readout_hw_state(dev_priv);
intel_display_resume(dev);
drm_kms_helper_poll_enable(dev);
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 7d4daa7412f1..2a69d19b4135 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -3487,6 +3487,7 @@ extern int intel_connector_register(struct drm_connector *);
extern void intel_connector_unregister(struct drm_connector *);
extern int intel_modeset_vga_set_state(struct drm_i915_private *dev_priv,
bool state);
+extern void intel_display_readout_hw_state(struct drm_i915_private *dev_priv);
extern void intel_display_resume(struct drm_device *dev);
extern void i915_redisable_vga(struct drm_i915_private *dev_priv);
extern void i915_redisable_vga_power_on(struct drm_i915_private *dev_priv);
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index eb25037d7b38..366c1f112278 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -3724,9 +3724,6 @@ __intel_display_resume(struct drm_device *dev,
struct drm_crtc *crtc;
int i, ret;
- intel_modeset_setup_hw_state(dev, ctx);
- i915_redisable_vga(to_i915(dev));
-
if (!state)
return 0;
@@ -15929,6 +15926,32 @@ intel_modeset_setup_hw_state(struct drm_device *dev,
intel_fbc_init_pipe_state(dev_priv);
}
+void intel_display_readout_hw_state(struct drm_i915_private *dev_priv)
+{
+ struct drm_modeset_acquire_ctx ctx;
+ int ret;
+
+ drm_modeset_acquire_init(&ctx, 0);
+ while (1) {
+ ret = drm_modeset_lock_all_ctx(&dev_priv->drm, &ctx);
+ if (ret != -EDEADLK)
+ break;
+
+ drm_modeset_backoff(&ctx);
+ }
+
+ if (!ret) {
+ intel_modeset_setup_hw_state(&dev_priv->drm, &ctx);
+ i915_redisable_vga(dev_priv);
+ }
+
+ drm_modeset_drop_locks(&ctx);
+ drm_modeset_acquire_fini(&ctx);
+
+ if (ret)
+ DRM_ERROR("Reading out display HW state failed with %i\n", ret);
+}
+
void intel_display_resume(struct drm_device *dev)
{
struct drm_i915_private *dev_priv = to_i915(dev);
--
2.13.2
More information about the Intel-gfx-trybot
mailing list