2 * drivers/video/tegra/host/gk20a/fifo_gk20a.c
4 * GK20A Graphics FIFO (gr host)
6 * Copyright (c) 2011-2014, NVIDIA CORPORATION. All rights reserved.
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms and conditions of the GNU General Public License,
10 * version 2, as published by the Free Software Foundation.
12 * This program is distributed in the hope it will be useful, but WITHOUT
13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
17 * You should have received a copy of the GNU General Public License along with
18 * this program; if not, write to the Free Software Foundation, Inc.,
19 * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
21 #include <linux/delay.h>
22 #include <linux/slab.h>
23 #include <linux/scatterlist.h>
24 #include <trace/events/gk20a.h>
25 #include <linux/dma-mapping.h>
26 #include <linux/nvhost.h>
29 #include "debug_gk20a.h"
30 #include "hw_fifo_gk20a.h"
31 #include "hw_pbdma_gk20a.h"
32 #include "hw_ccsr_gk20a.h"
33 #include "hw_ram_gk20a.h"
34 #include "hw_proj_gk20a.h"
35 #include "hw_top_gk20a.h"
36 #include "hw_mc_gk20a.h"
37 #include "hw_gr_gk20a.h"
39 static int gk20a_fifo_update_runlist_locked(struct gk20a *g, u32 runlist_id,
40 u32 hw_chid, bool add,
41 bool wait_for_finish);
42 static void gk20a_fifo_handle_mmu_fault_thread(struct work_struct *work);
45 * Link engine IDs to MMU IDs and vice versa.
48 static inline u32 gk20a_engine_id_to_mmu_id(u32 engine_id)
53 case ENGINE_CE2_GK20A:
60 static inline u32 gk20a_mmu_id_to_engine_id(u32 engine_id)
64 return ENGINE_GR_GK20A;
66 return ENGINE_CE2_GK20A;
73 static int init_engine_info(struct fifo_gk20a *f)
75 struct gk20a *g = f->g;
76 struct device *d = dev_from_gk20a(g);
77 struct fifo_engine_info_gk20a *gr_info;
78 const u32 gr_sw_id = ENGINE_GR_GK20A;
80 u32 max_info_entries = top_device_info__size_1_v();
84 /* all we really care about finding is the graphics entry */
85 /* especially early on in sim it probably thinks it has more */
88 gr_info = f->engine_info + gr_sw_id;
90 gr_info->sw_id = gr_sw_id;
92 gr_info->dev_info_id = top_device_info_type_enum_graphics_v();
93 gr_info->mmu_fault_id = fifo_intr_mmu_fault_eng_id_graphics_v();
94 gr_info->runlist_id = ~0;
95 gr_info->pbdma_id = ~0;
96 gr_info->engine_id = ~0;
98 for (i = 0; i < max_info_entries; i++) {
99 u32 table_entry = gk20a_readl(f->g, top_device_info_r(i));
100 u32 entry = top_device_info_entry_v(table_entry);
101 u32 engine_enum = top_device_info_type_enum_v(table_entry);
102 u32 table_entry2 = 0;
104 if (entry == top_device_info_entry_not_valid_v())
107 if (top_device_info_chain_v(table_entry) ==
108 top_device_info_chain_enable_v()) {
110 table_entry2 = gk20a_readl(f->g,
111 top_device_info_r(++i));
113 engine_enum = top_device_info_type_enum_v(table_entry2);
116 /* we only care about GR engine here */
117 if (entry == top_device_info_entry_enum_v() &&
118 engine_enum == gr_info->dev_info_id) {
122 gr_info->runlist_id =
123 top_device_info_runlist_enum_v(table_entry);
124 gk20a_dbg_info("gr info: runlist_id %d", gr_info->runlist_id);
127 top_device_info_engine_enum_v(table_entry);
128 gk20a_dbg_info("gr info: engine_id %d", gr_info->engine_id);
130 runlist_bit = 1 << gr_info->runlist_id;
132 for (pbdma_id = 0; pbdma_id < f->num_pbdma; pbdma_id++) {
133 gk20a_dbg_info("gr info: pbdma_map[%d]=%d",
134 pbdma_id, f->pbdma_map[pbdma_id]);
135 if (f->pbdma_map[pbdma_id] & runlist_bit)
139 if (pbdma_id == f->num_pbdma) {
140 gk20a_err(d, "busted pbmda map");
143 gr_info->pbdma_id = pbdma_id;
149 if (gr_info->runlist_id == ~0) {
150 gk20a_err(d, "busted device info");
157 void gk20a_remove_fifo_support(struct fifo_gk20a *f)
159 struct gk20a *g = f->g;
160 struct device *d = dev_from_gk20a(g);
161 struct fifo_engine_info_gk20a *engine_info;
162 struct fifo_runlist_info_gk20a *runlist;
170 for (c = 0; c < f->num_channels; c++) {
171 if (f->channel[c].remove_support)
172 f->channel[c].remove_support(f->channel+c);
177 gk20a_gmmu_unmap(&g->mm.bar1.vm,
180 gk20a_mem_flag_none);
183 gk20a_free_sgtable(&f->userd.sgt);
190 f->userd.cpuva = NULL;
193 engine_info = f->engine_info + ENGINE_GR_GK20A;
194 runlist_id = engine_info->runlist_id;
195 runlist = &f->runlist_info[runlist_id];
197 for (i = 0; i < MAX_RUNLIST_BUFFERS; i++) {
198 if (runlist->mem[i].cpuva)
200 runlist->mem[i].size,
201 runlist->mem[i].cpuva,
202 runlist->mem[i].iova);
203 runlist->mem[i].cpuva = NULL;
204 runlist->mem[i].iova = 0;
207 kfree(runlist->active_channels);
209 kfree(f->runlist_info);
211 kfree(f->engine_info);
214 /* reads info from hardware and fills in pbmda exception info record */
215 static inline void get_exception_pbdma_info(
217 struct fifo_engine_info_gk20a *eng_info)
219 struct fifo_pbdma_exception_info_gk20a *e =
220 &eng_info->pbdma_exception_info;
222 u32 pbdma_status_r = e->status_r = gk20a_readl(g,
223 fifo_pbdma_status_r(eng_info->pbdma_id));
224 e->id = fifo_pbdma_status_id_v(pbdma_status_r); /* vs. id_hw_v()? */
225 e->id_is_chid = fifo_pbdma_status_id_type_v(pbdma_status_r) ==
226 fifo_pbdma_status_id_type_chid_v();
227 e->chan_status_v = fifo_pbdma_status_chan_status_v(pbdma_status_r);
229 fifo_pbdma_status_next_id_type_v(pbdma_status_r) ==
230 fifo_pbdma_status_next_id_type_chid_v();
231 e->next_id = fifo_pbdma_status_next_id_v(pbdma_status_r);
232 e->chsw_in_progress =
233 fifo_pbdma_status_chsw_v(pbdma_status_r) ==
234 fifo_pbdma_status_chsw_in_progress_v();
237 static void fifo_pbdma_exception_status(struct gk20a *g,
238 struct fifo_engine_info_gk20a *eng_info)
240 struct fifo_pbdma_exception_info_gk20a *e;
241 get_exception_pbdma_info(g, eng_info);
242 e = &eng_info->pbdma_exception_info;
244 gk20a_dbg_fn("pbdma_id %d, "
245 "id_type %s, id %d, chan_status %d, "
246 "next_id_type %s, next_id %d, "
247 "chsw_in_progress %d",
249 e->id_is_chid ? "chid" : "tsgid", e->id, e->chan_status_v,
250 e->next_id_is_chid ? "chid" : "tsgid", e->next_id,
251 e->chsw_in_progress);
254 /* reads info from hardware and fills in pbmda exception info record */
255 static inline void get_exception_engine_info(
257 struct fifo_engine_info_gk20a *eng_info)
259 struct fifo_engine_exception_info_gk20a *e =
260 &eng_info->engine_exception_info;
261 u32 engine_status_r = e->status_r =
262 gk20a_readl(g, fifo_engine_status_r(eng_info->engine_id));
263 e->id = fifo_engine_status_id_v(engine_status_r); /* vs. id_hw_v()? */
264 e->id_is_chid = fifo_engine_status_id_type_v(engine_status_r) ==
265 fifo_engine_status_id_type_chid_v();
266 e->ctx_status_v = fifo_engine_status_ctx_status_v(engine_status_r);
268 fifo_engine_status_faulted_v(engine_status_r) ==
269 fifo_engine_status_faulted_true_v();
271 fifo_engine_status_engine_v(engine_status_r) ==
272 fifo_engine_status_engine_idle_v();
273 e->ctxsw_in_progress =
274 fifo_engine_status_ctxsw_v(engine_status_r) ==
275 fifo_engine_status_ctxsw_in_progress_v();
278 static void fifo_engine_exception_status(struct gk20a *g,
279 struct fifo_engine_info_gk20a *eng_info)
281 struct fifo_engine_exception_info_gk20a *e;
282 get_exception_engine_info(g, eng_info);
283 e = &eng_info->engine_exception_info;
285 gk20a_dbg_fn("engine_id %d, id_type %s, id %d, ctx_status %d, "
286 "faulted %d, idle %d, ctxsw_in_progress %d, ",
287 eng_info->engine_id, e->id_is_chid ? "chid" : "tsgid",
288 e->id, e->ctx_status_v,
289 e->faulted, e->idle, e->ctxsw_in_progress);
292 static int init_runlist(struct gk20a *g, struct fifo_gk20a *f)
294 struct fifo_engine_info_gk20a *engine_info;
295 struct fifo_runlist_info_gk20a *runlist;
296 struct device *d = dev_from_gk20a(g);
303 f->max_runlists = fifo_eng_runlist_base__size_1_v();
304 f->runlist_info = kzalloc(sizeof(struct fifo_runlist_info_gk20a) *
305 f->max_runlists, GFP_KERNEL);
306 if (!f->runlist_info)
309 engine_info = f->engine_info + ENGINE_GR_GK20A;
310 runlist_id = engine_info->runlist_id;
311 runlist = &f->runlist_info[runlist_id];
313 runlist->active_channels =
314 kzalloc(DIV_ROUND_UP(f->num_channels, BITS_PER_BYTE),
316 if (!runlist->active_channels)
317 goto clean_up_runlist_info;
319 runlist_size = ram_rl_entry_size_v() * f->num_channels;
320 for (i = 0; i < MAX_RUNLIST_BUFFERS; i++) {
323 runlist->mem[i].cpuva =
324 dma_alloc_coherent(d,
328 if (!runlist->mem[i].cpuva) {
329 dev_err(d, "memory allocation failed\n");
330 goto clean_up_runlist;
332 runlist->mem[i].iova = iova;
333 runlist->mem[i].size = runlist_size;
335 mutex_init(&runlist->mutex);
336 init_waitqueue_head(&runlist->runlist_wq);
338 /* None of buffers is pinned if this value doesn't change.
339 Otherwise, one of them (cur_buffer) must have been pinned. */
340 runlist->cur_buffer = MAX_RUNLIST_BUFFERS;
342 gk20a_dbg_fn("done");
346 for (i = 0; i < MAX_RUNLIST_BUFFERS; i++) {
347 if (runlist->mem[i].cpuva)
349 runlist->mem[i].size,
350 runlist->mem[i].cpuva,
351 runlist->mem[i].iova);
352 runlist->mem[i].cpuva = NULL;
353 runlist->mem[i].iova = 0;
356 kfree(runlist->active_channels);
357 runlist->active_channels = NULL;
359 clean_up_runlist_info:
360 kfree(f->runlist_info);
361 f->runlist_info = NULL;
364 gk20a_dbg_fn("fail");
368 #define GRFIFO_TIMEOUT_CHECK_PERIOD_US 100000
370 int gk20a_init_fifo_reset_enable_hw(struct gk20a *g)
378 /* enable pmc pfifo */
379 gk20a_reset(g, mc_enable_pfifo_enabled_f()
380 | mc_enable_ce2_enabled_f());
384 for (i = 0; i < proj_host_num_pbdma_v(); ++i)
385 mask |= mc_enable_pb_sel_f(mc_enable_pb_0_enabled_v(), i);
386 gk20a_writel(g, mc_enable_pb_r(), mask);
388 /* enable pfifo interrupt */
389 gk20a_writel(g, fifo_intr_0_r(), 0xFFFFFFFF);
390 gk20a_writel(g, fifo_intr_en_0_r(), 0x7FFFFFFF);
391 gk20a_writel(g, fifo_intr_en_1_r(), 0x80000000);
393 /* enable pbdma interrupt */
395 for (i = 0; i < proj_host_num_pbdma_v(); i++) {
396 intr_stall = gk20a_readl(g, pbdma_intr_stall_r(i));
397 intr_stall &= ~pbdma_intr_stall_lbreq_enabled_f();
398 gk20a_writel(g, pbdma_intr_stall_r(i), intr_stall);
399 gk20a_writel(g, pbdma_intr_0_r(i), 0xFFFFFFFF);
400 gk20a_writel(g, pbdma_intr_en_0_r(i),
401 ~pbdma_intr_en_0_lbreq_enabled_f());
402 gk20a_writel(g, pbdma_intr_1_r(i), 0xFFFFFFFF);
403 gk20a_writel(g, pbdma_intr_en_1_r(i),
404 ~pbdma_intr_en_0_lbreq_enabled_f());
407 /* TBD: apply overrides */
411 /* reset runlist interrupts */
412 gk20a_writel(g, fifo_intr_runlist_r(), ~0);
414 /* TBD: do we need those? */
415 timeout = gk20a_readl(g, fifo_fb_timeout_r());
416 timeout = set_field(timeout, fifo_fb_timeout_period_m(),
417 fifo_fb_timeout_period_max_f());
418 gk20a_writel(g, fifo_fb_timeout_r(), timeout);
420 for (i = 0; i < pbdma_timeout__size_1_v(); i++) {
421 timeout = gk20a_readl(g, pbdma_timeout_r(i));
422 timeout = set_field(timeout, pbdma_timeout_period_m(),
423 pbdma_timeout_period_max_f());
424 gk20a_writel(g, pbdma_timeout_r(i), timeout);
427 if (tegra_platform_is_silicon()) {
428 timeout = gk20a_readl(g, fifo_pb_timeout_r());
429 timeout &= ~fifo_pb_timeout_detection_enabled_f();
430 gk20a_writel(g, fifo_pb_timeout_r(), timeout);
433 timeout = GRFIFO_TIMEOUT_CHECK_PERIOD_US |
434 fifo_eng_timeout_detection_enabled_f();
435 gk20a_writel(g, fifo_eng_timeout_r(), timeout);
437 gk20a_dbg_fn("done");
442 static void gk20a_init_fifo_pbdma_intr_descs(struct fifo_gk20a *f)
444 /* These are all errors which indicate something really wrong
445 * going on in the device. */
446 f->intr.pbdma.device_fatal_0 =
447 pbdma_intr_0_memreq_pending_f() |
448 pbdma_intr_0_memack_timeout_pending_f() |
449 pbdma_intr_0_memack_extra_pending_f() |
450 pbdma_intr_0_memdat_timeout_pending_f() |
451 pbdma_intr_0_memdat_extra_pending_f() |
452 pbdma_intr_0_memflush_pending_f() |
453 pbdma_intr_0_memop_pending_f() |
454 pbdma_intr_0_lbconnect_pending_f() |
455 pbdma_intr_0_lback_timeout_pending_f() |
456 pbdma_intr_0_lback_extra_pending_f() |
457 pbdma_intr_0_lbdat_timeout_pending_f() |
458 pbdma_intr_0_lbdat_extra_pending_f() |
459 pbdma_intr_0_xbarconnect_pending_f() |
460 pbdma_intr_0_pri_pending_f();
462 /* These are data parsing, framing errors or others which can be
463 * recovered from with intervention... or just resetting the
465 f->intr.pbdma.channel_fatal_0 =
466 pbdma_intr_0_gpfifo_pending_f() |
467 pbdma_intr_0_gpptr_pending_f() |
468 pbdma_intr_0_gpentry_pending_f() |
469 pbdma_intr_0_gpcrc_pending_f() |
470 pbdma_intr_0_pbptr_pending_f() |
471 pbdma_intr_0_pbentry_pending_f() |
472 pbdma_intr_0_pbcrc_pending_f() |
473 pbdma_intr_0_method_pending_f() |
474 pbdma_intr_0_methodcrc_pending_f() |
475 pbdma_intr_0_pbseg_pending_f() |
476 pbdma_intr_0_signature_pending_f();
478 /* Can be used for sw-methods, or represents
479 * a recoverable timeout. */
480 f->intr.pbdma.restartable_0 =
481 pbdma_intr_0_device_pending_f() |
482 pbdma_intr_0_acquire_pending_f();
485 static int gk20a_init_fifo_setup_sw(struct gk20a *g)
487 struct fifo_gk20a *f = &g->fifo;
488 struct device *d = dev_from_gk20a(g);
489 int chid, i, err = 0;
495 gk20a_dbg_fn("skip init");
501 INIT_WORK(&f->fault_restore_thread,
502 gk20a_fifo_handle_mmu_fault_thread);
503 mutex_init(&f->intr.isr.mutex);
504 gk20a_init_fifo_pbdma_intr_descs(f); /* just filling in data/tables */
506 f->num_channels = ccsr_channel__size_1_v();
507 f->num_pbdma = proj_host_num_pbdma_v();
508 f->max_engines = ENGINE_INVAL_GK20A;
510 f->userd_entry_size = 1 << ram_userd_base_shift_v();
511 f->userd_total_size = f->userd_entry_size * f->num_channels;
513 f->userd.cpuva = dma_alloc_coherent(d,
517 if (!f->userd.cpuva) {
518 dev_err(d, "memory allocation failed\n");
522 f->userd.iova = iova;
523 err = gk20a_get_sgtable(d, &f->userd.sgt,
524 f->userd.cpuva, f->userd.iova,
525 f->userd_total_size);
527 dev_err(d, "failed to create sg table\n");
532 f->userd.gpu_va = gk20a_gmmu_map(&g->mm.bar1.vm,
536 gk20a_mem_flag_none);
537 if (!f->userd.gpu_va) {
538 dev_err(d, "gmmu mapping failed\n");
542 gk20a_dbg(gpu_dbg_map, "userd bar1 va = 0x%llx", f->userd.gpu_va);
544 f->userd.size = f->userd_total_size;
546 f->channel = kzalloc(f->num_channels * sizeof(*f->channel),
548 f->pbdma_map = kzalloc(f->num_pbdma * sizeof(*f->pbdma_map),
550 f->engine_info = kzalloc(f->max_engines * sizeof(*f->engine_info),
553 if (!(f->channel && f->pbdma_map && f->engine_info)) {
558 /* pbdma map needs to be in place before calling engine info init */
559 for (i = 0; i < f->num_pbdma; ++i)
560 f->pbdma_map[i] = gk20a_readl(g, fifo_pbdma_map_r(i));
566 for (chid = 0; chid < f->num_channels; chid++) {
567 f->channel[chid].userd_cpu_va =
568 f->userd.cpuva + chid * f->userd_entry_size;
569 f->channel[chid].userd_iova =
570 NV_MC_SMMU_VADDR_TRANSLATE(f->userd.iova)
571 + chid * f->userd_entry_size;
572 f->channel[chid].userd_gpu_va =
573 f->userd.gpu_va + chid * f->userd_entry_size;
575 gk20a_init_channel_support(g, chid);
577 mutex_init(&f->ch_inuse_mutex);
579 f->remove_support = gk20a_remove_fifo_support;
581 f->deferred_reset_pending = false;
582 mutex_init(&f->deferred_reset_mutex);
586 gk20a_dbg_fn("done");
590 gk20a_dbg_fn("fail");
592 gk20a_gmmu_unmap(&g->mm.bar1.vm,
595 gk20a_mem_flag_none);
597 gk20a_free_sgtable(&f->userd.sgt);
603 f->userd.cpuva = NULL;
606 memset(&f->userd, 0, sizeof(struct userd_desc));
612 kfree(f->engine_info);
613 f->engine_info = NULL;
618 static void gk20a_fifo_handle_runlist_event(struct gk20a *g)
620 struct fifo_gk20a *f = &g->fifo;
621 struct fifo_runlist_info_gk20a *runlist;
622 unsigned long runlist_event;
625 runlist_event = gk20a_readl(g, fifo_intr_runlist_r());
626 gk20a_writel(g, fifo_intr_runlist_r(), runlist_event);
628 for_each_set_bit(runlist_id, &runlist_event, f->max_runlists) {
629 runlist = &f->runlist_info[runlist_id];
630 wake_up(&runlist->runlist_wq);
635 static int gk20a_init_fifo_setup_hw(struct gk20a *g)
637 struct fifo_gk20a *f = &g->fifo;
641 /* test write, read through bar1 @ userd region before
642 * turning on the snooping */
644 struct fifo_gk20a *f = &g->fifo;
645 u32 v, v1 = 0x33, v2 = 0x55;
647 u32 bar1_vaddr = f->userd.gpu_va;
648 volatile u32 *cpu_vaddr = f->userd.cpuva;
650 gk20a_dbg_info("test bar1 @ vaddr 0x%x",
653 v = gk20a_bar1_readl(g, bar1_vaddr);
658 if (v1 != gk20a_bar1_readl(g, bar1_vaddr)) {
659 gk20a_err(dev_from_gk20a(g), "bar1 broken @ gk20a!");
663 gk20a_bar1_writel(g, bar1_vaddr, v2);
665 if (v2 != gk20a_bar1_readl(g, bar1_vaddr)) {
666 gk20a_err(dev_from_gk20a(g), "bar1 broken @ gk20a!");
670 /* is it visible to the cpu? */
671 if (*cpu_vaddr != v2) {
672 gk20a_err(dev_from_gk20a(g),
673 "cpu didn't see bar1 write @ %p!",
678 gk20a_bar1_writel(g, bar1_vaddr, v);
681 /*XXX all manner of flushes and caching worries, etc */
683 /* set the base for the userd region now */
684 gk20a_writel(g, fifo_bar1_base_r(),
685 fifo_bar1_base_ptr_f(f->userd.gpu_va >> 12) |
686 fifo_bar1_base_valid_true_f());
688 gk20a_dbg_fn("done");
693 int gk20a_init_fifo_support(struct gk20a *g)
697 err = gk20a_init_fifo_setup_sw(g);
701 err = gk20a_init_fifo_setup_hw(g);
708 static struct channel_gk20a *
709 channel_from_inst_ptr(struct fifo_gk20a *f, u64 inst_ptr)
712 if (unlikely(!f->channel))
714 for (ci = 0; ci < f->num_channels; ci++) {
715 struct channel_gk20a *c = f->channel+ci;
716 if (c->inst_block.cpuva &&
717 (inst_ptr == c->inst_block.cpu_pa))
718 return f->channel+ci;
723 /* fault info/descriptions.
726 static const char * const fault_type_descs[] = {
727 "pde", /*fifo_intr_mmu_fault_info_type_pde_v() == 0 */
738 "compression failure",
744 /* engine descriptions */
745 static const char * const engine_subid_descs[] = {
750 static const char * const hub_client_descs[] = {
751 "vip", "ce0", "ce1", "dniso", "fe", "fecs", "host", "host cpu",
752 "host cpu nb", "iso", "mmu", "mspdec", "msppp", "msvld",
753 "niso", "p2p", "pd", "perf", "pmu", "raster twod", "scc",
754 "scc nb", "sec", "ssync", "gr copy", "ce2", "xv", "mmu nb",
755 "msenc", "d falcon", "sked", "a falcon", "n/a",
758 static const char * const gpc_client_descs[] = {
759 "l1 0", "t1 0", "pe 0",
760 "l1 1", "t1 1", "pe 1",
761 "l1 2", "t1 2", "pe 2",
762 "l1 3", "t1 3", "pe 3",
763 "rast", "gcc", "gpccs",
764 "prop 0", "prop 1", "prop 2", "prop 3",
765 "l1 4", "t1 4", "pe 4",
766 "l1 5", "t1 5", "pe 5",
767 "l1 6", "t1 6", "pe 6",
768 "l1 7", "t1 7", "pe 7",
770 "ltp utlb 0", "ltp utlb 1", "ltp utlb 2", "ltp utlb 3",
774 /* reads info from hardware and fills in mmu fault info record */
775 static inline void get_exception_mmu_fault_info(
776 struct gk20a *g, u32 engine_id,
777 struct fifo_mmu_fault_info_gk20a *f)
781 gk20a_dbg_fn("engine_id %d", engine_id);
783 memset(f, 0, sizeof(*f));
785 f->fault_info_v = fault_info_v = gk20a_readl(g,
786 fifo_intr_mmu_fault_info_r(engine_id));
788 fifo_intr_mmu_fault_info_type_v(fault_info_v);
790 fifo_intr_mmu_fault_info_engine_subid_v(fault_info_v);
791 f->client_v = fifo_intr_mmu_fault_info_client_v(fault_info_v);
793 BUG_ON(f->fault_type_v >= ARRAY_SIZE(fault_type_descs));
794 f->fault_type_desc = fault_type_descs[f->fault_type_v];
796 BUG_ON(f->engine_subid_v >= ARRAY_SIZE(engine_subid_descs));
797 f->engine_subid_desc = engine_subid_descs[f->engine_subid_v];
799 if (f->engine_subid_v ==
800 fifo_intr_mmu_fault_info_engine_subid_hub_v()) {
802 BUG_ON(f->client_v >= ARRAY_SIZE(hub_client_descs));
803 f->client_desc = hub_client_descs[f->client_v];
804 } else if (f->engine_subid_v ==
805 fifo_intr_mmu_fault_info_engine_subid_gpc_v()) {
806 BUG_ON(f->client_v >= ARRAY_SIZE(gpc_client_descs));
807 f->client_desc = gpc_client_descs[f->client_v];
812 f->fault_hi_v = gk20a_readl(g, fifo_intr_mmu_fault_hi_r(engine_id));
813 f->fault_lo_v = gk20a_readl(g, fifo_intr_mmu_fault_lo_r(engine_id));
814 /* note:ignoring aperture on gk20a... */
815 f->inst_ptr = fifo_intr_mmu_fault_inst_ptr_v(
816 gk20a_readl(g, fifo_intr_mmu_fault_inst_r(engine_id)));
817 /* note: inst_ptr is a 40b phys addr. */
818 f->inst_ptr <<= fifo_intr_mmu_fault_inst_ptr_align_shift_v();
821 static void gk20a_fifo_reset_engine(struct gk20a *g, u32 engine_id)
825 if (engine_id == top_device_info_type_enum_graphics_v()) {
826 /* resetting engine using mc_enable_r() is not enough,
827 * we do full init sequence */
830 if (engine_id == top_device_info_type_enum_copy0_v())
831 gk20a_reset(g, mc_enable_ce2_m());
834 static void gk20a_fifo_handle_mmu_fault_thread(struct work_struct *work)
836 struct fifo_gk20a *f = container_of(work, struct fifo_gk20a,
837 fault_restore_thread);
838 struct gk20a *g = f->g;
841 /* It is safe to enable ELPG again. */
842 gk20a_pmu_enable_elpg(g);
844 /* Restore the runlist */
845 for (i = 0; i < g->fifo.max_runlists; i++)
846 gk20a_fifo_update_runlist_locked(g, i, ~0, true, true);
848 /* unlock all runlists */
849 for (i = 0; i < g->fifo.max_runlists; i++)
850 mutex_unlock(&g->fifo.runlist_info[i].mutex);
854 static void gk20a_fifo_handle_chsw_fault(struct gk20a *g)
858 intr = gk20a_readl(g, fifo_intr_chsw_error_r());
859 gk20a_err(dev_from_gk20a(g), "chsw: %08x\n", intr);
860 gk20a_fecs_dump_falcon_stats(g);
861 gk20a_writel(g, fifo_intr_chsw_error_r(), intr);
864 static void gk20a_fifo_handle_dropped_mmu_fault(struct gk20a *g)
866 struct device *dev = dev_from_gk20a(g);
867 u32 fault_id = gk20a_readl(g, fifo_intr_mmu_fault_id_r());
868 gk20a_err(dev, "dropped mmu fault (0x%08x)", fault_id);
871 static bool gk20a_fifo_should_defer_engine_reset(struct gk20a *g, u32 engine_id,
872 struct fifo_mmu_fault_info_gk20a *f, bool fake_fault)
874 /* channel recovery is only deferred if an sm debugger
875 is attached and has MMU debug mode is enabled */
876 if (!gk20a_gr_sm_debugger_attached(g) ||
877 !gk20a_mm_mmu_debug_mode_enabled(g))
880 /* if this fault is fake (due to RC recovery), don't defer recovery */
884 if (engine_id != ENGINE_GR_GK20A ||
885 f->engine_subid_v != fifo_intr_mmu_fault_info_engine_subid_gpc_v())
891 void fifo_gk20a_finish_mmu_fault_handling(struct gk20a *g,
892 unsigned long fault_id) {
897 for_each_set_bit(engine_mmu_id, &fault_id, 32) {
898 u32 engine_id = gk20a_mmu_id_to_engine_id(engine_mmu_id);
900 gk20a_fifo_reset_engine(g, engine_id);
903 /* CLEAR the runlists. Do not wait for runlist to start as
904 * some engines may not be available right now */
905 for (i = 0; i < g->fifo.max_runlists; i++)
906 gk20a_fifo_update_runlist_locked(g, i, ~0, false, false);
908 /* clear interrupt */
909 gk20a_writel(g, fifo_intr_mmu_fault_id_r(), fault_id);
911 /* resume scheduler */
912 gk20a_writel(g, fifo_error_sched_disable_r(),
913 gk20a_readl(g, fifo_error_sched_disable_r()));
915 /* Spawn a work to enable PMU and restore runlists */
916 schedule_work(&g->fifo.fault_restore_thread);
919 static bool gk20a_fifo_set_ctx_mmu_error(struct gk20a *g,
920 struct channel_gk20a *ch) {
925 gk20a_err(dev_from_gk20a(g),
926 "channel %d generated a mmu fault",
928 if (ch->error_notifier) {
929 u32 err = ch->error_notifier->info32;
930 if (ch->error_notifier->status == 0xffff) {
931 /* If error code is already set, this mmu fault
932 * was triggered as part of recovery from other
934 * Don't overwrite error flag. */
935 /* Fifo timeout debug spew is controlled by user */
936 if (err == NVHOST_CHANNEL_FIFO_ERROR_IDLE_TIMEOUT)
937 verbose = ch->timeout_debug_dump;
939 gk20a_set_error_notifier(ch,
940 NVHOST_CHANNEL_FIFO_ERROR_MMU_ERR_FLT);
943 /* mark channel as faulted */
944 ch->has_timedout = true;
946 /* unblock pending waits */
947 wake_up(&ch->semaphore_wq);
948 wake_up(&ch->notifier_wq);
949 wake_up(&ch->submit_wq);
954 static bool gk20a_fifo_handle_mmu_fault(struct gk20a *g)
957 unsigned long fault_id;
958 unsigned long engine_mmu_id;
963 g->fifo.deferred_reset_pending = false;
966 gk20a_pmu_disable_elpg(g);
968 /* If we have recovery in progress, MMU fault id is invalid */
969 if (g->fifo.mmu_fault_engines) {
970 fault_id = g->fifo.mmu_fault_engines;
971 g->fifo.mmu_fault_engines = 0;
974 fault_id = gk20a_readl(g, fifo_intr_mmu_fault_id_r());
976 gk20a_debug_dump(g->dev);
979 /* lock all runlists. Note that locks are are released in
980 * gk20a_fifo_handle_mmu_fault_thread() */
981 for (i = 0; i < g->fifo.max_runlists; i++)
982 mutex_lock(&g->fifo.runlist_info[i].mutex);
984 /* go through all faulted engines */
985 for_each_set_bit(engine_mmu_id, &fault_id, 32) {
986 /* bits in fifo_intr_mmu_fault_id_r do not correspond 1:1 to
987 * engines. Convert engine_mmu_id to engine_id */
988 u32 engine_id = gk20a_mmu_id_to_engine_id(engine_mmu_id);
989 struct fifo_runlist_info_gk20a *runlist = g->fifo.runlist_info;
990 struct fifo_mmu_fault_info_gk20a f;
991 struct channel_gk20a *ch = NULL;
993 get_exception_mmu_fault_info(g, engine_mmu_id, &f);
994 trace_gk20a_mmu_fault(f.fault_hi_v,
1002 gk20a_err(dev_from_gk20a(g), "mmu fault on engine %d, "
1003 "engine subid %d (%s), client %d (%s), "
1004 "addr 0x%08x:0x%08x, type %d (%s), info 0x%08x,"
1005 "inst_ptr 0x%llx\n",
1007 f.engine_subid_v, f.engine_subid_desc,
1008 f.client_v, f.client_desc,
1009 f.fault_hi_v, f.fault_lo_v,
1010 f.fault_type_v, f.fault_type_desc,
1011 f.fault_info_v, f.inst_ptr);
1013 /* get the channel */
1015 /* read and parse engine status */
1016 u32 status = gk20a_readl(g,
1017 fifo_engine_status_r(engine_id));
1019 fifo_engine_status_ctx_status_v(status);
1020 bool type_ch = fifo_pbdma_status_id_type_v(status) ==
1021 fifo_pbdma_status_id_type_chid_v();
1023 /* use next_id if context load is failing */
1024 u32 id = (ctx_status ==
1025 fifo_engine_status_ctx_status_ctxsw_load_v()) ?
1026 fifo_engine_status_next_id_v(status) :
1027 fifo_engine_status_id_v(status);
1030 ch = g->fifo.channel + id;
1032 gk20a_err(dev_from_gk20a(g), "non-chid type not supported");
1036 /* read channel based on instruction pointer */
1037 ch = channel_from_inst_ptr(&g->fifo, f.inst_ptr);
1042 /* disable the channel from hw and increment
1044 gk20a_disable_channel_no_update(ch);
1046 /* remove the channel from runlist */
1047 clear_bit(ch->hw_chid,
1048 runlist->active_channels);
1051 /* check if engine reset should be deferred */
1052 if (gk20a_fifo_should_defer_engine_reset(g, engine_id, &f, fake_fault)) {
1053 g->fifo.mmu_fault_engines = fault_id;
1055 /* handled during channel free */
1056 g->fifo.deferred_reset_pending = true;
1058 verbose = gk20a_fifo_set_ctx_mmu_error(g, ch);
1060 } else if (f.inst_ptr ==
1061 g->mm.bar1.inst_block.cpu_pa) {
1062 gk20a_err(dev_from_gk20a(g), "mmu fault from bar1");
1063 } else if (f.inst_ptr ==
1064 g->mm.pmu.inst_block.cpu_pa) {
1065 gk20a_err(dev_from_gk20a(g), "mmu fault from pmu");
1067 gk20a_err(dev_from_gk20a(g), "couldn't locate channel for mmu fault");
1070 if (g->fifo.deferred_reset_pending) {
1071 gk20a_dbg(gpu_dbg_intr | gpu_dbg_gpu_dbg, "sm debugger attached,"
1072 " deferring channel recovery to channel free");
1073 /* clear interrupt */
1074 gk20a_writel(g, fifo_intr_mmu_fault_id_r(), fault_id);
1078 /* resetting the engines and clearing the runlists is done in
1079 a separate function to allow deferred reset. */
1080 fifo_gk20a_finish_mmu_fault_handling(g, fault_id);
1084 static void gk20a_fifo_get_faulty_channel(struct gk20a *g, int engine_id,
1085 u32 *chid, bool *type_ch)
1087 u32 status = gk20a_readl(g, fifo_engine_status_r(engine_id));
1088 u32 ctx_status = fifo_engine_status_ctx_status_v(status);
1090 *type_ch = fifo_pbdma_status_id_type_v(status) ==
1091 fifo_pbdma_status_id_type_chid_v();
1092 /* use next_id if context load is failing */
1093 *chid = (ctx_status ==
1094 fifo_engine_status_ctx_status_ctxsw_load_v()) ?
1095 fifo_engine_status_next_id_v(status) :
1096 fifo_engine_status_id_v(status);
1099 static void gk20a_fifo_trigger_mmu_fault(struct gk20a *g,
1100 unsigned long engine_ids)
1102 unsigned long end_jiffies = jiffies +
1103 msecs_to_jiffies(gk20a_get_gr_idle_timeout(g));
1104 unsigned long delay = GR_IDLE_CHECK_DEFAULT;
1105 unsigned long engine_id;
1109 * sched error prevents recovery, and ctxsw error will retrigger
1110 * every 100ms. Disable the sched error to allow recovery.
1112 gk20a_writel(g, fifo_intr_en_0_r(),
1113 0x7FFFFFFF & ~fifo_intr_en_0_sched_error_m());
1114 gk20a_writel(g, fifo_intr_0_r(),
1115 fifo_intr_0_sched_error_reset_f());
1117 /* trigger faults for all bad engines */
1118 for_each_set_bit(engine_id, &engine_ids, 32) {
1119 if (engine_id > g->fifo.max_engines) {
1124 gk20a_writel(g, fifo_trigger_mmu_fault_r(engine_id),
1125 fifo_trigger_mmu_fault_id_f(
1126 gk20a_engine_id_to_mmu_id(engine_id)) |
1127 fifo_trigger_mmu_fault_enable_f(1));
1130 /* Wait for MMU fault to trigger */
1133 if (gk20a_readl(g, fifo_intr_0_r()) &
1134 fifo_intr_0_mmu_fault_pending_f()) {
1139 usleep_range(delay, delay * 2);
1140 delay = min_t(u32, delay << 1, GR_IDLE_CHECK_MAX);
1141 } while (time_before(jiffies, end_jiffies) ||
1142 !tegra_platform_is_silicon());
1145 gk20a_err(dev_from_gk20a(g), "mmu fault timeout");
1147 /* release mmu fault trigger */
1148 for_each_set_bit(engine_id, &engine_ids, 32)
1149 gk20a_writel(g, fifo_trigger_mmu_fault_r(engine_id), 0);
1151 /* Re-enable sched error */
1152 gk20a_writel(g, fifo_intr_en_0_r(), 0x7FFFFFFF);
1155 u32 gk20a_fifo_engines_on_ch(struct gk20a *g, u32 hw_chid)
1160 for (i = 0; i < g->fifo.max_engines; i++) {
1161 u32 status = gk20a_readl(g, fifo_engine_status_r(i));
1163 fifo_engine_status_ctx_status_v(status);
1164 bool type_ch = fifo_pbdma_status_id_type_v(status) ==
1165 fifo_pbdma_status_id_type_chid_v();
1166 bool busy = fifo_engine_status_engine_v(status) ==
1167 fifo_engine_status_engine_busy_v();
1168 u32 id = (ctx_status ==
1169 fifo_engine_status_ctx_status_ctxsw_load_v()) ?
1170 fifo_engine_status_next_id_v(status) :
1171 fifo_engine_status_id_v(status);
1173 if (type_ch && busy && id == hw_chid)
1180 void gk20a_fifo_recover_ch(struct gk20a *g, u32 hw_chid, bool verbose)
1182 u32 engines = gk20a_fifo_engines_on_ch(g, hw_chid);
1184 gk20a_fifo_recover(g, engines, verbose);
1187 struct channel_gk20a *ch =
1188 g->fifo.channel + hw_chid;
1190 gk20a_disable_channel_no_update(ch);
1191 for (i = 0; i < g->fifo.max_runlists; i++)
1192 gk20a_fifo_update_runlist(g, i,
1193 hw_chid, false, false);
1195 if (gk20a_fifo_set_ctx_mmu_error(g, ch))
1196 gk20a_debug_dump(g->dev);
1200 void gk20a_fifo_recover(struct gk20a *g, u32 __engine_ids,
1203 unsigned long engine_id, i;
1204 unsigned long _engine_ids = __engine_ids;
1205 unsigned long engine_ids = 0;
1208 gk20a_debug_dump(g->dev);
1210 /* store faulted engines in advance */
1211 g->fifo.mmu_fault_engines = 0;
1212 for_each_set_bit(engine_id, &_engine_ids, 32) {
1215 gk20a_fifo_get_faulty_channel(g, engine_id, &ref_chid,
1218 /* Reset *all* engines that use the
1219 * same channel as faulty engine */
1220 for (i = 0; i < g->fifo.max_engines; i++) {
1223 gk20a_fifo_get_faulty_channel(g, i, &chid, &type_ch);
1224 if (ref_type_ch == type_ch && ref_chid == chid) {
1225 engine_ids |= BIT(i);
1226 g->fifo.mmu_fault_engines |=
1227 BIT(gk20a_engine_id_to_mmu_id(i));
1233 g->ops.fifo.trigger_mmu_fault(g, engine_ids);
1237 static bool gk20a_fifo_handle_sched_error(struct gk20a *g)
1242 bool non_chid = false;
1244 /* read and reset the scheduler error register */
1245 sched_error = gk20a_readl(g, fifo_intr_sched_error_r());
1246 gk20a_writel(g, fifo_intr_0_r(), fifo_intr_0_sched_error_reset_f());
1248 for (engine_id = 0; engine_id < g->fifo.max_engines; engine_id++) {
1249 u32 status = gk20a_readl(g, fifo_engine_status_r(engine_id));
1250 u32 ctx_status = fifo_engine_status_ctx_status_v(status);
1251 bool failing_engine;
1253 /* we are interested in busy engines */
1254 failing_engine = fifo_engine_status_engine_v(status) ==
1255 fifo_engine_status_engine_busy_v();
1257 /* ..that are doing context switch */
1258 failing_engine = failing_engine &&
1260 fifo_engine_status_ctx_status_ctxsw_switch_v()
1262 fifo_engine_status_ctx_status_ctxsw_save_v()
1264 fifo_engine_status_ctx_status_ctxsw_load_v());
1266 if (failing_engine) {
1268 fifo_engine_status_ctx_status_ctxsw_load_v()) ?
1269 fifo_engine_status_next_id_v(status) :
1270 fifo_engine_status_id_v(status);
1271 non_chid = fifo_pbdma_status_id_type_v(status) !=
1272 fifo_pbdma_status_id_type_chid_v();
1277 /* could not find the engine - should never happen */
1278 if (unlikely(engine_id >= g->fifo.max_engines))
1281 if (fifo_intr_sched_error_code_f(sched_error) ==
1282 fifo_intr_sched_error_code_ctxsw_timeout_v()) {
1283 struct fifo_gk20a *f = &g->fifo;
1284 struct channel_gk20a *ch = &f->channel[id];
1287 gk20a_fifo_recover(g, BIT(engine_id), true);
1291 if (gk20a_channel_update_and_check_timeout(ch,
1292 GRFIFO_TIMEOUT_CHECK_PERIOD_US / 1000)) {
1293 gk20a_set_error_notifier(ch,
1294 NVHOST_CHANNEL_FIFO_ERROR_IDLE_TIMEOUT);
1295 gk20a_err(dev_from_gk20a(g),
1296 "fifo sched ctxsw timeout error:"
1297 "engine = %u, ch = %d", engine_id, id);
1298 gk20a_fifo_recover(g, BIT(engine_id),
1299 ch->timeout_debug_dump);
1301 gk20a_warn(dev_from_gk20a(g),
1302 "fifo is waiting for ctx switch for %d ms,"
1304 ch->timeout_accumulated_ms,
1307 return ch->timeout_debug_dump;
1310 gk20a_err(dev_from_gk20a(g), "fifo sched error : 0x%08x, engine=%u, %s=%d",
1311 sched_error, engine_id, non_chid ? "non-ch" : "ch", id);
1316 static u32 fifo_error_isr(struct gk20a *g, u32 fifo_intr)
1318 bool print_channel_reset_log = false, reset_engine = false;
1319 struct device *dev = dev_from_gk20a(g);
1324 if (fifo_intr & fifo_intr_0_pio_error_pending_f()) {
1325 /* pio mode is unused. this shouldn't happen, ever. */
1326 /* should we clear it or just leave it pending? */
1327 gk20a_err(dev, "fifo pio error!\n");
1331 if (fifo_intr & fifo_intr_0_bind_error_pending_f()) {
1332 u32 bind_error = gk20a_readl(g, fifo_intr_bind_error_r());
1333 gk20a_err(dev, "fifo bind error: 0x%08x", bind_error);
1334 print_channel_reset_log = true;
1335 handled |= fifo_intr_0_bind_error_pending_f();
1338 if (fifo_intr & fifo_intr_0_sched_error_pending_f()) {
1339 print_channel_reset_log = gk20a_fifo_handle_sched_error(g);
1340 handled |= fifo_intr_0_sched_error_pending_f();
1343 if (fifo_intr & fifo_intr_0_chsw_error_pending_f()) {
1344 gk20a_fifo_handle_chsw_fault(g);
1345 handled |= fifo_intr_0_chsw_error_pending_f();
1348 if (fifo_intr & fifo_intr_0_mmu_fault_pending_f()) {
1349 print_channel_reset_log = gk20a_fifo_handle_mmu_fault(g);
1350 reset_engine = true;
1351 handled |= fifo_intr_0_mmu_fault_pending_f();
1354 if (fifo_intr & fifo_intr_0_dropped_mmu_fault_pending_f()) {
1355 gk20a_fifo_handle_dropped_mmu_fault(g);
1356 handled |= fifo_intr_0_dropped_mmu_fault_pending_f();
1359 print_channel_reset_log = !g->fifo.deferred_reset_pending
1360 && print_channel_reset_log;
1362 if (print_channel_reset_log) {
1364 gk20a_err(dev_from_gk20a(g),
1365 "channel reset initated from %s", __func__);
1367 engine_id < g->fifo.max_engines;
1369 gk20a_dbg_fn("enum:%d -> engine_id:%d", engine_id,
1370 g->fifo.engine_info[engine_id].engine_id);
1371 fifo_pbdma_exception_status(g,
1372 &g->fifo.engine_info[engine_id]);
1373 fifo_engine_exception_status(g,
1374 &g->fifo.engine_info[engine_id]);
1381 static u32 gk20a_fifo_handle_pbdma_intr(struct device *dev,
1383 struct fifo_gk20a *f,
1386 u32 pbdma_intr_0 = gk20a_readl(g, pbdma_intr_0_r(pbdma_id));
1387 u32 pbdma_intr_1 = gk20a_readl(g, pbdma_intr_1_r(pbdma_id));
1393 gk20a_dbg(gpu_dbg_intr, "pbdma id intr pending %d %08x %08x", pbdma_id,
1394 pbdma_intr_0, pbdma_intr_1);
1396 if ((f->intr.pbdma.device_fatal_0 |
1397 f->intr.pbdma.channel_fatal_0 |
1398 f->intr.pbdma.restartable_0) & pbdma_intr_0) {
1399 gk20a_err(dev_from_gk20a(g),
1400 "pbdma_intr_0(%d):0x%08x PBH: %08x SHADOW: %08x M0: %08x",
1401 pbdma_id, pbdma_intr_0,
1402 gk20a_readl(g, pbdma_pb_header_r(pbdma_id)),
1403 gk20a_readl(g, pbdma_hdr_shadow_r(pbdma_id)),
1404 gk20a_readl(g, pbdma_method0_r(pbdma_id)));
1406 handled |= ((f->intr.pbdma.device_fatal_0 |
1407 f->intr.pbdma.channel_fatal_0 |
1408 f->intr.pbdma.restartable_0) &
1412 gk20a_writel(g, pbdma_intr_0_r(pbdma_id), pbdma_intr_0);
1415 /* all intrs in _intr_1 are "host copy engine" related,
1416 * which gk20a doesn't have. for now just make them channel fatal. */
1418 dev_err(dev, "channel hce error: pbdma_intr_1(%d): 0x%08x",
1419 pbdma_id, pbdma_intr_1);
1421 gk20a_writel(g, pbdma_intr_1_r(pbdma_id), pbdma_intr_1);
1425 /* Remove the channel from runlist */
1426 u32 status = gk20a_readl(g, fifo_pbdma_status_r(pbdma_id));
1427 u32 hw_chid = fifo_pbdma_status_id_v(status);
1428 if (fifo_pbdma_status_id_type_v(status)
1429 == fifo_pbdma_status_id_type_chid_v()) {
1430 gk20a_fifo_recover_ch(g, hw_chid, true);
1437 static u32 fifo_channel_isr(struct gk20a *g, u32 fifo_intr)
1439 gk20a_channel_semaphore_wakeup(g);
1440 return fifo_intr_0_channel_intr_pending_f();
1444 static u32 fifo_pbdma_isr(struct gk20a *g, u32 fifo_intr)
1446 struct device *dev = dev_from_gk20a(g);
1447 struct fifo_gk20a *f = &g->fifo;
1448 u32 clear_intr = 0, i;
1449 u32 pbdma_pending = gk20a_readl(g, fifo_intr_pbdma_id_r());
1451 for (i = 0; i < fifo_intr_pbdma_id_status__size_1_v(); i++) {
1452 if (fifo_intr_pbdma_id_status_f(pbdma_pending, i)) {
1453 gk20a_dbg(gpu_dbg_intr, "pbdma id %d intr pending", i);
1455 gk20a_fifo_handle_pbdma_intr(dev, g, f, i);
1458 return fifo_intr_0_pbdma_intr_pending_f();
1461 void gk20a_fifo_isr(struct gk20a *g)
1463 u32 error_intr_mask =
1464 fifo_intr_0_bind_error_pending_f() |
1465 fifo_intr_0_sched_error_pending_f() |
1466 fifo_intr_0_chsw_error_pending_f() |
1467 fifo_intr_0_fb_flush_timeout_pending_f() |
1468 fifo_intr_0_dropped_mmu_fault_pending_f() |
1469 fifo_intr_0_mmu_fault_pending_f() |
1470 fifo_intr_0_lb_error_pending_f() |
1471 fifo_intr_0_pio_error_pending_f();
1473 u32 fifo_intr = gk20a_readl(g, fifo_intr_0_r());
1476 /* note we're not actually in an "isr", but rather
1477 * in a threaded interrupt context... */
1478 mutex_lock(&g->fifo.intr.isr.mutex);
1480 gk20a_dbg(gpu_dbg_intr, "fifo isr %08x\n", fifo_intr);
1482 /* handle runlist update */
1483 if (fifo_intr & fifo_intr_0_runlist_event_pending_f()) {
1484 gk20a_fifo_handle_runlist_event(g);
1485 clear_intr |= fifo_intr_0_runlist_event_pending_f();
1487 if (fifo_intr & fifo_intr_0_pbdma_intr_pending_f())
1488 clear_intr |= fifo_pbdma_isr(g, fifo_intr);
1490 if (unlikely(fifo_intr & error_intr_mask))
1491 clear_intr = fifo_error_isr(g, fifo_intr);
1493 gk20a_writel(g, fifo_intr_0_r(), clear_intr);
1495 mutex_unlock(&g->fifo.intr.isr.mutex);
1500 void gk20a_fifo_nonstall_isr(struct gk20a *g)
1502 u32 fifo_intr = gk20a_readl(g, fifo_intr_0_r());
1505 gk20a_dbg(gpu_dbg_intr, "fifo nonstall isr %08x\n", fifo_intr);
1507 if (fifo_intr & fifo_intr_0_channel_intr_pending_f())
1508 clear_intr |= fifo_channel_isr(g, fifo_intr);
1510 gk20a_writel(g, fifo_intr_0_r(), clear_intr);
1515 int gk20a_fifo_preempt_channel(struct gk20a *g, u32 hw_chid)
1517 struct fifo_gk20a *f = &g->fifo;
1518 unsigned long end_jiffies = jiffies
1519 + msecs_to_jiffies(gk20a_get_gr_idle_timeout(g));
1520 u32 delay = GR_IDLE_CHECK_DEFAULT;
1522 u32 token = PMU_INVALID_MUTEX_OWNER_ID;
1526 gk20a_dbg_fn("%d", hw_chid);
1528 /* we have no idea which runlist we are using. lock all */
1529 for (i = 0; i < g->fifo.max_runlists; i++)
1530 mutex_lock(&f->runlist_info[i].mutex);
1532 mutex_ret = pmu_mutex_acquire(&g->pmu, PMU_MUTEX_ID_FIFO, &token);
1535 gk20a_writel(g, fifo_preempt_r(),
1536 fifo_preempt_chid_f(hw_chid) |
1537 fifo_preempt_type_channel_f());
1539 /* wait for preempt */
1542 if (!(gk20a_readl(g, fifo_preempt_r()) &
1543 fifo_preempt_pending_true_f())) {
1548 usleep_range(delay, delay * 2);
1549 delay = min_t(u32, delay << 1, GR_IDLE_CHECK_MAX);
1550 } while (time_before(jiffies, end_jiffies) ||
1551 !tegra_platform_is_silicon());
1554 struct channel_gk20a *ch = &g->fifo.channel[hw_chid];
1556 gk20a_err(dev_from_gk20a(g), "preempt channel %d timeout\n",
1559 gk20a_set_error_notifier(ch,
1560 NVHOST_CHANNEL_FIFO_ERROR_IDLE_TIMEOUT);
1561 gk20a_fifo_recover_ch(g, hw_chid, true);
1565 pmu_mutex_release(&g->pmu, PMU_MUTEX_ID_FIFO, &token);
1567 for (i = 0; i < g->fifo.max_runlists; i++)
1568 mutex_unlock(&f->runlist_info[i].mutex);
1573 int gk20a_fifo_enable_engine_activity(struct gk20a *g,
1574 struct fifo_engine_info_gk20a *eng_info)
1576 u32 token = PMU_INVALID_MUTEX_OWNER_ID;
1582 mutex_ret = pmu_mutex_acquire(&g->pmu, PMU_MUTEX_ID_FIFO, &token);
1584 enable = gk20a_readl(g, fifo_sched_disable_r());
1585 enable &= ~(fifo_sched_disable_true_v() >> eng_info->runlist_id);
1586 gk20a_writel(g, fifo_sched_disable_r(), enable);
1589 pmu_mutex_release(&g->pmu, PMU_MUTEX_ID_FIFO, &token);
1591 gk20a_dbg_fn("done");
1595 int gk20a_fifo_disable_engine_activity(struct gk20a *g,
1596 struct fifo_engine_info_gk20a *eng_info,
1599 u32 gr_stat, pbdma_stat, chan_stat, eng_stat, ctx_stat;
1600 u32 pbdma_chid = ~0, engine_chid = ~0, disable;
1601 u32 token = PMU_INVALID_MUTEX_OWNER_ID;
1608 gk20a_readl(g, fifo_engine_status_r(eng_info->engine_id));
1609 if (fifo_engine_status_engine_v(gr_stat) ==
1610 fifo_engine_status_engine_busy_v() && !wait_for_idle)
1613 mutex_ret = pmu_mutex_acquire(&g->pmu, PMU_MUTEX_ID_FIFO, &token);
1615 disable = gk20a_readl(g, fifo_sched_disable_r());
1616 disable = set_field(disable,
1617 fifo_sched_disable_runlist_m(eng_info->runlist_id),
1618 fifo_sched_disable_runlist_f(fifo_sched_disable_true_v(),
1619 eng_info->runlist_id));
1620 gk20a_writel(g, fifo_sched_disable_r(), disable);
1622 /* chid from pbdma status */
1623 pbdma_stat = gk20a_readl(g, fifo_pbdma_status_r(eng_info->pbdma_id));
1624 chan_stat = fifo_pbdma_status_chan_status_v(pbdma_stat);
1625 if (chan_stat == fifo_pbdma_status_chan_status_valid_v() ||
1626 chan_stat == fifo_pbdma_status_chan_status_chsw_save_v())
1627 pbdma_chid = fifo_pbdma_status_id_v(pbdma_stat);
1628 else if (chan_stat == fifo_pbdma_status_chan_status_chsw_load_v() ||
1629 chan_stat == fifo_pbdma_status_chan_status_chsw_switch_v())
1630 pbdma_chid = fifo_pbdma_status_next_id_v(pbdma_stat);
1632 if (pbdma_chid != ~0) {
1633 err = gk20a_fifo_preempt_channel(g, pbdma_chid);
1638 /* chid from engine status */
1639 eng_stat = gk20a_readl(g, fifo_engine_status_r(eng_info->engine_id));
1640 ctx_stat = fifo_engine_status_ctx_status_v(eng_stat);
1641 if (ctx_stat == fifo_engine_status_ctx_status_valid_v() ||
1642 ctx_stat == fifo_engine_status_ctx_status_ctxsw_save_v())
1643 engine_chid = fifo_engine_status_id_v(eng_stat);
1644 else if (ctx_stat == fifo_engine_status_ctx_status_ctxsw_load_v() ||
1645 ctx_stat == fifo_engine_status_ctx_status_ctxsw_switch_v())
1646 engine_chid = fifo_engine_status_next_id_v(eng_stat);
1648 if (engine_chid != ~0 && engine_chid != pbdma_chid) {
1649 err = gk20a_fifo_preempt_channel(g, engine_chid);
1656 pmu_mutex_release(&g->pmu, PMU_MUTEX_ID_FIFO, &token);
1659 gk20a_dbg_fn("failed");
1660 if (gk20a_fifo_enable_engine_activity(g, eng_info))
1661 gk20a_err(dev_from_gk20a(g),
1662 "failed to enable gr engine activity\n");
1664 gk20a_dbg_fn("done");
1669 static void gk20a_fifo_runlist_reset_engines(struct gk20a *g, u32 runlist_id)
1671 struct fifo_gk20a *f = &g->fifo;
1675 for (i = 0; i < f->max_engines; i++) {
1676 u32 status = gk20a_readl(g, fifo_engine_status_r(i));
1677 bool engine_busy = fifo_engine_status_engine_v(status) ==
1678 fifo_engine_status_engine_busy_v();
1681 (f->engine_info[i].runlist_id == runlist_id))
1684 gk20a_fifo_recover(g, engines, true);
1687 static int gk20a_fifo_runlist_wait_pending(struct gk20a *g, u32 runlist_id)
1689 struct fifo_runlist_info_gk20a *runlist;
1693 runlist = &g->fifo.runlist_info[runlist_id];
1694 remain = wait_event_timeout(runlist->runlist_wq,
1695 ((pending = gk20a_readl(g, fifo_eng_runlist_r(runlist_id)) &
1696 fifo_eng_runlist_pending_true_f()) == 0),
1697 msecs_to_jiffies(gk20a_get_gr_idle_timeout(g)));
1699 if (remain == 0 && pending != 0)
1705 static int gk20a_fifo_update_runlist_locked(struct gk20a *g, u32 runlist_id,
1706 u32 hw_chid, bool add,
1707 bool wait_for_finish)
1710 struct device *d = dev_from_gk20a(g);
1711 struct fifo_gk20a *f = &g->fifo;
1712 struct fifo_runlist_info_gk20a *runlist = NULL;
1713 u32 *runlist_entry_base = NULL;
1714 u32 *runlist_entry = NULL;
1715 phys_addr_t runlist_pa;
1716 u32 old_buf, new_buf;
1719 runlist = &f->runlist_info[runlist_id];
1721 /* valid channel, add/remove it from active list.
1722 Otherwise, keep active list untouched for suspend/resume. */
1723 if (hw_chid != ~0) {
1725 if (test_and_set_bit(hw_chid,
1726 runlist->active_channels) == 1)
1729 if (test_and_clear_bit(hw_chid,
1730 runlist->active_channels) == 0)
1735 old_buf = runlist->cur_buffer;
1736 new_buf = !runlist->cur_buffer;
1738 gk20a_dbg_info("runlist_id : %d, switch to new buffer 0x%16llx",
1739 runlist_id, runlist->mem[new_buf].iova);
1741 runlist_pa = gk20a_get_phys_from_iova(d, runlist->mem[new_buf].iova);
1747 runlist_entry_base = runlist->mem[new_buf].cpuva;
1748 if (!runlist_entry_base) {
1753 if (hw_chid != ~0 || /* add/remove a valid channel */
1754 add /* resume to add all channels back */) {
1755 runlist_entry = runlist_entry_base;
1756 for_each_set_bit(chid,
1757 runlist->active_channels, f->num_channels) {
1758 gk20a_dbg_info("add channel %d to runlist", chid);
1759 runlist_entry[0] = chid;
1760 runlist_entry[1] = 0;
1764 } else /* suspend to remove all channels */
1768 gk20a_writel(g, fifo_runlist_base_r(),
1769 fifo_runlist_base_ptr_f(u64_lo32(runlist_pa >> 12)) |
1770 fifo_runlist_base_target_vid_mem_f());
1773 gk20a_writel(g, fifo_runlist_r(),
1774 fifo_runlist_engine_f(runlist_id) |
1775 fifo_eng_runlist_length_f(count));
1777 if (wait_for_finish) {
1778 ret = gk20a_fifo_runlist_wait_pending(g, runlist_id);
1780 if (ret == -ETIMEDOUT) {
1781 gk20a_err(dev_from_gk20a(g),
1782 "runlist update timeout");
1784 gk20a_fifo_runlist_reset_engines(g, runlist_id);
1786 /* engine reset needs the lock. drop it */
1787 mutex_unlock(&runlist->mutex);
1788 /* wait until the runlist is active again */
1789 ret = gk20a_fifo_runlist_wait_pending(g, runlist_id);
1790 /* get the lock back. at this point everything should
1792 mutex_lock(&runlist->mutex);
1795 gk20a_err(dev_from_gk20a(g),
1796 "runlist update failed: %d", ret);
1797 } else if (ret == -EINTR)
1798 gk20a_err(dev_from_gk20a(g),
1799 "runlist update interrupted");
1802 runlist->cur_buffer = new_buf;
1808 /* add/remove a channel from runlist
1809 special cases below: runlist->active_channels will NOT be changed.
1810 (hw_chid == ~0 && !add) means remove all active channels from runlist.
1811 (hw_chid == ~0 && add) means restore all active channels on runlist. */
1812 int gk20a_fifo_update_runlist(struct gk20a *g, u32 runlist_id, u32 hw_chid,
1813 bool add, bool wait_for_finish)
1815 struct fifo_runlist_info_gk20a *runlist = NULL;
1816 struct fifo_gk20a *f = &g->fifo;
1817 u32 token = PMU_INVALID_MUTEX_OWNER_ID;
1821 runlist = &f->runlist_info[runlist_id];
1823 mutex_lock(&runlist->mutex);
1825 mutex_ret = pmu_mutex_acquire(&g->pmu, PMU_MUTEX_ID_FIFO, &token);
1827 ret = gk20a_fifo_update_runlist_locked(g, runlist_id, hw_chid, add,
1831 pmu_mutex_release(&g->pmu, PMU_MUTEX_ID_FIFO, &token);
1833 mutex_unlock(&runlist->mutex);
1837 int gk20a_fifo_suspend(struct gk20a *g)
1841 /* stop bar1 snooping */
1842 gk20a_writel(g, fifo_bar1_base_r(),
1843 fifo_bar1_base_valid_false_f());
1845 /* disable fifo intr */
1846 gk20a_writel(g, fifo_intr_en_0_r(), 0);
1847 gk20a_writel(g, fifo_intr_en_1_r(), 0);
1849 gk20a_dbg_fn("done");
1853 bool gk20a_fifo_mmu_fault_pending(struct gk20a *g)
1855 if (gk20a_readl(g, fifo_intr_0_r()) &
1856 fifo_intr_0_mmu_fault_pending_f())
1862 int gk20a_fifo_wait_engine_idle(struct gk20a *g)
1864 unsigned long end_jiffies = jiffies +
1865 msecs_to_jiffies(gk20a_get_gr_idle_timeout(g));
1866 unsigned long delay = GR_IDLE_CHECK_DEFAULT;
1867 int ret = -ETIMEDOUT;
1869 struct device *d = dev_from_gk20a(g);
1873 for (i = 0; i < fifo_engine_status__size_1_v(); i++) {
1875 u32 status = gk20a_readl(g, fifo_engine_status_r(i));
1876 if (!fifo_engine_status_engine_v(status)) {
1881 usleep_range(delay, delay * 2);
1882 delay = min_t(unsigned long,
1883 delay << 1, GR_IDLE_CHECK_MAX);
1884 } while (time_before(jiffies, end_jiffies) ||
1885 !tegra_platform_is_silicon());
1887 gk20a_err(d, "cannot idle engine %u\n", i);
1892 gk20a_dbg_fn("done");
1897 void gk20a_init_fifo(struct gpu_ops *gops)
1899 gk20a_init_channel(gops);
1900 gops->fifo.trigger_mmu_fault = gk20a_fifo_trigger_mmu_fault;