diff options
author | Deepak Bhosale <dbhosale@nvidia.com> | 2018-05-30 16:12:24 -0400 |
---|---|---|
committer | mobile promotions <svcmobile_promotions@nvidia.com> | 2018-06-21 16:56:50 -0400 |
commit | e4e2c1882865163ad53eeaf96acf83802ffbec71 (patch) | |
tree | e433b02a198e6c943397da13c792ba75d0c285a2 /drivers/gpu/nvgpu/os/linux/vgpu/vgpu_linux.c | |
parent | 90fc8d653fba60a6f7b96e7d91ff02361a3a4890 (diff) |
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 <dbhosale@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/1735153
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Richard Zhao <rizhao@nvidia.com>
Reviewed-by: svc-mobile-coverity <svc-mobile-coverity@nvidia.com>
Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
GVS: Gerrit_Virtual_Submit
Reviewed-by: Nirav Patel <nipatel@nvidia.com>
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/os/linux/vgpu/vgpu_linux.c')
-rw-r--r-- | drivers/gpu/nvgpu/os/linux/vgpu/vgpu_linux.c | 36 |
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 | |||
479 | int 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 | |||
495 | int 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 | } | ||