diff options
Diffstat (limited to 'drivers/gpu/nvgpu/vgpu/fifo_vgpu.c')
-rw-r--r-- | drivers/gpu/nvgpu/vgpu/fifo_vgpu.c | 40 |
1 files changed, 25 insertions, 15 deletions
diff --git a/drivers/gpu/nvgpu/vgpu/fifo_vgpu.c b/drivers/gpu/nvgpu/vgpu/fifo_vgpu.c index 5ea6a016..309a395a 100644 --- a/drivers/gpu/nvgpu/vgpu/fifo_vgpu.c +++ b/drivers/gpu/nvgpu/vgpu/fifo_vgpu.c | |||
@@ -461,28 +461,38 @@ static int vgpu_fifo_preempt_tsg(struct gk20a *g, u32 tsgid) | |||
461 | static int vgpu_submit_runlist(struct gk20a *g, u64 handle, u8 runlist_id, | 461 | static int vgpu_submit_runlist(struct gk20a *g, u64 handle, u8 runlist_id, |
462 | u16 *runlist, u32 num_entries) | 462 | u16 *runlist, u32 num_entries) |
463 | { | 463 | { |
464 | struct tegra_vgpu_cmd_msg *msg; | 464 | struct tegra_vgpu_cmd_msg msg; |
465 | struct tegra_vgpu_runlist_params *p; | 465 | struct tegra_vgpu_runlist_params *p; |
466 | size_t size = sizeof(*msg) + sizeof(*runlist) * num_entries; | ||
467 | char *ptr; | ||
468 | int err; | 466 | int err; |
467 | void *oob_handle; | ||
468 | void *oob; | ||
469 | size_t size, oob_size; | ||
470 | |||
471 | oob_handle = tegra_gr_comm_oob_get_ptr(TEGRA_GR_COMM_CTX_CLIENT, | ||
472 | tegra_gr_comm_get_server_vmid(), TEGRA_VGPU_QUEUE_CMD, | ||
473 | &oob, &oob_size); | ||
474 | if (!oob_handle) | ||
475 | return -EINVAL; | ||
476 | |||
477 | size = sizeof(*runlist) * num_entries; | ||
478 | if (oob_size < size) { | ||
479 | err = -ENOMEM; | ||
480 | goto done; | ||
481 | } | ||
469 | 482 | ||
470 | msg = nvgpu_kmalloc(g, size); | 483 | msg.cmd = TEGRA_VGPU_CMD_SUBMIT_RUNLIST; |
471 | if (!msg) | 484 | msg.handle = handle; |
472 | return -1; | 485 | p = &msg.params.runlist; |
473 | |||
474 | msg->cmd = TEGRA_VGPU_CMD_SUBMIT_RUNLIST; | ||
475 | msg->handle = handle; | ||
476 | p = &msg->params.runlist; | ||
477 | p->runlist_id = runlist_id; | 486 | p->runlist_id = runlist_id; |
478 | p->num_entries = num_entries; | 487 | p->num_entries = num_entries; |
479 | 488 | ||
480 | ptr = (char *)msg + sizeof(*msg); | 489 | memcpy(oob, runlist, size); |
481 | memcpy(ptr, runlist, sizeof(*runlist) * num_entries); | 490 | err = vgpu_comm_sendrecv(&msg, sizeof(msg), sizeof(msg)); |
482 | err = vgpu_comm_sendrecv(msg, size, sizeof(*msg)); | 491 | |
492 | err = (err || msg.ret) ? -1 : 0; | ||
483 | 493 | ||
484 | err = (err || msg->ret) ? -1 : 0; | 494 | done: |
485 | nvgpu_kfree(g, msg); | 495 | tegra_gr_comm_oob_put_ptr(oob_handle); |
486 | return err; | 496 | return err; |
487 | } | 497 | } |
488 | 498 | ||