[Nouveau] [PATCH] drm/nouveau/fb: fix suspend/resume fbcon

Emil Velikov emil.l.velikov at gmail.com
Thu Oct 3 15:50:55 PDT 2013


On 03/10/13 15:41, Christoph Rudorff wrote:
> On resume of a hibernated notebook, I get garbled virtual consoles.
> 
> fb_set_suspend(*dev, state == 0 means dev is running ...)
> 
> This patch fixes that issue for me:
> 
Ouch, nice catch Christoph :)

Seems like the following commit flipped the logic unintentionally, thus
causing the issue. Stange enough I have no problems with s2d although I
must admit it's not the most common thing I do.

commit cf41d53bf5b95d77673b185cc3b20ae3257f79e2
Author: Ben Skeggs <bskeggs at redhat.com>
Date:   Wed Nov 9 14:31:16 2011 +1000

    drm/nouveau: re-jig fbcon suspend/resume process a little

    Signed-off-by: Ben Skeggs <bskeggs at redhat.com>

> hibernate:
> kernel: nouveau  [     DRM] suspending fbcon...
> kernel: nouveau  [     DRM] suspending display...
> kernel: nouveau  [     DRM] unpinning framebuffer(s)...
> kernel: nouveau  [     DRM] evicting buffers...
> kernel: nouveau  [     DRM] waiting for kernel channels to go idle...
> kernel: nouveau  [     DRM] suspending client object trees...
> kernel: nouveau  [     DRM] suspending kernel object tree...
> resume:
> kernel: nouveau  [     DRM] re-enabling device...
> kernel: nouveau  [     DRM] resuming kernel object tree...
> kernel: nouveau  [   VBIOS][0000:01:00.0] running init tables
> kernel: nouveau  [     DRM] resuming client object trees...
> kernel: nouveau  [     DRM] resuming display...
> kernel: nouveau E[     PFB][0000:01:00.0] trapped write at 0x00007fe000 on channel 0x0000fee0 [unknown] BAR/PFIFO_WRITE/FB reason: PAGE_NOT_PRESENT
> kernel: nouveau E[     PFB][0000:01:00.0] trapped write at 0x00007fe000 on channel 0x0000fee0 [unknown] BAR/PFIFO_WRITE/FB reason: PAGE_NOT_PRESENT
> kernel: nouveau E[     PFB][0000:01:00.0] trapped write at 0x00007fe240 on channel 0x0000fee0 [unknown] BAR/PFIFO_WRITE/FB reason: PAGE_NOT_PRESENT
> kernel: nouveau E[     PFB][0000:01:00.0] trapped write at 0x00007fe400 on channel 0x0000fee0 [unknown] BAR/PFIFO_WRITE/FB reason: PAGE_NOT_PRESENT
> 
> https://bugs.freedesktop.org/buglist.cgi?query_format=specific&order=relevance+desc&bug_status=__open__&product=&content=PAGE_NOT_PRESENT
> 
> https://bugs.freedesktop.org/show_bug.cgi?id=58556
> https://bugs.freedesktop.org/show_bug.cgi?id=62835
> https://bugs.freedesktop.org/show_bug.cgi?id=68037
> https://bugs.freedesktop.org/show_bug.cgi?id=69029
> https://bugs.freedesktop.org/show_bug.cgi?id=69928
> ---
>  drivers/gpu/drm/nouveau/nouveau_drm.c   |    2 +-
>  drivers/gpu/drm/nouveau/nouveau_fbcon.c |    4 ++--
>  2 files changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/gpu/drm/nouveau/nouveau_drm.c b/drivers/gpu/drm/nouveau/nouveau_drm.c
> index 383f4e6..6148758 100644
> --- a/drivers/gpu/drm/nouveau/nouveau_drm.c
> +++ b/drivers/gpu/drm/nouveau/nouveau_drm.c
> @@ -544,7 +544,7 @@ nouveau_do_resume(struct drm_device *dev)
>  	nouveau_pm_resume(dev);
>  
>  	if (dev->mode_config.num_crtc) {
> -		NV_INFO(drm, "resuming display...\n");
> +		NV_INFO(drm, "resuming display and fbcon...\n");
>  		nouveau_display_resume(dev);
>  	}
>  	return 0;
> diff --git a/drivers/gpu/drm/nouveau/nouveau_fbcon.c b/drivers/gpu/drm/nouveau/nouveau_fbcon.c
> index b035317..46e37c0 100644
> --- a/drivers/gpu/drm/nouveau/nouveau_fbcon.c
> +++ b/drivers/gpu/drm/nouveau/nouveau_fbcon.c
> @@ -514,10 +514,10 @@ void nouveau_fbcon_set_suspend(struct drm_device *dev, int state)
>  	struct nouveau_drm *drm = nouveau_drm(dev);
>  	console_lock();
>  	if (state == 0)
> -		nouveau_fbcon_save_disable_accel(dev);
> +		nouveau_fbcon_restore_accel(dev);
>  	fb_set_suspend(drm->fbcon->helper.fbdev, state);
>  	if (state == 1)
> -		nouveau_fbcon_restore_accel(dev);
> +		nouveau_fbcon_save_disable_accel(dev);
>  	console_unlock();
>  }
I'm not entirely sure this is correct. One needs to save and disable
accleration before suspending the fb. Please try the following

-	if (state == 0)
+	if (state == 1)
		nouveau_fbcon_save_disable_accel(dev);
	fb_set_suspend(drm->fbcon->helper.fbdev, state);
-	if (state == 1)
+	if (state == 0)
		nouveau_fbcon_restore_accel(dev);
	console_unlock();

Cheers,
Emil


More information about the Nouveau mailing list