diff options
Diffstat (limited to 'drivers/gpu/nvgpu')
-rw-r--r-- | drivers/gpu/nvgpu/common/linux/ioctl_ctrl.c | 55 |
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 | ||
1578 | static 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 | |||
1578 | long gk20a_ctrl_dev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | 1628 | long 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; |