diff options
Diffstat (limited to 'drivers/gpu/nvgpu')
-rw-r--r-- | drivers/gpu/nvgpu/common/fifo/channel.c | 43 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/common/fifo/submit.c | 8 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/channel_gk20a.h | 1 |
3 files changed, 29 insertions, 23 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: | |||
1210 | clean_up_unmap: | 1214 | clean_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); |
1213 | clean_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. */ |
diff --git a/drivers/gpu/nvgpu/common/fifo/submit.c b/drivers/gpu/nvgpu/common/fifo/submit.c index e0f31233..56512894 100644 --- a/drivers/gpu/nvgpu/common/fifo/submit.c +++ b/drivers/gpu/nvgpu/common/fifo/submit.c | |||
@@ -341,14 +341,14 @@ static int nvgpu_submit_channel_gpfifo(struct channel_gk20a *c, | |||
341 | return -ETIMEDOUT; | 341 | return -ETIMEDOUT; |
342 | } | 342 | } |
343 | 343 | ||
344 | if (!nvgpu_mem_is_valid(&c->gpfifo.mem)) { | ||
345 | return -ENOMEM; | ||
346 | } | ||
347 | |||
348 | if (c->usermode_submit_enabled) { | 344 | if (c->usermode_submit_enabled) { |
349 | return -EINVAL; | 345 | return -EINVAL; |
350 | } | 346 | } |
351 | 347 | ||
348 | if (!nvgpu_mem_is_valid(&c->gpfifo.mem)) { | ||
349 | return -ENOMEM; | ||
350 | } | ||
351 | |||
352 | /* fifo not large enough for request. Return error immediately. | 352 | /* fifo not large enough for request. Return error immediately. |
353 | * Kernel can insert gpfifo entries before and after user gpfifos. | 353 | * Kernel can insert gpfifo entries before and after user gpfifos. |
354 | * So, add extra_entries in user request. Also, HW with fifo size N | 354 | * So, add extra_entries in user request. Also, HW with fifo size N |
diff --git a/drivers/gpu/nvgpu/gk20a/channel_gk20a.h b/drivers/gpu/nvgpu/gk20a/channel_gk20a.h index a6e0d31a..f7515294 100644 --- a/drivers/gpu/nvgpu/gk20a/channel_gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/channel_gk20a.h | |||
@@ -228,6 +228,7 @@ struct channel_gk20a { | |||
228 | struct gpfifo_desc gpfifo; | 228 | struct gpfifo_desc gpfifo; |
229 | 229 | ||
230 | struct nvgpu_mem usermode_userd; /* Used for Usermode Submission */ | 230 | struct nvgpu_mem usermode_userd; /* Used for Usermode Submission */ |
231 | struct nvgpu_mem usermode_gpfifo; | ||
231 | struct nvgpu_mem inst_block; | 232 | struct nvgpu_mem inst_block; |
232 | 233 | ||
233 | u64 userd_iova; | 234 | u64 userd_iova; |