diff --git a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c index 241e65255..d67324537 100644 --- a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c @@ -5202,11 +5202,24 @@ static int gk20a_gr_handle_class_error(struct gk20a *g, gr_class_error_code_v(gk20a_readl(g, gr_class_error_r())); gk20a_gr_set_error_notifier(g, isr_data, NVGPU_CHANNEL_GR_ERROR_SW_NOTIFY); - nvgpu_err(g, - "class error 0x%08x, offset 0x%08x," - " unhandled intr 0x%08x for channel %u", - isr_data->class_num, isr_data->offset, - gr_class_error, isr_data->chid); + nvgpu_err(g, "class error 0x%08x, offset 0x%08x," + "sub channel 0x%08x mme generated %d," + " mme pc 0x%08xdata high %d priv status %d" + " unhandled intr 0x%08x for channel %u", + isr_data->class_num, (isr_data->offset << 2), + gr_trapped_addr_subch_v(isr_data->addr), + gr_trapped_addr_mme_generated_v(isr_data->addr), + gr_trapped_data_mme_pc_v( + gk20a_readl(g, gr_trapped_data_mme_r())), + gr_trapped_addr_datahigh_v(isr_data->addr), + gr_trapped_addr_priv_v(isr_data->addr), + gr_class_error, isr_data->chid); + + nvgpu_err(g, "trapped data low 0x%08x", + gk20a_readl(g, gr_trapped_data_lo_r())); + if (gr_trapped_addr_datahigh_v(isr_data->addr)) + nvgpu_err(g, "trapped data high 0x%08x", + gk20a_readl(g, gr_trapped_data_hi_r())); return -EINVAL; } diff --git a/drivers/gpu/nvgpu/include/nvgpu/hw/gk20a/hw_gr_gk20a.h b/drivers/gpu/nvgpu/include/nvgpu/hw/gk20a/hw_gr_gk20a.h index f675a619d..ef259bcf1 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/hw/gk20a/hw_gr_gk20a.h +++ b/drivers/gpu/nvgpu/include/nvgpu/hw/gk20a/hw_gr_gk20a.h @@ -268,6 +268,22 @@ static inline u32 gr_trapped_addr_subch_v(u32 r) { return (r >> 16U) & 0x7U; } +static inline u32 gr_trapped_addr_mme_generated_v(u32 r) +{ + return (r >> 20U) & 0x1U; +} +static inline u32 gr_trapped_addr_datahigh_v(u32 r) +{ + return (r >> 24U) & 0x1U; +} +static inline u32 gr_trapped_addr_priv_v(u32 r) +{ + return (r >> 28U) & 0x1U; +} +static inline u32 gr_trapped_addr_status_v(u32 r) +{ + return (r >> 31U) & 0x1U; +} static inline u32 gr_trapped_data_lo_r(void) { return 0x00400708U; @@ -276,6 +292,14 @@ static inline u32 gr_trapped_data_hi_r(void) { return 0x0040070cU; } +static inline u32 gr_trapped_data_mme_r(void) +{ + return 0x00400710U; +} +static inline u32 gr_trapped_data_mme_pc_v(u32 r) +{ + return (r >> 0U) & 0x7ffU; +} static inline u32 gr_status_r(void) { return 0x00400700U; diff --git a/drivers/gpu/nvgpu/include/nvgpu/hw/gm20b/hw_gr_gm20b.h b/drivers/gpu/nvgpu/include/nvgpu/hw/gm20b/hw_gr_gm20b.h index e28775663..d9776b7c7 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/hw/gm20b/hw_gr_gm20b.h +++ b/drivers/gpu/nvgpu/include/nvgpu/hw/gm20b/hw_gr_gm20b.h @@ -256,6 +256,22 @@ static inline u32 gr_trapped_addr_subch_v(u32 r) { return (r >> 16U) & 0x7U; } +static inline u32 gr_trapped_addr_mme_generated_v(u32 r) +{ + return (r >> 20U) & 0x1U; +} +static inline u32 gr_trapped_addr_datahigh_v(u32 r) +{ + return (r >> 24U) & 0x1U; +} +static inline u32 gr_trapped_addr_priv_v(u32 r) +{ + return (r >> 28U) & 0x1U; +} +static inline u32 gr_trapped_addr_status_v(u32 r) +{ + return (r >> 31U) & 0x1U; +} static inline u32 gr_trapped_data_lo_r(void) { return 0x00400708U; @@ -264,6 +280,14 @@ static inline u32 gr_trapped_data_hi_r(void) { return 0x0040070cU; } +static inline u32 gr_trapped_data_mme_r(void) +{ + return 0x00400710U; +} +static inline u32 gr_trapped_data_mme_pc_v(u32 r) +{ + return (r >> 0U) & 0x7ffU; +} static inline u32 gr_status_r(void) { return 0x00400700U; diff --git a/drivers/gpu/nvgpu/include/nvgpu/hw/gp106/hw_gr_gp106.h b/drivers/gpu/nvgpu/include/nvgpu/hw/gp106/hw_gr_gp106.h index aa78c63c7..2da3ec41f 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/hw/gp106/hw_gr_gp106.h +++ b/drivers/gpu/nvgpu/include/nvgpu/hw/gp106/hw_gr_gp106.h @@ -252,6 +252,22 @@ static inline u32 gr_trapped_addr_subch_v(u32 r) { return (r >> 16U) & 0x7U; } +static inline u32 gr_trapped_addr_mme_generated_v(u32 r) +{ + return (r >> 20U) & 0x1U; +} +static inline u32 gr_trapped_addr_datahigh_v(u32 r) +{ + return (r >> 24U) & 0x1U; +} +static inline u32 gr_trapped_addr_priv_v(u32 r) +{ + return (r >> 28U) & 0x1U; +} +static inline u32 gr_trapped_addr_status_v(u32 r) +{ + return (r >> 31U) & 0x1U; +} static inline u32 gr_trapped_data_lo_r(void) { return 0x00400708U; @@ -260,6 +276,14 @@ static inline u32 gr_trapped_data_hi_r(void) { return 0x0040070cU; } +static inline u32 gr_trapped_data_mme_r(void) +{ + return 0x00400710U; +} +static inline u32 gr_trapped_data_mme_pc_v(u32 r) +{ + return (r >> 0U) & 0xfffU; +} static inline u32 gr_status_r(void) { return 0x00400700U; diff --git a/drivers/gpu/nvgpu/include/nvgpu/hw/gp10b/hw_gr_gp10b.h b/drivers/gpu/nvgpu/include/nvgpu/hw/gp10b/hw_gr_gp10b.h index 27760a73c..51809112c 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/hw/gp10b/hw_gr_gp10b.h +++ b/drivers/gpu/nvgpu/include/nvgpu/hw/gp10b/hw_gr_gp10b.h @@ -256,6 +256,22 @@ static inline u32 gr_trapped_addr_subch_v(u32 r) { return (r >> 16U) & 0x7U; } +static inline u32 gr_trapped_addr_mme_generated_v(u32 r) +{ + return (r >> 20U) & 0x1U; +} +static inline u32 gr_trapped_addr_datahigh_v(u32 r) +{ + return (r >> 24U) & 0x1U; +} +static inline u32 gr_trapped_addr_priv_v(u32 r) +{ + return (r >> 28U) & 0x1U; +} +static inline u32 gr_trapped_addr_status_v(u32 r) +{ + return (r >> 31U) & 0x1U; +} static inline u32 gr_trapped_data_lo_r(void) { return 0x00400708U; @@ -264,6 +280,14 @@ static inline u32 gr_trapped_data_hi_r(void) { return 0x0040070cU; } +static inline u32 gr_trapped_data_mme_r(void) +{ + return 0x00400710U; +} +static inline u32 gr_trapped_data_mme_pc_v(u32 r) +{ + return (r >> 0U) & 0xfffU; +} static inline u32 gr_status_r(void) { return 0x00400700U;