diff --git a/drivers/gpu/nvgpu/include/nvgpu/linux/os_fence_android.h b/drivers/gpu/nvgpu/include/nvgpu/linux/os_fence_android.h index 55a7b9689..e1bcc07ce 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/linux/os_fence_android.h +++ b/drivers/gpu/nvgpu/include/nvgpu/linux/os_fence_android.h @@ -29,6 +29,7 @@ void nvgpu_os_fence_android_drop_ref(struct nvgpu_os_fence *s); int nvgpu_os_fence_sema_fdget(struct nvgpu_os_fence *fence_out, struct nvgpu_channel *c, int fd); +void nvgpu_os_fence_android_dup(struct nvgpu_os_fence *s); int nvgpu_os_fence_android_install_fd(struct nvgpu_os_fence *s, int fd); int nvgpu_os_fence_syncpt_fdget( diff --git a/drivers/gpu/nvgpu/include/nvgpu/linux/os_fence_dma.h b/drivers/gpu/nvgpu/include/nvgpu/linux/os_fence_dma.h index 87bd3b507..0fd380310 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/linux/os_fence_dma.h +++ b/drivers/gpu/nvgpu/include/nvgpu/linux/os_fence_dma.h @@ -30,6 +30,7 @@ int nvgpu_os_fence_sema_fdget(struct nvgpu_os_fence *fence_out, struct nvgpu_channel *c, int fd); int nvgpu_os_fence_dma_install_fd(struct nvgpu_os_fence *s, int fd); +void nvgpu_os_fence_dma_dup(struct nvgpu_os_fence *s); int nvgpu_os_fence_syncpt_fdget(struct nvgpu_os_fence *fence_out, struct nvgpu_channel *c, int fd); diff --git a/drivers/gpu/nvgpu/include/nvgpu/os_fence.h b/drivers/gpu/nvgpu/include/nvgpu/os_fence.h index ae418589b..80a8b7c47 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/os_fence.h +++ b/drivers/gpu/nvgpu/include/nvgpu/os_fence.h @@ -59,6 +59,12 @@ struct nvgpu_os_fence_ops { * implementation varies from OS to OS. */ int (*install_fence)(struct nvgpu_os_fence *s, int fd); + /* + * Increment a refcount of the underlying sync object. After this the + * struct nvgpu_os_fence object can be copied once. This call must be + * matched with a drop_ref as usual. + */ + void (*dup)(struct nvgpu_os_fence *s); }; /* diff --git a/drivers/gpu/nvgpu/os/linux/os_fence_android.c b/drivers/gpu/nvgpu/os/linux/os_fence_android.c index b8be84b38..70bba5c2a 100644 --- a/drivers/gpu/nvgpu/os/linux/os_fence_android.c +++ b/drivers/gpu/nvgpu/os/linux/os_fence_android.c @@ -49,6 +49,13 @@ int nvgpu_os_fence_android_install_fd(struct nvgpu_os_fence *s, int fd) return 0; } +void nvgpu_os_fence_android_dup(struct nvgpu_os_fence *s) +{ + struct sync_fence *fence = nvgpu_get_sync_fence(s); + + sync_fence_get(fence); +} + int nvgpu_os_fence_fdget(struct nvgpu_os_fence *fence_out, struct nvgpu_channel *c, int fd) { diff --git a/drivers/gpu/nvgpu/os/linux/os_fence_android_sema.c b/drivers/gpu/nvgpu/os/linux/os_fence_android_sema.c index 7e943e733..54b92fb76 100644 --- a/drivers/gpu/nvgpu/os/linux/os_fence_android_sema.c +++ b/drivers/gpu/nvgpu/os/linux/os_fence_android_sema.c @@ -33,6 +33,7 @@ static const struct nvgpu_os_fence_ops sema_ops = { .drop_ref = nvgpu_os_fence_android_drop_ref, .install_fence = nvgpu_os_fence_android_install_fd, + .dup = nvgpu_os_fence_android_dup, }; int nvgpu_os_fence_get_semas(struct nvgpu_os_fence_sema *fence_sema_out, diff --git a/drivers/gpu/nvgpu/os/linux/os_fence_dma.c b/drivers/gpu/nvgpu/os/linux/os_fence_dma.c index 17f9fe3d9..6ea5ef980 100644 --- a/drivers/gpu/nvgpu/os/linux/os_fence_dma.c +++ b/drivers/gpu/nvgpu/os/linux/os_fence_dma.c @@ -53,6 +53,13 @@ int nvgpu_os_fence_dma_install_fd(struct nvgpu_os_fence *s, int fd) return 0; } +void nvgpu_os_fence_dma_dup(struct nvgpu_os_fence *s) +{ + struct dma_fence *fence = nvgpu_get_dma_fence(s); + + dma_fence_get(fence); +} + int nvgpu_os_fence_fdget(struct nvgpu_os_fence *fence_out, struct nvgpu_channel *c, int fd) { diff --git a/drivers/gpu/nvgpu/os/linux/os_fence_dma_sema.c b/drivers/gpu/nvgpu/os/linux/os_fence_dma_sema.c index 71c86f3c5..8dd569002 100644 --- a/drivers/gpu/nvgpu/os/linux/os_fence_dma_sema.c +++ b/drivers/gpu/nvgpu/os/linux/os_fence_dma_sema.c @@ -29,6 +29,7 @@ static const struct nvgpu_os_fence_ops sema_ops = { .drop_ref = nvgpu_os_fence_dma_drop_ref, .install_fence = nvgpu_os_fence_dma_install_fd, + .dup = nvgpu_os_fence_dma_dup, }; int nvgpu_os_fence_get_semas(struct nvgpu_os_fence_sema *fence_sema_out, diff --git a/drivers/gpu/nvgpu/os/linux/os_fence_syncpt.c b/drivers/gpu/nvgpu/os/linux/os_fence_syncpt.c index 2bac0b200..4338b5bea 100644 --- a/drivers/gpu/nvgpu/os/linux/os_fence_syncpt.c +++ b/drivers/gpu/nvgpu/os/linux/os_fence_syncpt.c @@ -44,9 +44,15 @@ static void nvgpu_os_fence_syncpt_drop_ref(struct nvgpu_os_fence *s) nvgpu_os_fence_clear(s); } +static void nvgpu_os_fence_syncpt_dup(struct nvgpu_os_fence *s) +{ + nvhost_fence_dup(s->priv); +} + static const struct nvgpu_os_fence_ops syncpt_ops = { .drop_ref = nvgpu_os_fence_syncpt_drop_ref, .install_fence = nvgpu_os_fence_syncpt_install_fd, + .dup = nvgpu_os_fence_syncpt_dup, }; int nvgpu_os_fence_syncpt_create(struct nvgpu_os_fence *fence_out,