summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c
diff options
context:
space:
mode:
authorDeepak Nibade <dnibade@nvidia.com>2015-12-24 08:11:15 -0500
committerTerje Bergstrom <tbergstrom@nvidia.com>2016-04-19 11:07:22 -0400
commitc651adbeaacf063b856ef8126b74661b54066477 (patch)
treec402810943925ae5fa4ed824e33943259efc74b0 /drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c
parent04e45bc943e9703c26f229dfbe558d94418acbe1 (diff)
gpu; nvgpu: IOCTL to write/clear SM error states
Add below IOCTLs to write/clear SM error states NVGPU_DBG_GPU_IOCTL_CLEAR_SINGLE_SM_ERROR_STATE NVGPU_DBG_GPU_IOCTL_WRITE_SINGLE_SM_ERROR_STATE Bug 200156699 Change-Id: I89e3ec51c33b8e131a67d28807d5acf57b3a48fd Signed-off-by: Deepak Nibade <dnibade@nvidia.com> Reviewed-on: http://git-master/r/1120330 Reviewed-by: Automatic_Commit_Validation_User GVS: Gerrit_Virtual_Submit Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c90
1 files changed, 90 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c b/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c
index d9c96417..f717e207 100644
--- a/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c
@@ -564,6 +564,86 @@ static int nvgpu_dbg_gpu_ioctl_read_single_sm_error_state(
564 return 0; 564 return 0;
565} 565}
566 566
567static int nvgpu_dbg_gpu_ioctl_clear_single_sm_error_state(
568 struct dbg_session_gk20a *dbg_s,
569 struct nvgpu_dbg_gpu_clear_single_sm_error_state_args *args)
570{
571 struct gk20a *g = get_gk20a(dbg_s->dev);
572 struct gr_gk20a *gr = &g->gr;
573 u32 sm_id;
574 struct channel_gk20a *ch = dbg_s->ch;
575 int err = 0;
576
577 sm_id = args->sm_id;
578
579 if (sm_id >= gr->no_of_sm)
580 return -EINVAL;
581
582 err = gk20a_busy(g->dev);
583 if (err)
584 return err;
585
586 err = gr_gk20a_elpg_protected_call(g,
587 g->ops.gr.clear_sm_error_state(g, ch, sm_id));
588
589 gk20a_idle(g->dev);
590
591 return err;
592}
593
594static int nvgpu_dbg_gpu_ioctl_write_single_sm_error_state(
595 struct dbg_session_gk20a *dbg_s,
596 struct nvgpu_dbg_gpu_write_single_sm_error_state_args *args)
597{
598 struct gk20a *g = get_gk20a(dbg_s->dev);
599 struct gr_gk20a *gr = &g->gr;
600 u32 sm_id;
601 struct channel_gk20a *ch = dbg_s->ch;
602 struct nvgpu_dbg_gpu_sm_error_state_record *sm_error_state;
603 int err = 0;
604
605 sm_id = args->sm_id;
606 if (sm_id >= gr->no_of_sm)
607 return -EINVAL;
608
609 sm_error_state = kzalloc(sizeof(*sm_error_state), GFP_KERNEL);
610 if (!sm_error_state)
611 return -ENOMEM;
612
613 if (args->sm_error_state_record_size > 0) {
614 size_t read_size = sizeof(*sm_error_state);
615
616 if (read_size > args->sm_error_state_record_size)
617 read_size = args->sm_error_state_record_size;
618
619 mutex_lock(&g->dbg_sessions_lock);
620 err = copy_from_user(sm_error_state,
621 (void __user *)(uintptr_t)
622 args->sm_error_state_record_mem,
623 read_size);
624 mutex_unlock(&g->dbg_sessions_lock);
625 if (err) {
626 err = -ENOMEM;
627 goto err_free;
628 }
629 }
630
631 err = gk20a_busy(g->dev);
632 if (err)
633 goto err_free;
634
635 err = gr_gk20a_elpg_protected_call(g,
636 g->ops.gr.update_sm_error_state(g, ch,
637 sm_id, sm_error_state));
638
639 gk20a_idle(g->dev);
640
641err_free:
642 kfree(sm_error_state);
643
644 return err;
645}
646
567long gk20a_dbg_gpu_dev_ioctl(struct file *filp, unsigned int cmd, 647long gk20a_dbg_gpu_dev_ioctl(struct file *filp, unsigned int cmd,
568 unsigned long arg) 648 unsigned long arg)
569{ 649{
@@ -666,6 +746,16 @@ long gk20a_dbg_gpu_dev_ioctl(struct file *filp, unsigned int cmd,
666 (struct nvgpu_dbg_gpu_read_single_sm_error_state_args *)buf); 746 (struct nvgpu_dbg_gpu_read_single_sm_error_state_args *)buf);
667 break; 747 break;
668 748
749 case NVGPU_DBG_GPU_IOCTL_CLEAR_SINGLE_SM_ERROR_STATE:
750 err = nvgpu_dbg_gpu_ioctl_clear_single_sm_error_state(dbg_s,
751 (struct nvgpu_dbg_gpu_clear_single_sm_error_state_args *)buf);
752 break;
753
754 case NVGPU_DBG_GPU_IOCTL_WRITE_SINGLE_SM_ERROR_STATE:
755 err = nvgpu_dbg_gpu_ioctl_write_single_sm_error_state(dbg_s,
756 (struct nvgpu_dbg_gpu_write_single_sm_error_state_args *)buf);
757 break;
758
669 default: 759 default:
670 gk20a_err(dev_from_gk20a(g), 760 gk20a_err(dev_from_gk20a(g),
671 "unrecognized dbg gpu ioctl cmd: 0x%x", 761 "unrecognized dbg gpu ioctl cmd: 0x%x",