diff options
Diffstat (limited to 'drivers/gpu/nvgpu/os/linux')
-rw-r--r-- | drivers/gpu/nvgpu/os/linux/ioctl_ctrl.c | 13 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/os/linux/module.c | 5 |
2 files changed, 16 insertions, 2 deletions
diff --git a/drivers/gpu/nvgpu/os/linux/ioctl_ctrl.c b/drivers/gpu/nvgpu/os/linux/ioctl_ctrl.c index 227a7d57..3ccc6b0a 100644 --- a/drivers/gpu/nvgpu/os/linux/ioctl_ctrl.c +++ b/drivers/gpu/nvgpu/os/linux/ioctl_ctrl.c | |||
@@ -568,19 +568,28 @@ static int gk20a_ctrl_get_fbp_l2_masks( | |||
568 | static int nvgpu_gpu_ioctl_l2_fb_ops(struct gk20a *g, | 568 | static int nvgpu_gpu_ioctl_l2_fb_ops(struct gk20a *g, |
569 | struct nvgpu_gpu_l2_fb_args *args) | 569 | struct nvgpu_gpu_l2_fb_args *args) |
570 | { | 570 | { |
571 | int err = 0; | 571 | int ret = 0; |
572 | 572 | ||
573 | if ((!args->l2_flush && !args->fb_flush) || | 573 | if ((!args->l2_flush && !args->fb_flush) || |
574 | (!args->l2_flush && args->l2_invalidate)) | 574 | (!args->l2_flush && args->l2_invalidate)) |
575 | return -EINVAL; | 575 | return -EINVAL; |
576 | 576 | ||
577 | ret = gk20a_busy_try_noresume(g); | ||
578 | |||
579 | /* return if device is already powered off */ | ||
580 | if (ret == 0) | ||
581 | return 0; | ||
582 | |||
577 | if (args->l2_flush) | 583 | if (args->l2_flush) |
578 | g->ops.mm.l2_flush(g, args->l2_invalidate ? true : false); | 584 | g->ops.mm.l2_flush(g, args->l2_invalidate ? true : false); |
579 | 585 | ||
580 | if (args->fb_flush) | 586 | if (args->fb_flush) |
581 | g->ops.mm.fb_flush(g); | 587 | g->ops.mm.fb_flush(g); |
582 | 588 | ||
583 | return err; | 589 | if (ret > 0) |
590 | gk20a_idle_nosuspend(g); | ||
591 | |||
592 | return 0; | ||
584 | } | 593 | } |
585 | 594 | ||
586 | static int nvgpu_gpu_ioctl_set_mmu_debug_mode( | 595 | static int nvgpu_gpu_ioctl_set_mmu_debug_mode( |
diff --git a/drivers/gpu/nvgpu/os/linux/module.c b/drivers/gpu/nvgpu/os/linux/module.c index c453bced..964fc651 100644 --- a/drivers/gpu/nvgpu/os/linux/module.c +++ b/drivers/gpu/nvgpu/os/linux/module.c | |||
@@ -109,6 +109,11 @@ void gk20a_busy_noresume(struct gk20a *g) | |||
109 | pm_runtime_get_noresume(dev_from_gk20a(g)); | 109 | pm_runtime_get_noresume(dev_from_gk20a(g)); |
110 | } | 110 | } |
111 | 111 | ||
112 | int gk20a_busy_try_noresume(struct gk20a *g) | ||
113 | { | ||
114 | return pm_runtime_get_if_in_use(dev_from_gk20a(g)); | ||
115 | } | ||
116 | |||
112 | /* | 117 | /* |
113 | * Check if the device can go busy. | 118 | * Check if the device can go busy. |
114 | */ | 119 | */ |