diff options
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/channel_gk20a.c')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/channel_gk20a.c | 40 |
1 files changed, 39 insertions, 1 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/channel_gk20a.c b/drivers/gpu/nvgpu/gk20a/channel_gk20a.c index 83c49d52..a68968fe 100644 --- a/drivers/gpu/nvgpu/gk20a/channel_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/channel_gk20a.c | |||
@@ -376,6 +376,13 @@ static void gk20a_free_channel(struct channel_gk20a *ch, bool force) | |||
376 | if(g->ops.fifo.free_channel_ctx_header) | 376 | if(g->ops.fifo.free_channel_ctx_header) |
377 | g->ops.fifo.free_channel_ctx_header(ch); | 377 | g->ops.fifo.free_channel_ctx_header(ch); |
378 | 378 | ||
379 | if (ch->usermode_submit_enabled) { | ||
380 | gk20a_channel_free_usermode_buffers(ch); | ||
381 | ch->userd_iova = nvgpu_mem_get_addr(g, &f->userd) + | ||
382 | ch->chid * f->userd_entry_size; | ||
383 | ch->usermode_submit_enabled = false; | ||
384 | } | ||
385 | |||
379 | gk20a_gr_flush_channel_tlb(gr); | 386 | gk20a_gr_flush_channel_tlb(gr); |
380 | 387 | ||
381 | nvgpu_dma_unmap_free(ch_vm, &ch->gpfifo.mem); | 388 | nvgpu_dma_unmap_free(ch_vm, &ch->gpfifo.mem); |
@@ -1086,12 +1093,30 @@ int gk20a_channel_alloc_gpfifo(struct channel_gk20a *c, | |||
1086 | goto clean_up_idle; | 1093 | goto clean_up_idle; |
1087 | } | 1094 | } |
1088 | 1095 | ||
1096 | if (gpfifo_args->flags & NVGPU_GPFIFO_FLAGS_USERMODE_SUPPORT) { | ||
1097 | if (g->ops.fifo.alloc_usermode_buffers) { | ||
1098 | err = g->ops.fifo.alloc_usermode_buffers(c, | ||
1099 | gpfifo_args); | ||
1100 | if (err) { | ||
1101 | nvgpu_err(g, "Usermode buffer alloc failed"); | ||
1102 | goto clean_up; | ||
1103 | } | ||
1104 | c->userd_iova = nvgpu_mem_get_addr(g, | ||
1105 | &c->usermode_userd); | ||
1106 | c->usermode_submit_enabled = true; | ||
1107 | } else { | ||
1108 | nvgpu_err(g, "Usermode submit not supported"); | ||
1109 | err = -EINVAL; | ||
1110 | goto clean_up; | ||
1111 | } | ||
1112 | } | ||
1113 | |||
1089 | err = nvgpu_dma_alloc_map_sys(ch_vm, | 1114 | err = nvgpu_dma_alloc_map_sys(ch_vm, |
1090 | gpfifo_size * gpfifo_entry_size, | 1115 | gpfifo_size * gpfifo_entry_size, |
1091 | &c->gpfifo.mem); | 1116 | &c->gpfifo.mem); |
1092 | if (err) { | 1117 | if (err) { |
1093 | nvgpu_err(g, "%s: memory allocation failed", __func__); | 1118 | nvgpu_err(g, "%s: memory allocation failed", __func__); |
1094 | goto clean_up; | 1119 | goto clean_up_usermode; |
1095 | } | 1120 | } |
1096 | 1121 | ||
1097 | if (c->gpfifo.mem.aperture == APERTURE_VIDMEM || g->mm.force_pramin) { | 1122 | if (c->gpfifo.mem.aperture == APERTURE_VIDMEM || g->mm.force_pramin) { |
@@ -1174,6 +1199,13 @@ clean_up_sync: | |||
1174 | clean_up_unmap: | 1199 | clean_up_unmap: |
1175 | nvgpu_big_free(g, c->gpfifo.pipe); | 1200 | nvgpu_big_free(g, c->gpfifo.pipe); |
1176 | nvgpu_dma_unmap_free(ch_vm, &c->gpfifo.mem); | 1201 | nvgpu_dma_unmap_free(ch_vm, &c->gpfifo.mem); |
1202 | clean_up_usermode: | ||
1203 | if (c->usermode_submit_enabled) { | ||
1204 | gk20a_channel_free_usermode_buffers(c); | ||
1205 | c->userd_iova = nvgpu_mem_get_addr(g, &g->fifo.userd) + | ||
1206 | c->chid * g->fifo.userd_entry_size; | ||
1207 | c->usermode_submit_enabled = false; | ||
1208 | } | ||
1177 | clean_up: | 1209 | clean_up: |
1178 | memset(&c->gpfifo, 0, sizeof(struct gpfifo_desc)); | 1210 | memset(&c->gpfifo, 0, sizeof(struct gpfifo_desc)); |
1179 | clean_up_idle: | 1211 | clean_up_idle: |
@@ -1187,6 +1219,12 @@ clean_up_idle: | |||
1187 | return err; | 1219 | return err; |
1188 | } | 1220 | } |
1189 | 1221 | ||
1222 | void gk20a_channel_free_usermode_buffers(struct channel_gk20a *c) | ||
1223 | { | ||
1224 | if (nvgpu_mem_is_valid(&c->usermode_userd)) | ||
1225 | nvgpu_dma_free(c->g, &c->usermode_userd); | ||
1226 | } | ||
1227 | |||
1190 | /* Update with this periodically to determine how the gpfifo is draining. */ | 1228 | /* Update with this periodically to determine how the gpfifo is draining. */ |
1191 | static inline u32 update_gp_get(struct gk20a *g, | 1229 | static inline u32 update_gp_get(struct gk20a *g, |
1192 | struct channel_gk20a *c) | 1230 | struct channel_gk20a *c) |