From: Jesse Barnes <jbarnes@virtuousgeek.org> To: linux-kernel@vger.kernel.org Cc: intel-gfx@lists.freedesktop.org, linux-pm@vger.kernel.org, rjw@sisk.pl Subject: [PATCH 3/3] drm/i915: support resume without VT switch v2 Date: Mon, 4 Feb 2013 13:37:22 +0000 [thread overview] Message-ID: <1359985042-2610-3-git-send-email-jbarnes@virtuousgeek.org> (raw) In-Reply-To: <1359985042-2610-1-git-send-email-jbarnes@virtuousgeek.org> Add support for resuming the suspend configuration at resume time to avoid slow and ugly VT switches during suspend and resume. Also emit a hotplug event at resume time to make sure any potential configuration changes (monitors coming and going, dock events) are handled properly. v2: use new fb flag to indicate we don't need to VT switch Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org> --- drivers/gpu/drm/i915/i915_drv.c | 28 +++++++++++++++++++++++++--- drivers/gpu/drm/i915/i915_drv.h | 1 + drivers/gpu/drm/i915/intel_display.c | 25 +++++++++++++++++++++++++ drivers/gpu/drm/i915/intel_fb.c | 3 +++ 4 files changed, 54 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index 1172658..7dbaa01 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c @@ -483,8 +483,6 @@ static int i915_drm_freeze(struct drm_device *dev) cancel_delayed_work_sync(&dev_priv->rps.delayed_resume_work); - intel_modeset_disable(dev); - drm_irq_uninstall(dev); } @@ -544,6 +542,24 @@ void intel_console_resume(struct work_struct *work) console_unlock(); } +static void intel_resume_hotplug(struct drm_device *dev) +{ + struct drm_mode_config *mode_config = &dev->mode_config; + struct intel_encoder *encoder; + + mutex_lock(&mode_config->mutex); + DRM_DEBUG_KMS("running encoder hotplug functions\n"); + + list_for_each_entry(encoder, &mode_config->encoder_list, base.head) + if (encoder->hot_plug) + encoder->hot_plug(encoder); + + mutex_unlock(&mode_config->mutex); + + /* Just fire off a uevent and let userspace tell us what to do */ + drm_helper_hpd_irq_event(dev); +} + static int __i915_drm_thaw(struct drm_device *dev) { struct drm_i915_private *dev_priv = dev->dev_private; @@ -563,8 +579,14 @@ static int __i915_drm_thaw(struct drm_device *dev) mutex_unlock(&dev->struct_mutex); intel_modeset_init_hw(dev); - intel_modeset_setup_hw_state(dev, false); drm_irq_install(dev); + + /* Resume the modeset for every activated CRTC */ + mutex_lock(&dev->mode_config.mutex); + intel_resume_force_mode(dev); + mutex_unlock(&dev->mode_config.mutex); + + intel_resume_hotplug(dev); } intel_opregion_init(dev); diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 12ab3bd..c8b1896 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -1680,6 +1680,7 @@ extern void gen6_set_rps(struct drm_device *dev, u8 val); extern void intel_detect_pch(struct drm_device *dev); extern int intel_trans_dp_port_sel(struct drm_crtc *crtc); extern int intel_enable_rc6(const struct drm_device *dev); +extern int intel_resume_force_mode(struct drm_device *dev); extern bool i915_semaphore_is_enabled(struct drm_device *dev); int i915_reg_read_ioctl(struct drm_device *dev, void *data, diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index da1ad9c..a127877 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c @@ -9369,6 +9369,31 @@ void intel_modeset_cleanup(struct drm_device *dev) drm_mode_config_cleanup(dev); } +int intel_resume_force_mode(struct drm_device *dev) +{ + struct drm_crtc *crtc; + struct drm_encoder *encoder; + struct drm_encoder_helper_funcs *encoder_funcs; + struct drm_crtc_helper_funcs *crtc_funcs; + int ret; + + list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { + + if (!crtc->enabled) { + DRM_ERROR("skipping disabled crtc\n"); + continue; + } + + ret = intel_set_mode(crtc, &crtc->mode, crtc->x, crtc->y, + crtc->fb); + + if (ret == false) + DRM_ERROR("failed to set mode on crtc %p\n", crtc); + } + + return 0; +} + /* * Return which encoder is currently attached for connector. */ diff --git a/drivers/gpu/drm/i915/intel_fb.c b/drivers/gpu/drm/i915/intel_fb.c index 7b30b5c..d4955b5 100644 --- a/drivers/gpu/drm/i915/intel_fb.c +++ b/drivers/gpu/drm/i915/intel_fb.c @@ -148,6 +148,9 @@ static int intelfb_create(struct intel_fbdev *ifbdev, } info->screen_size = size; + /* This driver doesn't need a VT switch to restore the mode on resume */ + info->skip_vt_switch = true; + // memset(info->screen_base, 0, size); drm_fb_helper_fill_fix(info, fb->pitches[0], fb->depth); -- 1.7.9.5
WARNING: multiple messages have this Message-ID (diff)
From: Jesse Barnes <jbarnes@virtuousgeek.org> To: linux-kernel@vger.kernel.org Cc: rjw@sisk.pl, intel-gfx@lists.freedesktop.org, linux-pm@vger.kernel.org Subject: [PATCH 3/3] drm/i915: support resume without VT switch v2 Date: Mon, 4 Feb 2013 13:37:22 +0000 [thread overview] Message-ID: <1359985042-2610-3-git-send-email-jbarnes@virtuousgeek.org> (raw) In-Reply-To: <1359985042-2610-1-git-send-email-jbarnes@virtuousgeek.org> Add support for resuming the suspend configuration at resume time to avoid slow and ugly VT switches during suspend and resume. Also emit a hotplug event at resume time to make sure any potential configuration changes (monitors coming and going, dock events) are handled properly. v2: use new fb flag to indicate we don't need to VT switch Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org> --- drivers/gpu/drm/i915/i915_drv.c | 28 +++++++++++++++++++++++++--- drivers/gpu/drm/i915/i915_drv.h | 1 + drivers/gpu/drm/i915/intel_display.c | 25 +++++++++++++++++++++++++ drivers/gpu/drm/i915/intel_fb.c | 3 +++ 4 files changed, 54 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index 1172658..7dbaa01 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c @@ -483,8 +483,6 @@ static int i915_drm_freeze(struct drm_device *dev) cancel_delayed_work_sync(&dev_priv->rps.delayed_resume_work); - intel_modeset_disable(dev); - drm_irq_uninstall(dev); } @@ -544,6 +542,24 @@ void intel_console_resume(struct work_struct *work) console_unlock(); } +static void intel_resume_hotplug(struct drm_device *dev) +{ + struct drm_mode_config *mode_config = &dev->mode_config; + struct intel_encoder *encoder; + + mutex_lock(&mode_config->mutex); + DRM_DEBUG_KMS("running encoder hotplug functions\n"); + + list_for_each_entry(encoder, &mode_config->encoder_list, base.head) + if (encoder->hot_plug) + encoder->hot_plug(encoder); + + mutex_unlock(&mode_config->mutex); + + /* Just fire off a uevent and let userspace tell us what to do */ + drm_helper_hpd_irq_event(dev); +} + static int __i915_drm_thaw(struct drm_device *dev) { struct drm_i915_private *dev_priv = dev->dev_private; @@ -563,8 +579,14 @@ static int __i915_drm_thaw(struct drm_device *dev) mutex_unlock(&dev->struct_mutex); intel_modeset_init_hw(dev); - intel_modeset_setup_hw_state(dev, false); drm_irq_install(dev); + + /* Resume the modeset for every activated CRTC */ + mutex_lock(&dev->mode_config.mutex); + intel_resume_force_mode(dev); + mutex_unlock(&dev->mode_config.mutex); + + intel_resume_hotplug(dev); } intel_opregion_init(dev); diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 12ab3bd..c8b1896 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -1680,6 +1680,7 @@ extern void gen6_set_rps(struct drm_device *dev, u8 val); extern void intel_detect_pch(struct drm_device *dev); extern int intel_trans_dp_port_sel(struct drm_crtc *crtc); extern int intel_enable_rc6(const struct drm_device *dev); +extern int intel_resume_force_mode(struct drm_device *dev); extern bool i915_semaphore_is_enabled(struct drm_device *dev); int i915_reg_read_ioctl(struct drm_device *dev, void *data, diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index da1ad9c..a127877 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c @@ -9369,6 +9369,31 @@ void intel_modeset_cleanup(struct drm_device *dev) drm_mode_config_cleanup(dev); } +int intel_resume_force_mode(struct drm_device *dev) +{ + struct drm_crtc *crtc; + struct drm_encoder *encoder; + struct drm_encoder_helper_funcs *encoder_funcs; + struct drm_crtc_helper_funcs *crtc_funcs; + int ret; + + list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { + + if (!crtc->enabled) { + DRM_ERROR("skipping disabled crtc\n"); + continue; + } + + ret = intel_set_mode(crtc, &crtc->mode, crtc->x, crtc->y, + crtc->fb); + + if (ret == false) + DRM_ERROR("failed to set mode on crtc %p\n", crtc); + } + + return 0; +} + /* * Return which encoder is currently attached for connector. */ diff --git a/drivers/gpu/drm/i915/intel_fb.c b/drivers/gpu/drm/i915/intel_fb.c index 7b30b5c..d4955b5 100644 --- a/drivers/gpu/drm/i915/intel_fb.c +++ b/drivers/gpu/drm/i915/intel_fb.c @@ -148,6 +148,9 @@ static int intelfb_create(struct intel_fbdev *ifbdev, } info->screen_size = size; + /* This driver doesn't need a VT switch to restore the mode on resume */ + info->skip_vt_switch = true; + // memset(info->screen_base, 0, size); drm_fb_helper_fill_fix(info, fb->pitches[0], fb->depth); -- 1.7.9.5
next prev parent reply other threads:[~2013-02-04 13:37 UTC|newest] Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top 2013-02-04 13:37 [PATCH 1/3] PM: make VT switching to the suspend console optional v3 Jesse Barnes 2013-02-04 13:37 ` [PATCH 2/3] fb: add support for drivers not needing VT switch at suspend/resume time Jesse Barnes 2013-02-04 13:37 ` Jesse Barnes 2013-02-04 13:37 ` Jesse Barnes [this message] 2013-02-04 13:37 ` [PATCH 3/3] drm/i915: support resume without VT switch v2 Jesse Barnes 2013-02-06 9:20 ` [Intel-gfx] " Daniel Vetter 2013-02-04 20:26 ` [PATCH 1/3] PM: make VT switching to the suspend console optional v3 Rafael J. Wysocki 2013-02-05 13:55 ` Jesse Barnes 2013-02-05 22:02 ` Rafael J. Wysocki 2013-02-06 9:21 ` [Intel-gfx] " Daniel Vetter 2013-02-05 22:01 ` Rafael J. Wysocki
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1359985042-2610-3-git-send-email-jbarnes@virtuousgeek.org \ --to=jbarnes@virtuousgeek.org \ --cc=intel-gfx@lists.freedesktop.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-pm@vger.kernel.org \ --cc=rjw@sisk.pl \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.