diff options
author | Deepak Nibade <dnibade@nvidia.com> | 2018-02-13 07:02:38 -0500 |
---|---|---|
committer | mobile promotions <svcmobile_promotions@nvidia.com> | 2018-02-26 06:48:11 -0500 |
commit | 8d5536271f989e01018a543016340a3d76a2fae2 (patch) | |
tree | c4981034e75b1933862b35518157c0897027e2b7 /drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.c | |
parent | 180604fec0bde1710923e78a3877d49892cbf883 (diff) |
gpu: nvgpu: add user API to get a syncpoint
Add new user API NVGPU_IOCTL_CHANNEL_GET_USER_SYNCPOINT which will expose
per-channel allocated syncpoint to user space
API will also return current value of the syncpoint
On supported platforms, this API will also return a RW semaphore address
(corresponding to syncpoint shim) to user space
Add new characteristics flag NVGPU_GPU_FLAGS_SUPPORT_USER_SYNCPOINT to indicate
support for this new API
Add new flag NVGPU_SUPPORT_USER_SYNCPOINT for use of core driver
Set this flag for GV11B and GP10B for now
Add a new API (*syncpt_address) in struct gk20a_channel_sync to get GPU_VA
address of a syncpoint
Add new API nvgpu_nvhost_syncpt_read_maxval() which will read and return MAX
value of syncpoint
Bug 200326065
Jira NVGPU-179
Change-Id: I9da6f17b85996f4fc6731c0bf94fca6f3181c3e0
Signed-off-by: Deepak Nibade <dnibade@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/1658009
Reviewed-by: svc-mobile-coverity <svc-mobile-coverity@nvidia.com>
GVS: Gerrit_Virtual_Submit
Reviewed-by: Konsta Holtta <kholtta@nvidia.com>
Reviewed-by: Vijayakumar Subbu <vsubbu@nvidia.com>
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.c')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.c b/drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.c index 4a6b8162..e965a329 100644 --- a/drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.c | |||
@@ -294,6 +294,13 @@ static int gk20a_channel_syncpt_id(struct gk20a_channel_sync *s) | |||
294 | return sp->id; | 294 | return sp->id; |
295 | } | 295 | } |
296 | 296 | ||
297 | static u64 gk20a_channel_syncpt_address(struct gk20a_channel_sync *s) | ||
298 | { | ||
299 | struct gk20a_channel_syncpt *sp = | ||
300 | container_of(s, struct gk20a_channel_syncpt, ops); | ||
301 | return sp->syncpt_buf.gpu_va; | ||
302 | } | ||
303 | |||
297 | static void gk20a_channel_syncpt_destroy(struct gk20a_channel_sync *s) | 304 | static void gk20a_channel_syncpt_destroy(struct gk20a_channel_sync *s) |
298 | { | 305 | { |
299 | struct gk20a_channel_syncpt *sp = | 306 | struct gk20a_channel_syncpt *sp = |
@@ -345,6 +352,7 @@ gk20a_channel_syncpt_create(struct channel_gk20a *c) | |||
345 | sp->ops.set_min_eq_max = gk20a_channel_syncpt_set_min_eq_max; | 352 | sp->ops.set_min_eq_max = gk20a_channel_syncpt_set_min_eq_max; |
346 | sp->ops.signal_timeline = gk20a_channel_syncpt_signal_timeline; | 353 | sp->ops.signal_timeline = gk20a_channel_syncpt_signal_timeline; |
347 | sp->ops.syncpt_id = gk20a_channel_syncpt_id; | 354 | sp->ops.syncpt_id = gk20a_channel_syncpt_id; |
355 | sp->ops.syncpt_address = gk20a_channel_syncpt_address; | ||
348 | sp->ops.destroy = gk20a_channel_syncpt_destroy; | 356 | sp->ops.destroy = gk20a_channel_syncpt_destroy; |
349 | 357 | ||
350 | return &sp->ops; | 358 | return &sp->ops; |
@@ -865,6 +873,11 @@ static int gk20a_channel_semaphore_syncpt_id(struct gk20a_channel_sync *s) | |||
865 | return -EINVAL; | 873 | return -EINVAL; |
866 | } | 874 | } |
867 | 875 | ||
876 | static u64 gk20a_channel_semaphore_syncpt_address(struct gk20a_channel_sync *s) | ||
877 | { | ||
878 | return 0; | ||
879 | } | ||
880 | |||
868 | static void gk20a_channel_semaphore_destroy(struct gk20a_channel_sync *s) | 881 | static void gk20a_channel_semaphore_destroy(struct gk20a_channel_sync *s) |
869 | { | 882 | { |
870 | struct gk20a_channel_semaphore *sema = | 883 | struct gk20a_channel_semaphore *sema = |
@@ -916,6 +929,7 @@ gk20a_channel_semaphore_create(struct channel_gk20a *c) | |||
916 | sema->ops.set_min_eq_max = gk20a_channel_semaphore_set_min_eq_max; | 929 | sema->ops.set_min_eq_max = gk20a_channel_semaphore_set_min_eq_max; |
917 | sema->ops.signal_timeline = gk20a_channel_semaphore_signal_timeline; | 930 | sema->ops.signal_timeline = gk20a_channel_semaphore_signal_timeline; |
918 | sema->ops.syncpt_id = gk20a_channel_semaphore_syncpt_id; | 931 | sema->ops.syncpt_id = gk20a_channel_semaphore_syncpt_id; |
932 | sema->ops.syncpt_address = gk20a_channel_semaphore_syncpt_address; | ||
919 | sema->ops.destroy = gk20a_channel_semaphore_destroy; | 933 | sema->ops.destroy = gk20a_channel_semaphore_destroy; |
920 | 934 | ||
921 | return &sema->ops; | 935 | return &sema->ops; |