summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/os/linux/vgpu/vgpu_linux.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/nvgpu/os/linux/vgpu/vgpu_linux.c')
-rw-r--r--drivers/gpu/nvgpu/os/linux/vgpu/vgpu_linux.c36
1 files changed, 35 insertions, 1 deletions
diff --git a/drivers/gpu/nvgpu/os/linux/vgpu/vgpu_linux.c b/drivers/gpu/nvgpu/os/linux/vgpu/vgpu_linux.c
index a7612e54..25024e7d 100644
--- a/drivers/gpu/nvgpu/os/linux/vgpu/vgpu_linux.c
+++ b/drivers/gpu/nvgpu/os/linux/vgpu/vgpu_linux.c
@@ -147,7 +147,9 @@ int vgpu_pm_prepare_poweroff(struct device *dev)
147 if (!g->power_on) 147 if (!g->power_on)
148 return 0; 148 return 0;
149 149
150 ret = gk20a_channel_suspend(g); 150 if (g->ops.fifo.channel_suspend)
151 ret = g->ops.fifo.channel_suspend(g);
152
151 if (ret) 153 if (ret)
152 return ret; 154 return ret;
153 155
@@ -473,3 +475,35 @@ bool vgpu_is_reduced_bar1(struct gk20a *g)
473 475
474 return resource_size(l->bar1_mem) == (resource_size_t)f->userd.size; 476 return resource_size(l->bar1_mem) == (resource_size_t)f->userd.size;
475} 477}
478
479int vgpu_tegra_suspend(struct device *dev)
480{
481 struct tegra_vgpu_cmd_msg msg = {};
482 struct gk20a *g = get_gk20a(dev);
483 int err = 0;
484
485 msg.cmd = TEGRA_VGPU_CMD_SUSPEND;
486 msg.handle = vgpu_get_handle(g);
487 err = vgpu_comm_sendrecv(&msg, sizeof(msg), sizeof(msg));
488 err = err ? err : msg.ret;
489 if (err)
490 nvgpu_err(g, "vGPU suspend failed\n");
491
492 return err;
493}
494
495int vgpu_tegra_resume(struct device *dev)
496{
497 struct tegra_vgpu_cmd_msg msg = {};
498 struct gk20a *g = get_gk20a(dev);
499 int err = 0;
500
501 msg.cmd = TEGRA_VGPU_CMD_RESUME;
502 msg.handle = vgpu_get_handle(g);
503 err = vgpu_comm_sendrecv(&msg, sizeof(msg), sizeof(msg));
504 err = err ? err : msg.ret;
505 if (err)
506 nvgpu_err(g, "vGPU resume failed\n");
507
508 return err;
509}