summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/common/linux/ioctl_ctrl.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/nvgpu/common/linux/ioctl_ctrl.c')
-rw-r--r--drivers/gpu/nvgpu/common/linux/ioctl_ctrl.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/common/linux/ioctl_ctrl.c b/drivers/gpu/nvgpu/common/linux/ioctl_ctrl.c
index b40efc0f..ee0739c9 100644
--- a/drivers/gpu/nvgpu/common/linux/ioctl_ctrl.c
+++ b/drivers/gpu/nvgpu/common/linux/ioctl_ctrl.c
@@ -1575,6 +1575,56 @@ out:
1575 return err; 1575 return err;
1576} 1576}
1577 1577
1578static int nvgpu_gpu_read_single_sm_error_state(struct gk20a *g,
1579 struct nvgpu_gpu_read_single_sm_error_state_args *args)
1580{
1581 struct gr_gk20a *gr = &g->gr;
1582 struct nvgpu_gr_sm_error_state *sm_error_state;
1583 struct nvgpu_gpu_sm_error_state_record sm_error_state_record;
1584 u32 sm_id;
1585 int err = 0;
1586
1587 sm_id = args->sm_id;
1588 if (sm_id >= gr->no_of_sm)
1589 return -EINVAL;
1590
1591 nvgpu_speculation_barrier();
1592
1593 sm_error_state = gr->sm_error_states + sm_id;
1594 sm_error_state_record.global_esr =
1595 sm_error_state->hww_global_esr;
1596 sm_error_state_record.warp_esr =
1597 sm_error_state->hww_warp_esr;
1598 sm_error_state_record.warp_esr_pc =
1599 sm_error_state->hww_warp_esr_pc;
1600 sm_error_state_record.global_esr_report_mask =
1601 sm_error_state->hww_global_esr_report_mask;
1602 sm_error_state_record.warp_esr_report_mask =
1603 sm_error_state->hww_warp_esr_report_mask;
1604
1605 if (args->record_size > 0) {
1606 size_t write_size = sizeof(*sm_error_state);
1607
1608 if (write_size > args->record_size)
1609 write_size = args->record_size;
1610
1611 nvgpu_mutex_acquire(&g->dbg_sessions_lock);
1612 err = copy_to_user((void __user *)(uintptr_t)
1613 args->record_mem,
1614 &sm_error_state_record,
1615 write_size);
1616 nvgpu_mutex_release(&g->dbg_sessions_lock);
1617 if (err) {
1618 nvgpu_err(g, "copy_to_user failed!");
1619 return err;
1620 }
1621
1622 args->record_size = write_size;
1623 }
1624
1625 return 0;
1626}
1627
1578long gk20a_ctrl_dev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) 1628long gk20a_ctrl_dev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
1579{ 1629{
1580 struct gk20a_ctrl_priv *priv = filp->private_data; 1630 struct gk20a_ctrl_priv *priv = filp->private_data;
@@ -1887,6 +1937,11 @@ long gk20a_ctrl_dev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg
1887 (struct nvgpu_gpu_set_deterministic_opts_args *)buf); 1937 (struct nvgpu_gpu_set_deterministic_opts_args *)buf);
1888 break; 1938 break;
1889 1939
1940 case NVGPU_GPU_IOCTL_READ_SINGLE_SM_ERROR_STATE:
1941 err = nvgpu_gpu_read_single_sm_error_state(g,
1942 (struct nvgpu_gpu_read_single_sm_error_state_args *)buf);
1943 break;
1944
1890 default: 1945 default:
1891 nvgpu_log_info(g, "unrecognized gpu ioctl cmd: 0x%x", cmd); 1946 nvgpu_log_info(g, "unrecognized gpu ioctl cmd: 0x%x", cmd);
1892 err = -ENOTTY; 1947 err = -ENOTTY;