diff options
author | Thierry Reding <treding@nvidia.com> | 2018-04-23 11:01:36 +0200 |
---|---|---|
committer | Thierry Reding <treding@nvidia.com> | 2018-05-02 17:29:40 +0200 |
commit | 3797649a814c670562d8871db21133899bf1045d (patch) | |
tree | 802e1ba237afa9ccb73bb259815e6c9db78ba614 | |
parent | 8d27adeb0bc404cccfa81797a3079f02d247d8e5 (diff) |
tegra: Add PRIME support helpers
These helpers facilitate exporting and importing buffer objects to and
from PRIME file descriptors.
Signed-off-by: Thierry Reding <treding@nvidia.com>
-rw-r--r-- | tegra/tegra.c | 61 | ||||
-rw-r--r-- | tegra/tegra.h | 4 |
2 files changed, 65 insertions, 0 deletions
diff --git a/tegra/tegra.c b/tegra/tegra.c index f29b6e81..e5e1363f 100644 --- a/tegra/tegra.c +++ b/tegra/tegra.c @@ -293,3 +293,64 @@ free: free(bo); return err; } + +int drm_tegra_bo_export(struct drm_tegra_bo *bo, uint32_t flags) +{ + int fd, err; + + flags |= DRM_CLOEXEC; + + err = drmPrimeHandleToFD(bo->drm->fd, bo->handle, flags, &fd); + if (err < 0) + return err; + + return fd; +} + +static ssize_t fd_get_size(int fd) +{ + ssize_t size, offset; + int err; + + offset = lseek(fd, 0, SEEK_CUR); + if (offset < 0) + return -errno; + + size = lseek(fd, 0, SEEK_END); + if (size < 0) + return -errno; + + err = lseek(fd, offset, SEEK_SET); + if (err < 0) + return -errno; + + return size; +} + +int drm_tegra_bo_import(struct drm_tegra_bo **bop, struct drm_tegra *drm, + int fd) +{ + struct drm_tegra_bo *bo; + ssize_t size; + int err; + + size = fd_get_size(fd); + if (size < 0) + return size; + + bo = drm_tegra_bo_alloc(drm, 0, 0, size); + if (!bo) + return -ENOMEM; + + err = drmPrimeFDToHandle(drm->fd, fd, &bo->handle); + if (err < 0) + goto free; + + *bop = bo; + + return 0; + +free: + free(bo); + return err; +} diff --git a/tegra/tegra.h b/tegra/tegra.h index 5389098b..694eb2c0 100644 --- a/tegra/tegra.h +++ b/tegra/tegra.h @@ -69,6 +69,10 @@ int drm_tegra_bo_get_name(struct drm_tegra_bo *bo, uint32_t *name); int drm_tegra_bo_open(struct drm_tegra_bo **bop, struct drm_tegra *drm, uint32_t name, uint32_t flags); +int drm_tegra_bo_export(struct drm_tegra_bo *bo, uint32_t flags); +int drm_tegra_bo_import(struct drm_tegra_bo **bop, struct drm_tegra *drm, + int fd); + struct drm_tegra_channel; struct drm_tegra_job; |