From e4e2c1882865163ad53eeaf96acf83802ffbec71 Mon Sep 17 00:00:00 2001 From: Deepak Bhosale Date: Wed, 30 May 2018 13:12:24 -0700 Subject: gpu: nvgpu: suspend/resume support for vGPU - Added suspend/resume power management callbacks for vGPU - Added suspend/resume commands for communication between vGPU and RM server - Added suspend/resume message parameters for IVC messages between vGPU and RM server JIRA EVLR-2305 JIRA EVLR-2306 Change-Id: I83a314b4e125a53117d16c5ea72dbc5d8ef96ef7 Signed-off-by: Deepak Bhosale Reviewed-on: https://git-master.nvidia.com/r/1735153 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Richard Zhao Reviewed-by: svc-mobile-coverity Reviewed-by: Terje Bergstrom GVS: Gerrit_Virtual_Submit Reviewed-by: Nirav Patel Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/os/linux/vgpu/vgpu_linux.c | 36 +++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) (limited to 'drivers/gpu/nvgpu/os/linux/vgpu/vgpu_linux.c') 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) if (!g->power_on) return 0; - ret = gk20a_channel_suspend(g); + if (g->ops.fifo.channel_suspend) + ret = g->ops.fifo.channel_suspend(g); + if (ret) return ret; @@ -473,3 +475,35 @@ bool vgpu_is_reduced_bar1(struct gk20a *g) return resource_size(l->bar1_mem) == (resource_size_t)f->userd.size; } + +int vgpu_tegra_suspend(struct device *dev) +{ + struct tegra_vgpu_cmd_msg msg = {}; + struct gk20a *g = get_gk20a(dev); + int err = 0; + + msg.cmd = TEGRA_VGPU_CMD_SUSPEND; + msg.handle = vgpu_get_handle(g); + err = vgpu_comm_sendrecv(&msg, sizeof(msg), sizeof(msg)); + err = err ? err : msg.ret; + if (err) + nvgpu_err(g, "vGPU suspend failed\n"); + + return err; +} + +int vgpu_tegra_resume(struct device *dev) +{ + struct tegra_vgpu_cmd_msg msg = {}; + struct gk20a *g = get_gk20a(dev); + int err = 0; + + msg.cmd = TEGRA_VGPU_CMD_RESUME; + msg.handle = vgpu_get_handle(g); + err = vgpu_comm_sendrecv(&msg, sizeof(msg), sizeof(msg)); + err = err ? err : msg.ret; + if (err) + nvgpu_err(g, "vGPU resume failed\n"); + + return err; +} -- cgit v1.2.2