diff options
author | Sourab Gupta <sourabg@nvidia.com> | 2018-04-10 05:28:09 -0400 |
---|---|---|
committer | mobile promotions <svcmobile_promotions@nvidia.com> | 2018-04-11 13:16:16 -0400 |
commit | 6c6aab952e91c9f15265af04be78c5a49934a823 (patch) | |
tree | 5f4eb2bd858e02a0ab1f53cde6237173db8284f2 /drivers/gpu/nvgpu/common | |
parent | f8578c92741425ec4630bc9fe52d8537fa8a5c16 (diff) |
gpu: nvgpu: Add conversion function for uapi submit gpfifo flags
The submit gpfifo flags are splattered everywhere inside the nvgpu
code. Though the usage is inside nvgpu Linux code only, still it
needs to be gotten rid of and replaced with the defines
present in common code.
VQRM-3465
Change-Id: I901b33565b01fa3e1f9ba6698a323c16547a8d3e
Signed-off-by: Sourab Gupta <sourabg@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/1691979
Reviewed-by: Konsta Holtta <kholtta@nvidia.com>
GVS: Gerrit_Virtual_Submit
Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/common')
-rw-r--r-- | drivers/gpu/nvgpu/common/linux/cde.c | 2 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/common/linux/ce2.c | 2 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/common/linux/channel.c | 56 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/common/linux/channel.h | 1 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/common/linux/ioctl_channel.c | 5 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/common/linux/ioctl_ctrl.c | 10 |
6 files changed, 55 insertions, 21 deletions
diff --git a/drivers/gpu/nvgpu/common/linux/cde.c b/drivers/gpu/nvgpu/common/linux/cde.c index dcccafb4..4911afa1 100644 --- a/drivers/gpu/nvgpu/common/linux/cde.c +++ b/drivers/gpu/nvgpu/common/linux/cde.c | |||
@@ -1171,7 +1171,7 @@ __releases(&l->cde_app->mutex) | |||
1171 | 1171 | ||
1172 | /* take always the postfence as it is needed for protecting the | 1172 | /* take always the postfence as it is needed for protecting the |
1173 | * cde context */ | 1173 | * cde context */ |
1174 | flags = __flags | NVGPU_SUBMIT_GPFIFO_FLAGS_FENCE_GET; | 1174 | flags = __flags | NVGPU_SUBMIT_FLAGS_FENCE_GET; |
1175 | 1175 | ||
1176 | /* gk20a_cde_execute_buffer() will grab a power reference of it's own */ | 1176 | /* gk20a_cde_execute_buffer() will grab a power reference of it's own */ |
1177 | gk20a_idle(g); | 1177 | gk20a_idle(g); |
diff --git a/drivers/gpu/nvgpu/common/linux/ce2.c b/drivers/gpu/nvgpu/common/linux/ce2.c index 6ffc0532..5339f130 100644 --- a/drivers/gpu/nvgpu/common/linux/ce2.c +++ b/drivers/gpu/nvgpu/common/linux/ce2.c | |||
@@ -128,7 +128,7 @@ int gk20a_ce_execute_ops(struct gk20a *g, | |||
128 | pbdma_gp_entry1_length_f(methodSize)); | 128 | pbdma_gp_entry1_length_f(methodSize)); |
129 | 129 | ||
130 | /* take always the postfence as it is needed for protecting the ce context */ | 130 | /* take always the postfence as it is needed for protecting the ce context */ |
131 | submit_flags |= NVGPU_SUBMIT_GPFIFO_FLAGS_FENCE_GET; | 131 | submit_flags |= NVGPU_SUBMIT_FLAGS_FENCE_GET; |
132 | 132 | ||
133 | nvgpu_smp_wmb(); | 133 | nvgpu_smp_wmb(); |
134 | 134 | ||
diff --git a/drivers/gpu/nvgpu/common/linux/channel.c b/drivers/gpu/nvgpu/common/linux/channel.c index db85f66a..70baeb2d 100644 --- a/drivers/gpu/nvgpu/common/linux/channel.c +++ b/drivers/gpu/nvgpu/common/linux/channel.c | |||
@@ -39,6 +39,34 @@ | |||
39 | #include <trace/events/gk20a.h> | 39 | #include <trace/events/gk20a.h> |
40 | #include <uapi/linux/nvgpu.h> | 40 | #include <uapi/linux/nvgpu.h> |
41 | 41 | ||
42 | u32 nvgpu_submit_gpfifo_user_flags_to_common_flags(u32 user_flags) | ||
43 | { | ||
44 | u32 flags = 0; | ||
45 | |||
46 | if (user_flags & NVGPU_SUBMIT_GPFIFO_FLAGS_FENCE_WAIT) | ||
47 | flags |= NVGPU_SUBMIT_FLAGS_FENCE_WAIT; | ||
48 | |||
49 | if (user_flags & NVGPU_SUBMIT_GPFIFO_FLAGS_FENCE_GET) | ||
50 | flags |= NVGPU_SUBMIT_FLAGS_FENCE_GET; | ||
51 | |||
52 | if (user_flags & NVGPU_SUBMIT_GPFIFO_FLAGS_HW_FORMAT) | ||
53 | flags |= NVGPU_SUBMIT_FLAGS_HW_FORMAT; | ||
54 | |||
55 | if (user_flags & NVGPU_SUBMIT_GPFIFO_FLAGS_SYNC_FENCE) | ||
56 | flags |= NVGPU_SUBMIT_FLAGS_SYNC_FENCE; | ||
57 | |||
58 | if (user_flags & NVGPU_SUBMIT_GPFIFO_FLAGS_SUPPRESS_WFI) | ||
59 | flags |= NVGPU_SUBMIT_FLAGS_SUPPRESS_WFI; | ||
60 | |||
61 | if (user_flags & NVGPU_SUBMIT_GPFIFO_FLAGS_SKIP_BUFFER_REFCOUNTING) | ||
62 | flags |= NVGPU_SUBMIT_FLAGS_SKIP_BUFFER_REFCOUNTING; | ||
63 | |||
64 | if (user_flags & NVGPU_SUBMIT_GPFIFO_FLAGS_RESCHEDULE_RUNLIST) | ||
65 | flags |= NVGPU_SUBMIT_FLAGS_RESCHEDULE_RUNLIST; | ||
66 | |||
67 | return flags; | ||
68 | } | ||
69 | |||
42 | /* | 70 | /* |
43 | * API to convert error_notifiers in common code and of the form | 71 | * API to convert error_notifiers in common code and of the form |
44 | * NVGPU_ERR_NOTIFIER_* into Linux specific error_notifiers exposed to user | 72 | * NVGPU_ERR_NOTIFIER_* into Linux specific error_notifiers exposed to user |
@@ -430,7 +458,7 @@ static int gk20a_submit_prepare_syncs(struct channel_gk20a *c, | |||
430 | bool new_sync_created = false; | 458 | bool new_sync_created = false; |
431 | int wait_fence_fd = -1; | 459 | int wait_fence_fd = -1; |
432 | int err = 0; | 460 | int err = 0; |
433 | bool need_wfi = !(flags & NVGPU_SUBMIT_GPFIFO_FLAGS_SUPPRESS_WFI); | 461 | bool need_wfi = !(flags & NVGPU_SUBMIT_FLAGS_SUPPRESS_WFI); |
434 | bool pre_alloc_enabled = channel_gk20a_is_prealloc_enabled(c); | 462 | bool pre_alloc_enabled = channel_gk20a_is_prealloc_enabled(c); |
435 | 463 | ||
436 | /* | 464 | /* |
@@ -465,7 +493,7 @@ static int gk20a_submit_prepare_syncs(struct channel_gk20a *c, | |||
465 | * Optionally insert syncpt/semaphore wait in the beginning of gpfifo | 493 | * Optionally insert syncpt/semaphore wait in the beginning of gpfifo |
466 | * submission when user requested and the wait hasn't expired. | 494 | * submission when user requested and the wait hasn't expired. |
467 | */ | 495 | */ |
468 | if (flags & NVGPU_SUBMIT_GPFIFO_FLAGS_FENCE_WAIT) { | 496 | if (flags & NVGPU_SUBMIT_FLAGS_FENCE_WAIT) { |
469 | int max_wait_cmds = c->deterministic ? 1 : 0; | 497 | int max_wait_cmds = c->deterministic ? 1 : 0; |
470 | 498 | ||
471 | if (!pre_alloc_enabled) | 499 | if (!pre_alloc_enabled) |
@@ -477,7 +505,7 @@ static int gk20a_submit_prepare_syncs(struct channel_gk20a *c, | |||
477 | goto fail; | 505 | goto fail; |
478 | } | 506 | } |
479 | 507 | ||
480 | if (flags & NVGPU_SUBMIT_GPFIFO_FLAGS_SYNC_FENCE) { | 508 | if (flags & NVGPU_SUBMIT_FLAGS_SYNC_FENCE) { |
481 | wait_fence_fd = fence->id; | 509 | wait_fence_fd = fence->id; |
482 | err = c->sync->wait_fd(c->sync, wait_fence_fd, | 510 | err = c->sync->wait_fd(c->sync, wait_fence_fd, |
483 | job->wait_cmd, max_wait_cmds); | 511 | job->wait_cmd, max_wait_cmds); |
@@ -494,8 +522,8 @@ static int gk20a_submit_prepare_syncs(struct channel_gk20a *c, | |||
494 | *wait_cmd = job->wait_cmd; | 522 | *wait_cmd = job->wait_cmd; |
495 | } | 523 | } |
496 | 524 | ||
497 | if ((flags & NVGPU_SUBMIT_GPFIFO_FLAGS_FENCE_GET) && | 525 | if ((flags & NVGPU_SUBMIT_FLAGS_FENCE_GET) && |
498 | (flags & NVGPU_SUBMIT_GPFIFO_FLAGS_SYNC_FENCE)) | 526 | (flags & NVGPU_SUBMIT_FLAGS_SYNC_FENCE)) |
499 | need_sync_fence = true; | 527 | need_sync_fence = true; |
500 | 528 | ||
501 | /* | 529 | /* |
@@ -516,7 +544,7 @@ static int gk20a_submit_prepare_syncs(struct channel_gk20a *c, | |||
516 | goto clean_up_post_fence; | 544 | goto clean_up_post_fence; |
517 | } | 545 | } |
518 | 546 | ||
519 | if (flags & NVGPU_SUBMIT_GPFIFO_FLAGS_FENCE_GET) | 547 | if (flags & NVGPU_SUBMIT_FLAGS_FENCE_GET) |
520 | err = c->sync->incr_user(c->sync, wait_fence_fd, job->incr_cmd, | 548 | err = c->sync->incr_user(c->sync, wait_fence_fd, job->incr_cmd, |
521 | job->post_fence, need_wfi, need_sync_fence, | 549 | job->post_fence, need_wfi, need_sync_fence, |
522 | register_irq); | 550 | register_irq); |
@@ -678,7 +706,7 @@ int gk20a_submit_channel_gpfifo(struct channel_gk20a *c, | |||
678 | * and one for post fence. */ | 706 | * and one for post fence. */ |
679 | const int extra_entries = 2; | 707 | const int extra_entries = 2; |
680 | bool skip_buffer_refcounting = (flags & | 708 | bool skip_buffer_refcounting = (flags & |
681 | NVGPU_SUBMIT_GPFIFO_FLAGS_SKIP_BUFFER_REFCOUNTING); | 709 | NVGPU_SUBMIT_FLAGS_SKIP_BUFFER_REFCOUNTING); |
682 | int err = 0; | 710 | int err = 0; |
683 | bool need_job_tracking; | 711 | bool need_job_tracking; |
684 | bool need_deferred_cleanup = false; | 712 | bool need_deferred_cleanup = false; |
@@ -706,8 +734,8 @@ int gk20a_submit_channel_gpfifo(struct channel_gk20a *c, | |||
706 | if (!gpfifo && !args) | 734 | if (!gpfifo && !args) |
707 | return -EINVAL; | 735 | return -EINVAL; |
708 | 736 | ||
709 | if ((flags & (NVGPU_SUBMIT_GPFIFO_FLAGS_FENCE_WAIT | | 737 | if ((flags & (NVGPU_SUBMIT_FLAGS_FENCE_WAIT | |
710 | NVGPU_SUBMIT_GPFIFO_FLAGS_FENCE_GET)) && | 738 | NVGPU_SUBMIT_FLAGS_FENCE_GET)) && |
711 | !fence) | 739 | !fence) |
712 | return -EINVAL; | 740 | return -EINVAL; |
713 | 741 | ||
@@ -738,8 +766,8 @@ int gk20a_submit_channel_gpfifo(struct channel_gk20a *c, | |||
738 | * required and a fast submit can be done (ie. only need to write | 766 | * required and a fast submit can be done (ie. only need to write |
739 | * out userspace GPFIFO entries and update GP_PUT). | 767 | * out userspace GPFIFO entries and update GP_PUT). |
740 | */ | 768 | */ |
741 | need_job_tracking = (flags & NVGPU_SUBMIT_GPFIFO_FLAGS_FENCE_WAIT) || | 769 | need_job_tracking = (flags & NVGPU_SUBMIT_FLAGS_FENCE_WAIT) || |
742 | (flags & NVGPU_SUBMIT_GPFIFO_FLAGS_FENCE_GET) || | 770 | (flags & NVGPU_SUBMIT_FLAGS_FENCE_GET) || |
743 | c->timeout.enabled || | 771 | c->timeout.enabled || |
744 | (g->can_railgate && !c->deterministic) || | 772 | (g->can_railgate && !c->deterministic) || |
745 | !skip_buffer_refcounting; | 773 | !skip_buffer_refcounting; |
@@ -757,8 +785,8 @@ int gk20a_submit_channel_gpfifo(struct channel_gk20a *c, | |||
757 | 785 | ||
758 | need_sync_framework = force_need_sync_fence || | 786 | need_sync_framework = force_need_sync_fence || |
759 | gk20a_channel_sync_needs_sync_framework(g) || | 787 | gk20a_channel_sync_needs_sync_framework(g) || |
760 | (flags & NVGPU_SUBMIT_GPFIFO_FLAGS_SYNC_FENCE && | 788 | (flags & NVGPU_SUBMIT_FLAGS_SYNC_FENCE && |
761 | flags & NVGPU_SUBMIT_GPFIFO_FLAGS_FENCE_GET); | 789 | flags & NVGPU_SUBMIT_FLAGS_FENCE_GET); |
762 | 790 | ||
763 | /* | 791 | /* |
764 | * Deferred clean-up is necessary for any of the following | 792 | * Deferred clean-up is necessary for any of the following |
@@ -899,7 +927,7 @@ int gk20a_submit_channel_gpfifo(struct channel_gk20a *c, | |||
899 | 927 | ||
900 | g->ops.fifo.userd_gp_put(g, c); | 928 | g->ops.fifo.userd_gp_put(g, c); |
901 | 929 | ||
902 | if ((NVGPU_SUBMIT_GPFIFO_FLAGS_RESCHEDULE_RUNLIST & flags) && | 930 | if ((NVGPU_SUBMIT_FLAGS_RESCHEDULE_RUNLIST & flags) && |
903 | g->ops.fifo.reschedule_runlist) | 931 | g->ops.fifo.reschedule_runlist) |
904 | g->ops.fifo.reschedule_runlist(g, c->runlist_id); | 932 | g->ops.fifo.reschedule_runlist(g, c->runlist_id); |
905 | 933 | ||
diff --git a/drivers/gpu/nvgpu/common/linux/channel.h b/drivers/gpu/nvgpu/common/linux/channel.h index 6026e259..d4cb6d55 100644 --- a/drivers/gpu/nvgpu/common/linux/channel.h +++ b/drivers/gpu/nvgpu/common/linux/channel.h | |||
@@ -61,6 +61,7 @@ struct nvgpu_channel_linux { | |||
61 | struct dma_buf *cyclestate_buffer_handler; | 61 | struct dma_buf *cyclestate_buffer_handler; |
62 | }; | 62 | }; |
63 | 63 | ||
64 | u32 nvgpu_submit_gpfifo_user_flags_to_common_flags(u32 user_flags); | ||
64 | int nvgpu_init_channel_support_linux(struct nvgpu_os_linux *l); | 65 | int nvgpu_init_channel_support_linux(struct nvgpu_os_linux *l); |
65 | void nvgpu_remove_channel_support_linux(struct nvgpu_os_linux *l); | 66 | void nvgpu_remove_channel_support_linux(struct nvgpu_os_linux *l); |
66 | 67 | ||
diff --git a/drivers/gpu/nvgpu/common/linux/ioctl_channel.c b/drivers/gpu/nvgpu/common/linux/ioctl_channel.c index c75c9244..5b4dda6c 100644 --- a/drivers/gpu/nvgpu/common/linux/ioctl_channel.c +++ b/drivers/gpu/nvgpu/common/linux/ioctl_channel.c | |||
@@ -771,6 +771,7 @@ static int gk20a_ioctl_channel_submit_gpfifo( | |||
771 | struct nvgpu_channel_fence fence; | 771 | struct nvgpu_channel_fence fence; |
772 | struct gk20a_fence *fence_out; | 772 | struct gk20a_fence *fence_out; |
773 | struct fifo_profile_gk20a *profile = NULL; | 773 | struct fifo_profile_gk20a *profile = NULL; |
774 | u32 submit_flags = 0; | ||
774 | 775 | ||
775 | int ret = 0; | 776 | int ret = 0; |
776 | gk20a_dbg_fn(""); | 777 | gk20a_dbg_fn(""); |
@@ -789,8 +790,10 @@ static int gk20a_ioctl_channel_submit_gpfifo( | |||
789 | return -EPERM; | 790 | return -EPERM; |
790 | 791 | ||
791 | nvgpu_get_fence_args(&args->fence, &fence); | 792 | nvgpu_get_fence_args(&args->fence, &fence); |
793 | submit_flags = | ||
794 | nvgpu_submit_gpfifo_user_flags_to_common_flags(args->flags); | ||
792 | ret = gk20a_submit_channel_gpfifo(ch, NULL, args, args->num_entries, | 795 | ret = gk20a_submit_channel_gpfifo(ch, NULL, args, args->num_entries, |
793 | args->flags, &fence, | 796 | submit_flags, &fence, |
794 | &fence_out, false, profile); | 797 | &fence_out, false, profile); |
795 | 798 | ||
796 | if (ret) | 799 | if (ret) |
diff --git a/drivers/gpu/nvgpu/common/linux/ioctl_ctrl.c b/drivers/gpu/nvgpu/common/linux/ioctl_ctrl.c index 3392b6fa..e4b66460 100644 --- a/drivers/gpu/nvgpu/common/linux/ioctl_ctrl.c +++ b/drivers/gpu/nvgpu/common/linux/ioctl_ctrl.c | |||
@@ -43,6 +43,7 @@ | |||
43 | #include "platform_gk20a.h" | 43 | #include "platform_gk20a.h" |
44 | #include "os_linux.h" | 44 | #include "os_linux.h" |
45 | #include "dmabuf.h" | 45 | #include "dmabuf.h" |
46 | #include "channel.h" | ||
46 | 47 | ||
47 | #define HZ_TO_MHZ(a) ((a > 0xF414F9CD7ULL) ? 0xffff : (a >> 32) ? \ | 48 | #define HZ_TO_MHZ(a) ((a > 0xF414F9CD7ULL) ? 0xffff : (a >> 32) ? \ |
48 | (u32) ((a * 0x10C8ULL) >> 32) : (u16) ((u32) a/MHZ)) | 49 | (u32) ((a * 0x10C8ULL) >> 32) : (u16) ((u32) a/MHZ)) |
@@ -341,7 +342,8 @@ static int gk20a_ctrl_prepare_compressible_read( | |||
341 | struct nvgpu_os_linux *l = nvgpu_os_linux_from_gk20a(g); | 342 | struct nvgpu_os_linux *l = nvgpu_os_linux_from_gk20a(g); |
342 | struct nvgpu_channel_fence fence; | 343 | struct nvgpu_channel_fence fence; |
343 | struct gk20a_fence *fence_out = NULL; | 344 | struct gk20a_fence *fence_out = NULL; |
344 | int flags = args->submit_flags; | 345 | int submit_flags = nvgpu_submit_gpfifo_user_flags_to_common_flags( |
346 | args->submit_flags); | ||
345 | 347 | ||
346 | fence.id = args->fence.syncpt_id; | 348 | fence.id = args->fence.syncpt_id; |
347 | fence.value = args->fence.syncpt_value; | 349 | fence.value = args->fence.syncpt_value; |
@@ -351,15 +353,15 @@ static int gk20a_ctrl_prepare_compressible_read( | |||
351 | args->compbits_hoffset, args->compbits_voffset, | 353 | args->compbits_hoffset, args->compbits_voffset, |
352 | args->scatterbuffer_offset, | 354 | args->scatterbuffer_offset, |
353 | args->width, args->height, args->block_height_log2, | 355 | args->width, args->height, args->block_height_log2, |
354 | flags, &fence, &args->valid_compbits, | 356 | submit_flags, &fence, &args->valid_compbits, |
355 | &args->zbc_color, &fence_out); | 357 | &args->zbc_color, &fence_out); |
356 | 358 | ||
357 | if (ret) | 359 | if (ret) |
358 | return ret; | 360 | return ret; |
359 | 361 | ||
360 | /* Convert fence_out to something we can pass back to user space. */ | 362 | /* Convert fence_out to something we can pass back to user space. */ |
361 | if (flags & NVGPU_SUBMIT_GPFIFO_FLAGS_FENCE_GET) { | 363 | if (submit_flags & NVGPU_SUBMIT_FLAGS_FENCE_GET) { |
362 | if (flags & NVGPU_SUBMIT_GPFIFO_FLAGS_SYNC_FENCE) { | 364 | if (submit_flags & NVGPU_SUBMIT_FLAGS_SYNC_FENCE) { |
363 | if (fence_out) { | 365 | if (fence_out) { |
364 | int fd = gk20a_fence_install_fd(fence_out); | 366 | int fd = gk20a_fence_install_fd(fence_out); |
365 | if (fd < 0) | 367 | if (fd < 0) |