diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2018-01-12 17:05:03 +1000 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2018-02-02 15:24:06 +1000 |
commit | 561464ea543c2f39f07ac2da91043555fa133601 (patch) | |
tree | 81f3a170488fc25bfee5026bc674a7f769c40d3d /drivers/gpu | |
parent | 27cda223327505a19d912536dff205ccdc5c5c2a (diff) | |
download | linux-561464ea543c2f39f07ac2da91043555fa133601.tar.bz2 |
drm/nouveau/bo: add helper functions for handling pinned+mapped buffers
This is a common, awkward sequence. Let's wrap it up!
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_bo.h | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.h b/drivers/gpu/drm/nouveau/nouveau_bo.h index 7b5cc5c73d20..be8e00b49cde 100644 --- a/drivers/gpu/drm/nouveau/nouveau_bo.h +++ b/drivers/gpu/drm/nouveau/nouveau_bo.h @@ -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 |