[PATCH xserver] modesetting: Properly cleanup fb for reverse-prime-offload

Dave Airlie airlied at gmail.com
Tue Jun 14 05:03:25 UTC 2016


Reviewed-by: Dave Airlie <airlied at redhat.com>

On 2 June 2016 at 05:04, Hans de Goede <hdegoede at redhat.com> wrote:
> drmmode_set_scanout_pixmap_gpu(pix) adds drmmod->fb_id through a call
> to drmmode_xf86crtc_resize(), but on a subsequent
> drmmode_set_scanout_pixmap_gpu(NULL) it would not remove the fb.
>
> This keeps the crtc marked as busy, which causes the dgpu to not
> being able to runtime suspend, after an output attached to the dgpu
> has been used once. Which causes burning through an additional 10W
> of power and the laptop to run quite hot.
>
> This commit adds the missing remove fb call, allowing the dgpu to runtime
> suspend after an external monitor has been plugged into the laptop.
>
> Note this also makes drmmode_set_scanout_pixmap_gpu(NULL) match the
> behavior of drmmode_set_scanout_pixmap_cpu(NULL) which was already
> removing the fb.
>
> Signed-off-by: Hans de Goede <hdegoede at redhat.com>
> ---
>  hw/xfree86/drivers/modesetting/drmmode_display.c | 8 +++++++-
>  1 file changed, 7 insertions(+), 1 deletion(-)
>
> diff --git a/hw/xfree86/drivers/modesetting/drmmode_display.c b/hw/xfree86/drivers/modesetting/drmmode_display.c
> index 5b90369..4c55c4e 100644
> --- a/hw/xfree86/drivers/modesetting/drmmode_display.c
> +++ b/hw/xfree86/drivers/modesetting/drmmode_display.c
> @@ -643,11 +643,17 @@ drmmode_set_scanout_pixmap_gpu(xf86CrtcPtr crtc, PixmapPtr ppix)
>      PixmapPtr screenpix = screen->GetScreenPixmap(screen);
>      xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(crtc->scrn);
>      drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
> +    drmmode_ptr drmmode = drmmode_crtc->drmmode;
>      int c, total_width = 0, max_height = 0, this_x = 0;
>
>      if (!ppix) {
> -        if (crtc->randr_crtc->scanout_pixmap)
> +        if (crtc->randr_crtc->scanout_pixmap) {
>              PixmapStopDirtyTracking(crtc->randr_crtc->scanout_pixmap, screenpix);
> +            if (drmmode->fb_id) {
> +                drmModeRmFB(drmmode->fd, drmmode->fb_id);
> +                drmmode->fb_id = 0;
> +            }
> +        }
>          drmmode_crtc->prime_pixmap_x = 0;
>          return TRUE;
>      }
> --
> 2.7.4
>
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: https://lists.x.org/mailman/listinfo/xorg-devel


More information about the xorg-devel mailing list