]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/gpu/drm/nouveau/dispnv50/wndw.c
drm/nouveau/kms/nv50-: add fp16 scanout support
[linux.git] / drivers / gpu / drm / nouveau / dispnv50 / wndw.c
index 283ff690350ea76ee20fe7db1beda003631f4be2..dd01ea21da97322c67623d33d0da61f934fd8183 100644 (file)
@@ -26,6 +26,8 @@
 #include <nvif/cl0002.h>
 
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_fourcc.h>
+
 #include "nouveau_bo.h"
 
 static void
@@ -202,18 +204,20 @@ static int
 nv50_wndw_atomic_check_acquire_rgb(struct nv50_wndw_atom *asyw)
 {
        switch (asyw->state.fb->format->format) {
-       case DRM_FORMAT_C8         : asyw->image.format = 0x1e; break;
-       case DRM_FORMAT_XRGB8888   :
-       case DRM_FORMAT_ARGB8888   : asyw->image.format = 0xcf; break;
-       case DRM_FORMAT_RGB565     : asyw->image.format = 0xe8; break;
-       case DRM_FORMAT_XRGB1555   :
-       case DRM_FORMAT_ARGB1555   : asyw->image.format = 0xe9; break;
-       case DRM_FORMAT_XBGR2101010:
-       case DRM_FORMAT_ABGR2101010: asyw->image.format = 0xd1; break;
-       case DRM_FORMAT_XBGR8888   :
-       case DRM_FORMAT_ABGR8888   : asyw->image.format = 0xd5; break;
-       case DRM_FORMAT_XRGB2101010:
-       case DRM_FORMAT_ARGB2101010: asyw->image.format = 0xdf; break;
+       case DRM_FORMAT_C8           : asyw->image.format = 0x1e; break;
+       case DRM_FORMAT_XRGB8888     :
+       case DRM_FORMAT_ARGB8888     : asyw->image.format = 0xcf; break;
+       case DRM_FORMAT_RGB565       : asyw->image.format = 0xe8; break;
+       case DRM_FORMAT_XRGB1555     :
+       case DRM_FORMAT_ARGB1555     : asyw->image.format = 0xe9; break;
+       case DRM_FORMAT_XBGR2101010  :
+       case DRM_FORMAT_ABGR2101010  : asyw->image.format = 0xd1; break;
+       case DRM_FORMAT_XBGR8888     :
+       case DRM_FORMAT_ABGR8888     : asyw->image.format = 0xd5; break;
+       case DRM_FORMAT_XRGB2101010  :
+       case DRM_FORMAT_ARGB2101010  : asyw->image.format = 0xdf; break;
+       case DRM_FORMAT_XBGR16161616F:
+       case DRM_FORMAT_ABGR16161616F: asyw->image.format = 0xca; break;
        default:
                return -EINVAL;
        }
@@ -320,7 +324,9 @@ nv50_wndw_atomic_check_lut(struct nv50_wndw *wndw,
                asyh->wndw.olut &= ~BIT(wndw->id);
        }
 
-       if (!ilut && wndw->func->ilut_identity) {
+       if (!ilut && wndw->func->ilut_identity &&
+           asyw->state.fb->format->format != DRM_FORMAT_XBGR16161616F &&
+           asyw->state.fb->format->format != DRM_FORMAT_ABGR16161616F) {
                static struct drm_property_blob dummy = {};
                ilut = &dummy;
        }
@@ -332,6 +338,8 @@ nv50_wndw_atomic_check_lut(struct nv50_wndw *wndw,
                asyw->xlut.handle = wndw->wndw.vram.handle;
                asyw->xlut.i.buffer = !asyw->xlut.i.buffer;
                asyw->set.xlut = true;
+       } else {
+               asyw->clr.xlut = armw->xlut.handle != 0;
        }
 
        /* Handle setting base SET_OUTPUT_LUT_LO_ENABLE_USE_CORE_LUT. */
@@ -457,7 +465,7 @@ nv50_wndw_prepare_fb(struct drm_plane *plane, struct drm_plane_state *state)
                asyw->image.handle[0] = ctxdma->object.handle;
        }
 
-       asyw->state.fence = reservation_object_get_excl_rcu(fb->nvbo->bo.resv);
+       asyw->state.fence = dma_resv_get_excl_rcu(fb->nvbo->bo.base.resv);
        asyw->image.offset[0] = fb->nvbo->bo.offset;
 
        if (wndw->func->prepare) {