drm/nouveau/bo: add helper functions for handling pinned+mapped buffers
authorBen Skeggs <bskeggs@redhat.com>
Fri, 12 Jan 2018 07:05:03 +0000 (17:05 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Fri, 2 Feb 2018 05:24:06 +0000 (15:24 +1000)
This is a common, awkward sequence.  Let's wrap it up!

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nouveau_bo.h

index 7b5cc5c73d208987e533d15c22c2ca43acc62ef3..be8e00b49cdef1a961a7fcbd3f0cc25770be24cb 100644 (file)
@@ -105,4 +105,32 @@ nvbo_kmap_obj_iovirtual(struct nouveau_bo *nvbo)
        return ioptr;
 }
 
+static inline void
+nouveau_bo_unmap_unpin_unref(struct nouveau_bo **pnvbo)
+{
+       if (*pnvbo) {
+               nouveau_bo_unmap(*pnvbo);
+               nouveau_bo_unpin(*pnvbo);
+               nouveau_bo_ref(NULL, pnvbo);
+       }
+}
+
+static inline int
+nouveau_bo_new_pin_map(struct nouveau_cli *cli, u64 size, int align, u32 flags,
+                      struct nouveau_bo **pnvbo)
+{
+       int ret = nouveau_bo_new(cli, size, align, flags,
+                                0, 0, NULL, NULL, pnvbo);
+       if (ret == 0) {
+               ret = nouveau_bo_pin(*pnvbo, flags, true);
+               if (ret == 0) {
+                       ret = nouveau_bo_map(*pnvbo);
+                       if (ret == 0)
+                               return ret;
+                       nouveau_bo_unpin(*pnvbo);
+               }
+               nouveau_bo_ref(NULL, pnvbo);
+       }
+       return ret;
+}
 #endif