diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/nvgpu/include/nvgpu/vgpu/tegra_vgpu.h | 7 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/vgpu/vgpu.c | 18 |
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 | ||
717 | struct tegra_vgpu_channel_set_error_notifier { | ||
718 | u32 chid; | ||
719 | u32 error; | ||
720 | }; | ||
721 | |||
717 | enum { | 722 | enum { |
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 | ||
737 | struct tegra_vgpu_intr_msg { | 743 | struct 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 | ||
125 | static 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 | |||
125 | int vgpu_intr_thread(void *dev_id) | 139 | int 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; |