| From c20bb155c2c5acb775f68be5d84fe679687c3c1e Mon Sep 17 00:00:00 2001 |
| From: Ilia Mirkin <imirkin@alum.mit.edu> |
| Date: Sat, 3 Feb 2018 14:11:23 -0500 |
| Subject: drm/nouveau: prefer XBGR2101010 for addfb ioctl |
| |
| From: Ilia Mirkin <imirkin@alum.mit.edu> |
| |
| commit c20bb155c2c5acb775f68be5d84fe679687c3c1e upstream. |
| |
| Nouveau only exposes support for XBGR2101010. Prior to the atomic |
| conversion, drm would pass in the wrong format in the framebuffer, but |
| it was always ignored -- both userspace (xf86-video-nouveau) and the |
| kernel driver agreed on the layout, so the fact that the format was |
| wrong didn't matter. |
| |
| With the atomic conversion, nouveau all of a sudden started caring about |
| the exact format, and so the previously-working code in |
| xf86-video-nouveau no longer functioned since the (internally-assigned) |
| format from the addfb ioctl was wrong. |
| |
| This change adds infrastructure to allow a drm driver to specify that it |
| prefers the XBGR format variant for the addfb ioctl, and makes nouveau's |
| nv50 display driver set it. (Prior gens had no support for 30bpp at all.) |
| |
| Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu> |
| Cc: stable@vger.kernel.org # v4.10+ |
| Acked-by: Ben Skeggs <bskeggs@redhat.com> |
| Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> |
| Link: https://patchwork.freedesktop.org/patch/msgid/20180203191123.31507-1-imirkin@alum.mit.edu |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/gpu/drm/drm_framebuffer.c | 4 ++++ |
| drivers/gpu/drm/nouveau/nv50_display.c | 1 + |
| include/drm/drm_drv.h | 1 + |
| 3 files changed, 6 insertions(+) |
| |
| --- a/drivers/gpu/drm/drm_framebuffer.c |
| +++ b/drivers/gpu/drm/drm_framebuffer.c |
| @@ -118,6 +118,10 @@ int drm_mode_addfb(struct drm_device *de |
| r.pixel_format = drm_mode_legacy_fb_format(or->bpp, or->depth); |
| r.handles[0] = or->handle; |
| |
| + if (r.pixel_format == DRM_FORMAT_XRGB2101010 && |
| + dev->driver->driver_features & DRIVER_PREFER_XBGR_30BPP) |
| + r.pixel_format = DRM_FORMAT_XBGR2101010; |
| + |
| ret = drm_mode_addfb2(dev, &r, file_priv); |
| if (ret) |
| return ret; |
| --- a/drivers/gpu/drm/nouveau/nv50_display.c |
| +++ b/drivers/gpu/drm/nouveau/nv50_display.c |
| @@ -4426,6 +4426,7 @@ nv50_display_create(struct drm_device *d |
| nouveau_display(dev)->fini = nv50_display_fini; |
| disp->disp = &nouveau_display(dev)->disp; |
| dev->mode_config.funcs = &nv50_disp_func; |
| + dev->driver->driver_features |= DRIVER_PREFER_XBGR_30BPP; |
| if (nouveau_atomic) |
| dev->driver->driver_features |= DRIVER_ATOMIC; |
| |
| --- a/include/drm/drm_drv.h |
| +++ b/include/drm/drm_drv.h |
| @@ -55,6 +55,7 @@ struct drm_mode_create_dumb; |
| #define DRIVER_ATOMIC 0x10000 |
| #define DRIVER_KMS_LEGACY_CONTEXT 0x20000 |
| #define DRIVER_SYNCOBJ 0x40000 |
| +#define DRIVER_PREFER_XBGR_30BPP 0x80000 |
| |
| /** |
| * struct drm_driver - DRM driver structure |