summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/os/linux/ioctl_tsg.c
diff options
context:
space:
mode:
authorPreetham Chandru Ramchandra <pchandru@nvidia.com>2018-08-13 05:37:26 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2018-08-14 05:00:02 -0400
commit7306f2b13106a2464fcc83493554368d31ba2d44 (patch)
treeb91d40cc522b1679151dda5f0f988a4fd80abf96 /drivers/gpu/nvgpu/os/linux/ioctl_tsg.c
parent2328d305b7c9437aa467922086b9fcfc0a4169ba (diff)
gpu: nvpgu: unpowergate GPU in ioctl_tsg_open()
The nvgpu_ioctl_tsg_open() does not make sure that GPU is unpowergated. Due to this it leads to kernel panic when GPU registers are accessed when powergated. __gk20a_warn_on_no_regs+0x38/0x58 [nvgpu] __nvgpu_readl+0x74/0xc8 [nvgpu] nvgpu_readl+0x28/0x60 [nvgpu] xxxxx_ce_get_num_pce+0x28/0x70 [nvgpu] xxxxx_fifo_init_eng_method_buffers+0x64/0x1c0 [nvgpu] gk20a_tsg_open+0x110/0x1e0 [nvgpu] nvgpu_ioctl_tsg_open+0x88/0x100 [nvgpu] gk20a_ctrl_dev_ioctl+0x734/0x2388 [nvgpu] do_vfs_ioctl+0xc4/0x918 SyS_ioctl+0x94/0xa8 This change fixes this issue by calling gk20a_busy()/gk20a_idle() in nvgpu_ioctl_tsg_open() Bug 2268533 JIRA NVGPU-1016 Change-Id: I578289e7eb60295d6b6169b754a5cc60f7546fd5 Signed-off-by: Preetham Chandru Ramchandra <pchandru@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/1794324 Reviewed-by: Seshendra Gadagottu <sgadagottu@nvidia.com> GVS: Gerrit_Virtual_Submit Reviewed-by: Deepak Nibade <dnibade@nvidia.com> Reviewed-by: Vijayakumar Subbu <vsubbu@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/ioctl_tsg.c')
-rw-r--r--drivers/gpu/nvgpu/os/linux/ioctl_tsg.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/os/linux/ioctl_tsg.c b/drivers/gpu/nvgpu/os/linux/ioctl_tsg.c
index 4ef99ded..5d22d082 100644
--- a/drivers/gpu/nvgpu/os/linux/ioctl_tsg.c
+++ b/drivers/gpu/nvgpu/os/linux/ioctl_tsg.c
@@ -399,7 +399,14 @@ int nvgpu_ioctl_tsg_open(struct gk20a *g, struct file *filp)
399 goto free_ref; 399 goto free_ref;
400 } 400 }
401 401
402 err = gk20a_busy(g);
403 if (err) {
404 nvgpu_err(g, "failed to power on, %d", err);
405 goto free_ref;
406 }
407
402 tsg = gk20a_tsg_open(g, nvgpu_current_pid(g)); 408 tsg = gk20a_tsg_open(g, nvgpu_current_pid(g));
409 gk20a_idle(g);
403 if (!tsg) { 410 if (!tsg) {
404 nvgpu_kfree(g, priv); 411 nvgpu_kfree(g, priv);
405 err = -ENOMEM; 412 err = -ENOMEM;