summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/common/fifo/channel.c
diff options
context:
space:
mode:
authorKonsta Holtta <kholtta@nvidia.com>2018-08-27 09:28:25 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2018-08-30 23:11:32 -0400
commit268c298f45cb1bc0beb0b51a3583c803010b2aff (patch)
tree28dcc3cafe9695566802c7ac19e1e9c7169ff35f /drivers/gpu/nvgpu/common/fifo/channel.c
parentbc6625b9b2a2e5ef05cedf0888c28819d3c3f412 (diff)
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 <kholtta@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/1807503 Reviewed-by: svc-misra-checker <svc-misra-checker@nvidia.com> GVS: Gerrit_Virtual_Submit Reviewed-by: Sourab Gupta <sourabg@nvidia.com> Reviewed-by: Deepak Nibade <dnibade@nvidia.com> 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/fifo/channel.c')
-rw-r--r--drivers/gpu/nvgpu/common/fifo/channel.c43
1 files changed, 24 insertions, 19 deletions
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,
1057 struct gk20a *g = c->g; 1057 struct gk20a *g = c->g;
1058 struct vm_gk20a *ch_vm; 1058 struct vm_gk20a *ch_vm;
1059 u32 gpfifo_size, gpfifo_entry_size; 1059 u32 gpfifo_size, gpfifo_entry_size;
1060 u64 gpfifo_gpu_va;
1060 int err = 0; 1061 int err = 0;
1061 unsigned long acquire_timeout; 1062 unsigned long acquire_timeout;
1062 1063
@@ -1097,7 +1098,8 @@ int gk20a_channel_alloc_gpfifo(struct channel_gk20a *c,
1097 } 1098 }
1098 ch_vm = c->vm; 1099 ch_vm = c->vm;
1099 1100
1100 if (c->gpfifo.mem.size) { 1101 if (nvgpu_mem_is_valid(&c->gpfifo.mem) ||
1102 c->usermode_submit_enabled) {
1101 nvgpu_err(g, "channel %d :" 1103 nvgpu_err(g, "channel %d :"
1102 "gpfifo already allocated", c->chid); 1104 "gpfifo already allocated", c->chid);
1103 err = -EEXIST; 1105 err = -EEXIST;
@@ -1120,30 +1122,32 @@ int gk20a_channel_alloc_gpfifo(struct channel_gk20a *c,
1120 err = -EINVAL; 1122 err = -EINVAL;
1121 goto clean_up; 1123 goto clean_up;
1122 } 1124 }
1123 } 1125 gpfifo_gpu_va = c->usermode_gpfifo.gpu_va;
1124 1126 } else {
1125 err = nvgpu_dma_alloc_map_sys(ch_vm, 1127 err = nvgpu_dma_alloc_map_sys(ch_vm,
1126 gpfifo_size * gpfifo_entry_size, 1128 gpfifo_size * gpfifo_entry_size,
1127 &c->gpfifo.mem); 1129 &c->gpfifo.mem);
1128 if (err) { 1130 if (err) {
1129 nvgpu_err(g, "%s: memory allocation failed", __func__); 1131 nvgpu_err(g, "memory allocation failed");
1130 goto clean_up_usermode; 1132 goto clean_up;
1131 } 1133 }
1132 1134
1133 if (c->gpfifo.mem.aperture == APERTURE_VIDMEM) { 1135 if (c->gpfifo.mem.aperture == APERTURE_VIDMEM) {
1134 c->gpfifo.pipe = nvgpu_big_malloc(g, 1136 c->gpfifo.pipe = nvgpu_big_malloc(g,
1135 gpfifo_size * gpfifo_entry_size); 1137 gpfifo_size * gpfifo_entry_size);
1136 if (!c->gpfifo.pipe) { 1138 if (!c->gpfifo.pipe) {
1137 err = -ENOMEM; 1139 err = -ENOMEM;
1138 goto clean_up_unmap; 1140 goto clean_up_unmap;
1141 }
1139 } 1142 }
1143 gpfifo_gpu_va = c->gpfifo.mem.gpu_va;
1140 } 1144 }
1141 1145
1142 c->gpfifo.entry_num = gpfifo_size; 1146 c->gpfifo.entry_num = gpfifo_size;
1143 c->gpfifo.get = c->gpfifo.put = 0; 1147 c->gpfifo.get = c->gpfifo.put = 0;
1144 1148
1145 nvgpu_log_info(g, "channel %d : gpfifo_base 0x%016llx, size %d", 1149 nvgpu_log_info(g, "channel %d : gpfifo_base 0x%016llx, size %d",
1146 c->chid, c->gpfifo.mem.gpu_va, c->gpfifo.entry_num); 1150 c->chid, gpfifo_gpu_va, c->gpfifo.entry_num);
1147 1151
1148 g->ops.fifo.setup_userd(c); 1152 g->ops.fifo.setup_userd(c);
1149 1153
@@ -1169,7 +1173,7 @@ int gk20a_channel_alloc_gpfifo(struct channel_gk20a *c,
1169 else 1173 else
1170 acquire_timeout = c->timeout.limit_ms; 1174 acquire_timeout = c->timeout.limit_ms;
1171 1175
1172 err = g->ops.fifo.setup_ramfc(c, c->gpfifo.mem.gpu_va, 1176 err = g->ops.fifo.setup_ramfc(c, gpfifo_gpu_va,
1173 c->gpfifo.entry_num, 1177 c->gpfifo.entry_num,
1174 acquire_timeout, gpfifo_args->flags); 1178 acquire_timeout, gpfifo_args->flags);
1175 if (err) 1179 if (err)
@@ -1210,7 +1214,6 @@ clean_up_sync:
1210clean_up_unmap: 1214clean_up_unmap:
1211 nvgpu_big_free(g, c->gpfifo.pipe); 1215 nvgpu_big_free(g, c->gpfifo.pipe);
1212 nvgpu_dma_unmap_free(ch_vm, &c->gpfifo.mem); 1216 nvgpu_dma_unmap_free(ch_vm, &c->gpfifo.mem);
1213clean_up_usermode:
1214 if (c->usermode_submit_enabled) { 1217 if (c->usermode_submit_enabled) {
1215 gk20a_channel_free_usermode_buffers(c); 1218 gk20a_channel_free_usermode_buffers(c);
1216 c->userd_iova = nvgpu_mem_get_addr(g, &g->fifo.userd) + 1219 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)
1234{ 1237{
1235 if (nvgpu_mem_is_valid(&c->usermode_userd)) 1238 if (nvgpu_mem_is_valid(&c->usermode_userd))
1236 nvgpu_dma_free(c->g, &c->usermode_userd); 1239 nvgpu_dma_free(c->g, &c->usermode_userd);
1240 if (nvgpu_mem_is_valid(&c->usermode_gpfifo))
1241 nvgpu_dma_free(c->g, &c->usermode_gpfifo);
1237} 1242}
1238 1243
1239/* Update with this periodically to determine how the gpfifo is draining. */ 1244/* Update with this periodically to determine how the gpfifo is draining. */