Hans de Goede
2016-Jun-03 12:46 UTC
[Nouveau] [PATCH xf86-video-nouveau] Properly cleanup fb for reverse-prime-offload
drmmode_set_scanout_pixmap(pix) adds drmmod->fb_id through a call to drmmode_xf86crtc_resize(), but on a subsequent drmmode_set_scanout_pixmap(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. Signed-off-by: Hans de Goede <hdegoede at redhat.com> --- src/drmmode_display.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/drmmode_display.c b/src/drmmode_display.c index b950f42..f326e46 100644 --- a/src/drmmode_display.c +++ b/src/drmmode_display.c @@ -680,10 +680,16 @@ drmmode_set_scanout_pixmap(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 && drmmode->fb_id) { + drmModeRmFB(drmmode->fd, drmmode->fb_id); + drmmode->fb_id = 0; + } + } drmmode_crtc->scanout_pixmap_x = 0; return TRUE; } -- 2.7.4
Hans de Goede
2016-Jun-27 06:24 UTC
[Nouveau] [xf86-video-nouveau] Properly cleanup fb for reverse-prime-offload
Hi Ilia, Ben, et al. Can I please get a review of this patch, and assuming the review is favorable, can someone please push this ? Regards, Hans p.s. Is it ok if I request push rights to the nouveau repos / group at freedesktop.org ? On 03-06-16 14:46, Hans De Goede wrote:> drmmode_set_scanout_pixmap(pix) adds drmmod->fb_id through a call > to drmmode_xf86crtc_resize(), but on a subsequent > drmmode_set_scanout_pixmap(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. > > Signed-off-by: Hans de Goede <hdegoede at redhat.com> > --- > src/drmmode_display.c | 8 +++++++- > 1 file changed, 7 insertions(+), 1 deletion(-) > > diff --git a/src/drmmode_display.c b/src/drmmode_display.c > index b950f42..f326e46 100644 > --- a/src/drmmode_display.c > +++ b/src/drmmode_display.c > @@ -680,10 +680,16 @@ drmmode_set_scanout_pixmap(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 && drmmode->fb_id) { > + drmModeRmFB(drmmode->fd, drmmode->fb_id); > + drmmode->fb_id = 0; > + } > + } > drmmode_crtc->scanout_pixmap_x = 0; > return TRUE; > } >
Ben Skeggs
2016-Jun-27 22:43 UTC
[Nouveau] [xf86-video-nouveau] Properly cleanup fb for reverse-prime-offload
On 06/27/2016 04:24 PM, Hans de Goede wrote:> Hi Ilia, Ben, et al. > > Can I please get a review of this patch, and assuming the review is > favorable, > can someone please push this ? > > Regards, > > Hans > > > p.s. > > Is it ok if I request push rights to the nouveau repos / group > at freedesktop.org ?Hey Hans, Patch looks good to me, and I've pushed it. And yeah, go ahead and request that! Ben.> > > On 03-06-16 14:46, Hans De Goede wrote: >> drmmode_set_scanout_pixmap(pix) adds drmmod->fb_id through a call >> to drmmode_xf86crtc_resize(), but on a subsequent >> drmmode_set_scanout_pixmap(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. >> >> Signed-off-by: Hans de Goede <hdegoede at redhat.com> >> --- >> src/drmmode_display.c | 8 +++++++- >> 1 file changed, 7 insertions(+), 1 deletion(-) >> >> diff --git a/src/drmmode_display.c b/src/drmmode_display.c >> index b950f42..f326e46 100644 >> --- a/src/drmmode_display.c >> +++ b/src/drmmode_display.c >> @@ -680,10 +680,16 @@ drmmode_set_scanout_pixmap(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 && drmmode->fb_id) { >> + drmModeRmFB(drmmode->fd, drmmode->fb_id); >> + drmmode->fb_id = 0; >> + } >> + } >> drmmode_crtc->scanout_pixmap_x = 0; >> return TRUE; >> } >> > _______________________________________________ > Nouveau mailing list > Nouveau at lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/nouveau-------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 819 bytes Desc: OpenPGP digital signature URL: <https://lists.freedesktop.org/archives/nouveau/attachments/20160628/65bd3fbf/attachment.sig>
Reasonably Related Threads
- [PATCH] adapt to HAS_DIRTYTRACKING_DRAWABLE_SRC changes
- [xf86-video-nouveau] Properly cleanup fb for reverse-prime-offload
- [PATCH xserver] Make PixmapDirtyUpdateRec::src a DrawablePtr
- [Bug 66255] New: Enabling Xinerama with nouveau driver causes Segmentation fault
- [Bug 60369] New: src/nouveau_exa.c:142:31: error: 'CREATE_PIXMAP_USAGE_SHARED' undeclared (first use in this function)