summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/nvgpu/include/nvgpu/vgpu/tegra_vgpu.h7
-rw-r--r--drivers/gpu/nvgpu/vgpu/vgpu.c18
2 files changed, 25 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/include/nvgpu/vgpu/tegra_vgpu.h b/drivers/gpu/nvgpu/include/nvgpu/vgpu/tegra_vgpu.h
index 43a6d079..ba7d2ba2 100644
--- a/drivers/gpu/nvgpu/include/nvgpu/vgpu/tegra_vgpu.h
+++ b/drivers/gpu/nvgpu/include/nvgpu/vgpu/tegra_vgpu.h
@@ -714,6 +714,11 @@ struct tegra_vgpu_channel_cleanup {
714 u32 chid; 714 u32 chid;
715}; 715};
716 716
717struct tegra_vgpu_channel_set_error_notifier {
718 u32 chid;
719 u32 error;
720};
721
717enum { 722enum {
718 723
719 TEGRA_VGPU_INTR_GR = 0, 724 TEGRA_VGPU_INTR_GR = 0,
@@ -732,6 +737,7 @@ enum {
732 TEGRA_VGPU_EVENT_SM_ESR = 4, 737 TEGRA_VGPU_EVENT_SM_ESR = 4,
733 TEGRA_VGPU_EVENT_SEMAPHORE_WAKEUP = 5, 738 TEGRA_VGPU_EVENT_SEMAPHORE_WAKEUP = 5,
734 TEGRA_VGPU_EVENT_CHANNEL_CLEANUP = 6, 739 TEGRA_VGPU_EVENT_CHANNEL_CLEANUP = 6,
740 TEGRA_VGPU_EVENT_SET_ERROR_NOTIFIER = 7,
735}; 741};
736 742
737struct tegra_vgpu_intr_msg { 743struct tegra_vgpu_intr_msg {
@@ -748,6 +754,7 @@ struct tegra_vgpu_intr_msg {
748 struct tegra_vgpu_sm_esr_info sm_esr; 754 struct tegra_vgpu_sm_esr_info sm_esr;
749 struct tegra_vgpu_semaphore_wakeup sem_wakeup; 755 struct tegra_vgpu_semaphore_wakeup sem_wakeup;
750 struct tegra_vgpu_channel_cleanup ch_cleanup; 756 struct tegra_vgpu_channel_cleanup ch_cleanup;
757 struct tegra_vgpu_channel_set_error_notifier set_error_notifier;
751 char padding[32]; 758 char padding[32];
752 } info; 759 } info;
753}; 760};
diff --git a/drivers/gpu/nvgpu/vgpu/vgpu.c b/drivers/gpu/nvgpu/vgpu/vgpu.c
index 08556ee5..1e77cda9 100644
--- a/drivers/gpu/nvgpu/vgpu/vgpu.c
+++ b/drivers/gpu/nvgpu/vgpu/vgpu.c
@@ -122,6 +122,20 @@ static void vgpu_channel_abort_cleanup(struct gk20a *g, u32 chid)
122 g->ops.fifo.ch_abort_clean_up(ch); 122 g->ops.fifo.ch_abort_clean_up(ch);
123} 123}
124 124
125static void vgpu_set_error_notifier(struct gk20a *g,
126 struct tegra_vgpu_channel_set_error_notifier *p)
127{
128 struct channel_gk20a *ch;
129
130 if (p->chid >= g->fifo.num_channels) {
131 nvgpu_err(g, "invalid chid %d", p->chid);
132 return;
133 }
134
135 ch = &g->fifo.channel[p->chid];
136 g->ops.fifo.set_error_notifier(ch, p->error);
137}
138
125int vgpu_intr_thread(void *dev_id) 139int vgpu_intr_thread(void *dev_id)
126{ 140{
127 struct gk20a *g = dev_id; 141 struct gk20a *g = dev_id;
@@ -181,6 +195,10 @@ int vgpu_intr_thread(void *dev_id)
181 vgpu_channel_abort_cleanup(g, 195 vgpu_channel_abort_cleanup(g,
182 msg->info.ch_cleanup.chid); 196 msg->info.ch_cleanup.chid);
183 break; 197 break;
198 case TEGRA_VGPU_EVENT_SET_ERROR_NOTIFIER:
199 vgpu_set_error_notifier(g,
200 &msg->info.set_error_notifier);
201 break;
184 default: 202 default:
185 nvgpu_err(g, "unknown event %u", msg->event); 203 nvgpu_err(g, "unknown event %u", msg->event);
186 break; 204 break;