summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gm20b/fifo_gm20b.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/nvgpu/gm20b/fifo_gm20b.c')
-rw-r--r--drivers/gpu/nvgpu/gm20b/fifo_gm20b.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/gm20b/fifo_gm20b.c b/drivers/gpu/nvgpu/gm20b/fifo_gm20b.c
index 8e913f23..6b462acd 100644
--- a/drivers/gpu/nvgpu/gm20b/fifo_gm20b.c
+++ b/drivers/gpu/nvgpu/gm20b/fifo_gm20b.c
@@ -183,3 +183,31 @@ void gm20b_fifo_init_pbdma_intr_descs(struct fifo_gk20a *f)
183 f->intr.pbdma.restartable_0 = 183 f->intr.pbdma.restartable_0 =
184 pbdma_intr_0_device_pending_f(); 184 pbdma_intr_0_device_pending_f();
185} 185}
186
187static void gm20b_fifo_set_ctx_reload(struct channel_gk20a *ch)
188{
189 struct gk20a *g = ch->g;
190 u32 channel = gk20a_readl(g, ccsr_channel_r(ch->chid));
191
192 gk20a_writel(g, ccsr_channel_r(ch->chid),
193 channel | ccsr_channel_force_ctx_reload_true_f());
194}
195
196void gm20b_fifo_tsg_verify_status_ctx_reload(struct channel_gk20a *ch)
197{
198 struct gk20a *g = ch->g;
199 struct tsg_gk20a *tsg = &g->fifo.tsg[ch->tsgid];
200 struct channel_gk20a *temp_ch;
201
202 /* If CTX_RELOAD is set on a channel, move it to some other channel */
203 if (gk20a_fifo_channel_status_is_ctx_reload(ch->g, ch->chid)) {
204 down_read(&tsg->ch_list_lock);
205 nvgpu_list_for_each_entry(temp_ch, &tsg->ch_list, channel_gk20a, ch_entry) {
206 if (temp_ch->chid != ch->chid) {
207 gm20b_fifo_set_ctx_reload(temp_ch);
208 break;
209 }
210 }
211 up_read(&tsg->ch_list_lock);
212 }
213}