diff options
author | Deepak Nibade <dnibade@nvidia.com> | 2015-12-24 08:11:15 -0500 |
---|---|---|
committer | Terje Bergstrom <tbergstrom@nvidia.com> | 2016-04-19 11:07:22 -0400 |
commit | c651adbeaacf063b856ef8126b74661b54066477 (patch) | |
tree | c402810943925ae5fa4ed824e33943259efc74b0 /drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c | |
parent | 04e45bc943e9703c26f229dfbe558d94418acbe1 (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.c | 90 |
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 | ||
567 | static 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 | |||
594 | static 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 | |||
641 | err_free: | ||
642 | kfree(sm_error_state); | ||
643 | |||
644 | return err; | ||
645 | } | ||
646 | |||
567 | long gk20a_dbg_gpu_dev_ioctl(struct file *filp, unsigned int cmd, | 647 | long 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", |