diff --git a/drivers/gpu/nvgpu/common/fifo/priv_cmdbuf.c b/drivers/gpu/nvgpu/common/fifo/priv_cmdbuf.c index 2868ba370..5555c6b9e 100644 --- a/drivers/gpu/nvgpu/common/fifo/priv_cmdbuf.c +++ b/drivers/gpu/nvgpu/common/fifo/priv_cmdbuf.c @@ -30,6 +30,7 @@ #include #include #include +#include struct priv_cmd_queue { struct nvgpu_mem mem; @@ -256,3 +257,24 @@ void nvgpu_priv_cmdbuf_append_zeros(struct gk20a *g, struct priv_cmd_entry *e, 0, entries * sizeof(u32)); e->fill_off += entries; } + +void nvgpu_priv_cmdbuf_finish(struct gk20a *g, struct priv_cmd_entry *e, + u64 *gva, u32 *size) +{ + /* + * The size is written to the pushbuf entry, so make sure this buffer + * is complete at this point. The responsibility of the channel sync is + * to be consistent in allocation and usage, and the matching size and + * add gops (e.g., get_wait_cmd_size, add_wait_cmd) help there. + */ + nvgpu_assert(e->fill_off == e->size); + +#ifdef CONFIG_NVGPU_TRACE + if (e->mem->aperture == APERTURE_SYSMEM) { + trace_gk20a_push_cmdbuf(g->name, 0, e->size, 0, + (u32 *)e->mem->cpu_va + e->off); + } +#endif + *gva = e->gva; + *size = e->size; +} diff --git a/drivers/gpu/nvgpu/common/fifo/submit.c b/drivers/gpu/nvgpu/common/fifo/submit.c index a6d0888b6..09885128a 100644 --- a/drivers/gpu/nvgpu/common/fifo/submit.c +++ b/drivers/gpu/nvgpu/common/fifo/submit.c @@ -199,21 +199,16 @@ static void nvgpu_submit_append_priv_cmdbuf(struct nvgpu_channel *c, struct gk20a *g = c->g; struct nvgpu_mem *gpfifo_mem = &c->gpfifo.mem; struct nvgpu_gpfifo_entry gpfifo_entry; + u64 gva; + u32 size; - g->ops.pbdma.format_gpfifo_entry(g, &gpfifo_entry, - cmd->gva, cmd->size); + nvgpu_priv_cmdbuf_finish(g, cmd, &gva, &size); + g->ops.pbdma.format_gpfifo_entry(g, &gpfifo_entry, gva, size); nvgpu_mem_wr_n(g, gpfifo_mem, c->gpfifo.put * (u32)sizeof(gpfifo_entry), &gpfifo_entry, (u32)sizeof(gpfifo_entry)); -#ifdef CONFIG_NVGPU_TRACE - if (cmd->mem->aperture == APERTURE_SYSMEM) { - trace_gk20a_push_cmdbuf(g->name, 0, cmd->size, 0, - (u32 *)cmd->mem->cpu_va + cmd->off); - } -#endif - c->gpfifo.put = (c->gpfifo.put + 1U) & (c->gpfifo.entry_num - 1U); } diff --git a/drivers/gpu/nvgpu/include/nvgpu/priv_cmdbuf.h b/drivers/gpu/nvgpu/include/nvgpu/priv_cmdbuf.h index 4d9b06d4e..f06954dac 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/priv_cmdbuf.h +++ b/drivers/gpu/nvgpu/include/nvgpu/priv_cmdbuf.h @@ -54,4 +54,7 @@ void nvgpu_priv_cmdbuf_append(struct gk20a *g, struct priv_cmd_entry *e, void nvgpu_priv_cmdbuf_append_zeros(struct gk20a *g, struct priv_cmd_entry *e, u32 entries); +void nvgpu_priv_cmdbuf_finish(struct gk20a *g, struct priv_cmd_entry *e, + u64 *gva, u32 *size); + #endif