From 268c298f45cb1bc0beb0b51a3583c803010b2aff Mon Sep 17 00:00:00 2001 From: Konsta Holtta Date: Mon, 27 Aug 2018 16:28:25 +0300 Subject: gpu: nvgpu: use own usermode gpfifo object Add usermode_gpfifo member to channel to store the usermode-owned buffer data. This makes it more explicit about which (user or kernel) memory is accessed. Jira NVGPU-967 Change-Id: I98e4f4568f04aa31e00e497794fadd4997ba8aab Signed-off-by: Konsta Holtta Reviewed-on: https://git-master.nvidia.com/r/1807503 Reviewed-by: svc-misra-checker GVS: Gerrit_Virtual_Submit Reviewed-by: Sourab Gupta Reviewed-by: Deepak Nibade Reviewed-by: Terje Bergstrom Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/common/fifo/channel.c | 43 ++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 19 deletions(-) (limited to 'drivers/gpu/nvgpu/common/fifo/channel.c') diff --git a/drivers/gpu/nvgpu/common/fifo/channel.c b/drivers/gpu/nvgpu/common/fifo/channel.c index 7a496ea1..a444766b 100644 --- a/drivers/gpu/nvgpu/common/fifo/channel.c +++ b/drivers/gpu/nvgpu/common/fifo/channel.c @@ -1057,6 +1057,7 @@ int gk20a_channel_alloc_gpfifo(struct channel_gk20a *c, struct gk20a *g = c->g; struct vm_gk20a *ch_vm; u32 gpfifo_size, gpfifo_entry_size; + u64 gpfifo_gpu_va; int err = 0; unsigned long acquire_timeout; @@ -1097,7 +1098,8 @@ int gk20a_channel_alloc_gpfifo(struct channel_gk20a *c, } ch_vm = c->vm; - if (c->gpfifo.mem.size) { + if (nvgpu_mem_is_valid(&c->gpfifo.mem) || + c->usermode_submit_enabled) { nvgpu_err(g, "channel %d :" "gpfifo already allocated", c->chid); err = -EEXIST; @@ -1120,30 +1122,32 @@ int gk20a_channel_alloc_gpfifo(struct channel_gk20a *c, err = -EINVAL; goto clean_up; } - } - - err = nvgpu_dma_alloc_map_sys(ch_vm, - gpfifo_size * gpfifo_entry_size, - &c->gpfifo.mem); - if (err) { - nvgpu_err(g, "%s: memory allocation failed", __func__); - goto clean_up_usermode; - } + gpfifo_gpu_va = c->usermode_gpfifo.gpu_va; + } else { + err = nvgpu_dma_alloc_map_sys(ch_vm, + gpfifo_size * gpfifo_entry_size, + &c->gpfifo.mem); + if (err) { + nvgpu_err(g, "memory allocation failed"); + goto clean_up; + } - if (c->gpfifo.mem.aperture == APERTURE_VIDMEM) { - c->gpfifo.pipe = nvgpu_big_malloc(g, - gpfifo_size * gpfifo_entry_size); - if (!c->gpfifo.pipe) { - err = -ENOMEM; - goto clean_up_unmap; + if (c->gpfifo.mem.aperture == APERTURE_VIDMEM) { + c->gpfifo.pipe = nvgpu_big_malloc(g, + gpfifo_size * gpfifo_entry_size); + if (!c->gpfifo.pipe) { + err = -ENOMEM; + goto clean_up_unmap; + } } + gpfifo_gpu_va = c->gpfifo.mem.gpu_va; } c->gpfifo.entry_num = gpfifo_size; c->gpfifo.get = c->gpfifo.put = 0; nvgpu_log_info(g, "channel %d : gpfifo_base 0x%016llx, size %d", - c->chid, c->gpfifo.mem.gpu_va, c->gpfifo.entry_num); + c->chid, gpfifo_gpu_va, c->gpfifo.entry_num); g->ops.fifo.setup_userd(c); @@ -1169,7 +1173,7 @@ int gk20a_channel_alloc_gpfifo(struct channel_gk20a *c, else acquire_timeout = c->timeout.limit_ms; - err = g->ops.fifo.setup_ramfc(c, c->gpfifo.mem.gpu_va, + err = g->ops.fifo.setup_ramfc(c, gpfifo_gpu_va, c->gpfifo.entry_num, acquire_timeout, gpfifo_args->flags); if (err) @@ -1210,7 +1214,6 @@ clean_up_sync: clean_up_unmap: nvgpu_big_free(g, c->gpfifo.pipe); nvgpu_dma_unmap_free(ch_vm, &c->gpfifo.mem); -clean_up_usermode: if (c->usermode_submit_enabled) { gk20a_channel_free_usermode_buffers(c); c->userd_iova = nvgpu_mem_get_addr(g, &g->fifo.userd) + @@ -1234,6 +1237,8 @@ void gk20a_channel_free_usermode_buffers(struct channel_gk20a *c) { if (nvgpu_mem_is_valid(&c->usermode_userd)) nvgpu_dma_free(c->g, &c->usermode_userd); + if (nvgpu_mem_is_valid(&c->usermode_gpfifo)) + nvgpu_dma_free(c->g, &c->usermode_gpfifo); } /* Update with this periodically to determine how the gpfifo is draining. */ -- cgit v1.2.2