2009-12-30 13:10:54

by David John

[permalink] [raw]
Subject: [PATCH] drm: Keep disabled outputs disabled after suspend / resume

With the current DRM code, an output that has been powered off
from userspace will automatically power back on when resuming
from suspend. This patch fixes this behaviour.

Tested only with the Intel i915 driver on an Intel GM45 Express
chipset.

Signed-off-by: David John <[email protected]>

diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c
index 4231d6d..9f685bb 100644
--- a/drivers/gpu/drm/drm_crtc_helper.c
+++ b/drivers/gpu/drm/drm_crtc_helper.c
@@ -216,7 +216,7 @@ bool drm_helper_crtc_in_use(struct drm_crtc *crtc)
EXPORT_SYMBOL(drm_helper_crtc_in_use);

/**
- * drm_disable_unused_functions - disable unused objects
+ * drm_helper_disable_unused_functions - disable unused objects
* @dev: DRM device
*
* LOCKING:
@@ -1162,6 +1162,9 @@ EXPORT_SYMBOL(drm_helper_mode_fill_fb_struct);
int drm_helper_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) {
@@ -1174,6 +1177,23 @@ int drm_helper_resume_force_mode(struct drm_device *dev)

if (ret == false)
DRM_ERROR("failed to set mode on crtc %p\n", crtc);
+
+ /* Turn off outputs that were already powered off */
+ if (drm_helper_choose_crtc_dpms(crtc)) {
+ list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
+
+ if(encoder->crtc != crtc)
+ continue;
+
+ encoder_funcs = encoder->helper_private;
+ if (encoder_funcs->dpms)
+ (*encoder_funcs->dpms) (encoder, DRM_MODE_DPMS_OFF);
+
+ crtc_funcs = crtc->helper_private;
+ if (crtc_funcs->dpms)
+ (*crtc_funcs->dpms) (crtc, DRM_MODE_DPMS_OFF);
+ }
+ }
}
/* disable the unused connectors while restoring the modesetting */
drm_helper_disable_unused_functions(dev);


2009-12-31 04:12:59

by David John

[permalink] [raw]
Subject: Re: [PATCH] drm: Keep disabled outputs disabled after suspend / resume

On 12/30/2009 06:40 PM, David John wrote:
> With the current DRM code, an output that has been powered off
> from userspace will automatically power back on when resuming
> from suspend. This patch fixes this behaviour.
>
> Tested only with the Intel i915 driver on an Intel GM45 Express
> chipset.
>
> Signed-off-by: David John <[email protected]>

Sorry, this patch is a bit incorrect. I'll send an updated one soon.

Regards,
David.

2009-12-31 06:31:12

by David John

[permalink] [raw]
Subject: [PATCH v2] drm: Keep disabled outputs disabled after suspend / resume

With the current DRM code, an output that has been powered off
from userspace will automatically power back on when resuming
from suspend. This patch fixes this behaviour.

Tested only with the Intel i915 driver on an Intel GM45 Express
chipset.

Signed-off-by: David John <[email protected]>

diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c
index 4231d6d..aba79c4 100644
--- a/drivers/gpu/drm/drm_crtc_helper.c
+++ b/drivers/gpu/drm/drm_crtc_helper.c
@@ -216,7 +216,7 @@ bool drm_helper_crtc_in_use(struct drm_crtc *crtc)
EXPORT_SYMBOL(drm_helper_crtc_in_use);

/**
- * drm_disable_unused_functions - disable unused objects
+ * drm_helper_disable_unused_functions - disable unused objects
* @dev: DRM device
*
* LOCKING:
@@ -1162,6 +1162,9 @@ EXPORT_SYMBOL(drm_helper_mode_fill_fb_struct);
int drm_helper_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) {
@@ -1174,6 +1177,25 @@ int drm_helper_resume_force_mode(struct drm_device *dev)

if (ret == false)
DRM_ERROR("failed to set mode on crtc %p\n", crtc);
+
+ /* Turn off outputs that were already powered off */
+ if (drm_helper_choose_crtc_dpms(crtc)) {
+ list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
+
+ if(encoder->crtc != crtc)
+ continue;
+
+ encoder_funcs = encoder->helper_private;
+ if (encoder_funcs->dpms)
+ (*encoder_funcs->dpms) (encoder,
+ drm_helper_choose_encoder_dpms(encoder));
+
+ crtc_funcs = crtc->helper_private;
+ if (crtc_funcs->dpms)
+ (*crtc_funcs->dpms) (crtc,
+ drm_helper_choose_crtc_dpms(crtc));
+ }
+ }
}
/* disable the unused connectors while restoring the modesetting */
drm_helper_disable_unused_functions(dev);

2010-01-07 07:54:10

by David John

[permalink] [raw]
Subject: Re: [PATCH v2] drm: Keep disabled outputs disabled after suspend / resume

On 12/31/2009 12:00 PM, David John wrote:
> With the current DRM code, an output that has been powered off
> from userspace will automatically power back on when resuming
> from suspend. This patch fixes this behaviour.
>
> Tested only with the Intel i915 driver on an Intel GM45 Express
> chipset.
>
> Signed-off-by: David John <[email protected]>

Ping.

Any update on this? Correct? Incorrect? Utter rubbish that I should be
ashamed of myself?

Regards,
David.

2010-01-07 16:35:11

by Jesse Barnes

[permalink] [raw]
Subject: Re: [PATCH v2] drm: Keep disabled outputs disabled after suspend / resume

On Thu, 07 Jan 2010 13:24:06 +0530
David John <[email protected]> wrote:

> On 12/31/2009 12:00 PM, David John wrote:
> > With the current DRM code, an output that has been powered off
> > from userspace will automatically power back on when resuming
> > from suspend. This patch fixes this behaviour.
> >
> > Tested only with the Intel i915 driver on an Intel GM45 Express
> > chipset.
> >
> > Signed-off-by: David John <[email protected]>
>
> Ping.
>
> Any update on this? Correct? Incorrect? Utter rubbish that I should be
> ashamed of myself?

Yeah, sorry David, looks good to me.

Reviewed-by: Jesse Barnes <[email protected]>

--
Jesse Barnes, Intel Open Source Technology Center