summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
diff options
context:
space:
mode:
authorTerje Bergstrom <tbergstrom@nvidia.com>2014-08-01 09:15:54 -0400
committerDan Willemsen <dwillemsen@nvidia.com>2015-03-18 15:10:44 -0400
commitc8faa10d1dc9bb0c4c2815c38fb71d8acdd1108d (patch)
tree35c863226423d9c8506a149e487266c8e119f7e2 /drivers/gpu/nvgpu/gk20a/gr_gk20a.c
parent0858498f7b615467af33c4268fd0c0ac7fe19788 (diff)
gpu: nvgpu: Add support for FECS errors
Add retrieving error code for FECS errors. Change-Id: I7d9dfc4723376272edb2e5b2ef06f71de1a06889 Signed-off-by: Terje Bergstrom <tbergstrom@nvidia.com> Reviewed-on: http://git-master/r/450351 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Chris Dragan <kdragan@nvidia.com> Tested-by: Chris Dragan <kdragan@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/gr_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/gr_gk20a.c30
1 files changed, 27 insertions, 3 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
index e783f8d0..c12ab1f6 100644
--- a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
@@ -4995,14 +4995,21 @@ static int gk20a_gr_handle_fecs_error(struct gk20a *g,
4995{ 4995{
4996 struct fifo_gk20a *f = &g->fifo; 4996 struct fifo_gk20a *f = &g->fifo;
4997 struct channel_gk20a *ch = &f->channel[isr_data->chid]; 4997 struct channel_gk20a *ch = &f->channel[isr_data->chid];
4998 u32 gr_fecs_intr = gk20a_readl(g, gr_fecs_intr_r()); 4998 u32 gr_fecs_intr = gk20a_readl(g, gr_fecs_host_int_status_r());
4999 gk20a_dbg_fn(""); 4999 gk20a_dbg_fn("");
5000 5000
5001 gk20a_err(dev_from_gk20a(g), 5001 gk20a_err(dev_from_gk20a(g),
5002 "unhandled fecs error interrupt 0x%08x for channel %u", 5002 "unhandled fecs error interrupt 0x%08x for channel %u",
5003 gr_fecs_intr, ch->hw_chid); 5003 gr_fecs_intr, ch->hw_chid);
5004 5004
5005 gk20a_writel(g, gr_fecs_intr_r(), gr_fecs_intr); 5005 if (gr_fecs_intr & gr_fecs_host_int_status_umimp_firmware_method_f(1)) {
5006 gk20a_err(dev_from_gk20a(g),
5007 "firmware method error 0x%08x for offset 0x%04x",
5008 gk20a_readl(g, gr_fecs_ctxsw_mailbox_r(6)),
5009 isr_data->data_lo);
5010 }
5011
5012 gk20a_writel(g, gr_fecs_host_int_clear_r(), gr_fecs_intr);
5006 return -EINVAL; 5013 return -EINVAL;
5007} 5014}
5008 5015
@@ -5024,6 +5031,23 @@ static int gk20a_gr_handle_class_error(struct gk20a *g,
5024 return -EINVAL; 5031 return -EINVAL;
5025} 5032}
5026 5033
5034static int gk20a_gr_handle_firmware_method(struct gk20a *g,
5035 struct gr_isr_data *isr_data)
5036{
5037 struct fifo_gk20a *f = &g->fifo;
5038 struct channel_gk20a *ch = &f->channel[isr_data->chid];
5039
5040 gk20a_dbg_fn("");
5041
5042 gk20a_set_error_notifier(ch,
5043 NVHOST_CHANNEL_GR_ERROR_SW_NOTIFY);
5044 gk20a_err(dev_from_gk20a(g),
5045 "firmware method 0x%08x, offset 0x%08x for channel %u\n",
5046 isr_data->class_num, isr_data->offset,
5047 ch->hw_chid);
5048 return -EINVAL;
5049}
5050
5027static int gk20a_gr_handle_semaphore_pending(struct gk20a *g, 5051static int gk20a_gr_handle_semaphore_pending(struct gk20a *g,
5028 struct gr_isr_data *isr_data) 5052 struct gr_isr_data *isr_data)
5029{ 5053{
@@ -5513,7 +5537,7 @@ int gk20a_gr_isr(struct gk20a *g)
5513 /* this one happens if someone tries to hit a non-whitelisted 5537 /* this one happens if someone tries to hit a non-whitelisted
5514 * register using set_falcon[4] */ 5538 * register using set_falcon[4] */
5515 if (gr_intr & gr_intr_firmware_method_pending_f()) { 5539 if (gr_intr & gr_intr_firmware_method_pending_f()) {
5516 need_reset |= true; 5540 need_reset |= gk20a_gr_handle_firmware_method(g, &isr_data);
5517 gk20a_dbg(gpu_dbg_intr | gpu_dbg_gpu_dbg, "firmware method intr pending\n"); 5541 gk20a_dbg(gpu_dbg_intr | gpu_dbg_gpu_dbg, "firmware method intr pending\n");
5518 gk20a_writel(g, gr_intr_r(), 5542 gk20a_writel(g, gr_intr_r(),
5519 gr_intr_firmware_method_reset_f()); 5543 gr_intr_firmware_method_reset_f());