summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/flcn_gk20a.c
diff options
context:
space:
mode:
authorMahantesh Kumbar <mkumbar@nvidia.com>2017-07-07 12:05:46 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2017-09-25 03:18:57 -0400
commit5a1165d984f3f0001621bbde152cbf9650010895 (patch)
treef9de71a2463c2c09c7e4f2a862869ff1ca0c9b0d /drivers/gpu/nvgpu/gk20a/flcn_gk20a.c
parent908486b806d584082fe85cc74aa708cc619e1d99 (diff)
gpu: nvgpu: falcon status dump support
- Added support to dump flacon controller status - Method to print recent PC history to know call trace - Method to dump IMBLK info - Updated falcon hw header files to include registers of PC trace & IMBLK JIRA NVGPU-105 Change-Id: Id4aaafd87113d47e552afb21b87f8b087d36004e Signed-off-by: Mahantesh Kumbar <mkumbar@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/1515371 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: svc-mobile-coverity <svc-mobile-coverity@nvidia.com> Reviewed-by: svccoveritychecker <svccoveritychecker@nvidia.com> GVS: Gerrit_Virtual_Submit Reviewed-by: Vijayakumar Subbu <vsubbu@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/flcn_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/flcn_gk20a.c177
1 files changed, 176 insertions, 1 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/flcn_gk20a.c b/drivers/gpu/nvgpu/gk20a/flcn_gk20a.c
index a21342c5..8a3c90d8 100644
--- a/drivers/gpu/nvgpu/gk20a/flcn_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/flcn_gk20a.c
@@ -15,7 +15,7 @@
15 15
16#include "gk20a/gk20a.h" 16#include "gk20a/gk20a.h"
17 17
18#include <nvgpu/hw/gk20a/hw_falcon_gk20a.h> 18#include <nvgpu/hw/gm20b/hw_falcon_gm20b.h>
19 19
20static int gk20a_flcn_reset(struct nvgpu_falcon *flcn) 20static int gk20a_flcn_reset(struct nvgpu_falcon *flcn)
21{ 21{
@@ -344,6 +344,180 @@ static int gk20a_falcon_bootstrap(struct nvgpu_falcon *flcn,
344 return 0; 344 return 0;
345} 345}
346 346
347static void gk20a_falcon_dump_imblk(struct nvgpu_falcon *flcn)
348{
349 struct gk20a *g = flcn->g;
350 u32 base_addr = flcn->flcn_base;
351 u32 i = 0, j = 0;
352 u32 data[8] = {0};
353 u32 block_count = 0;
354
355 block_count = falcon_falcon_hwcfg_imem_size_v(gk20a_readl(g,
356 flcn->flcn_base + falcon_falcon_hwcfg_r()));
357
358 /* block_count must be multiple of 8 */
359 block_count &= ~0x7;
360 nvgpu_err(g, "FALCON IMEM BLK MAPPING (PA->VA) (%d TOTAL):",
361 block_count);
362
363 for (i = 0; i < block_count; i += 8) {
364 for (j = 0; j < 8; j++) {
365 gk20a_writel(g, flcn->flcn_base +
366 falcon_falcon_imctl_debug_r(),
367 falcon_falcon_imctl_debug_cmd_f(0x2) |
368 falcon_falcon_imctl_debug_addr_blk_f(i + j));
369
370 data[j] = gk20a_readl(g, base_addr +
371 falcon_falcon_imstat_r());
372 }
373
374 nvgpu_err(g, " %#04x: %#010x %#010x %#010x %#010x",
375 i, data[0], data[1], data[2], data[3]);
376 nvgpu_err(g, " %#04x: %#010x %#010x %#010x %#010x",
377 i + 4, data[4], data[5], data[6], data[7]);
378 }
379}
380
381static void gk20a_falcon_dump_pc_trace(struct nvgpu_falcon *flcn)
382{
383 struct gk20a *g = flcn->g;
384 u32 base_addr = flcn->flcn_base;
385 u32 trace_pc_count = 0;
386 u32 pc = 0;
387 u32 i = 0;
388
389 if (gk20a_readl(g, base_addr + falcon_falcon_sctl_r()) & 0x02) {
390 nvgpu_err(g, " falcon is in HS mode, PC TRACE dump not supported");
391 return;
392 }
393
394 trace_pc_count = falcon_falcon_traceidx_maxidx_v(gk20a_readl(g,
395 base_addr + falcon_falcon_traceidx_r()));
396 nvgpu_err(g,
397 "PC TRACE (TOTAL %d ENTRIES. entry 0 is the most recent branch):",
398 trace_pc_count);
399
400 for (i = 0; i < trace_pc_count; i++) {
401 gk20a_writel(g, base_addr + falcon_falcon_traceidx_r(),
402 falcon_falcon_traceidx_idx_f(i));
403
404 pc = falcon_falcon_tracepc_pc_v(gk20a_readl(g,
405 base_addr + falcon_falcon_tracepc_r()));
406 nvgpu_err(g, "FALCON_TRACEPC(%d) : %#010x", i, pc);
407 }
408}
409
410void gk20a_falcon_dump_stats(struct nvgpu_falcon *flcn)
411{
412 struct gk20a *g = flcn->g;
413 u32 base_addr = flcn->flcn_base;
414 unsigned int i;
415
416 nvgpu_err(g, "<<< FALCON id-%d DEBUG INFORMATION - START >>>",
417 flcn->flcn_id);
418
419 /* imblk dump */
420 gk20a_falcon_dump_imblk(flcn);
421 /* PC trace dump */
422 gk20a_falcon_dump_pc_trace(flcn);
423
424 nvgpu_err(g, "FALCON ICD REGISTERS DUMP");
425
426 for (i = 0; i < 4; i++) {
427 gk20a_writel(g, base_addr + falcon_falcon_icd_cmd_r(),
428 falcon_falcon_icd_cmd_opc_rreg_f() |
429 falcon_falcon_icd_cmd_idx_f(FALCON_REG_PC));
430 nvgpu_err(g, "FALCON_REG_PC : 0x%x",
431 gk20a_readl(g, base_addr +
432 falcon_falcon_icd_rdata_r()));
433
434 gk20a_writel(g, base_addr + falcon_falcon_icd_cmd_r(),
435 falcon_falcon_icd_cmd_opc_rreg_f() |
436 falcon_falcon_icd_cmd_idx_f(FALCON_REG_SP));
437 nvgpu_err(g, "FALCON_REG_SP : 0x%x",
438 gk20a_readl(g, base_addr +
439 falcon_falcon_icd_rdata_r()));
440 }
441
442 gk20a_writel(g, base_addr + falcon_falcon_icd_cmd_r(),
443 falcon_falcon_icd_cmd_opc_rreg_f() |
444 falcon_falcon_icd_cmd_idx_f(FALCON_REG_IMB));
445 nvgpu_err(g, "FALCON_REG_IMB : 0x%x",
446 gk20a_readl(g, base_addr + falcon_falcon_icd_rdata_r()));
447
448 gk20a_writel(g, base_addr + falcon_falcon_icd_cmd_r(),
449 falcon_falcon_icd_cmd_opc_rreg_f() |
450 falcon_falcon_icd_cmd_idx_f(FALCON_REG_DMB));
451 nvgpu_err(g, "FALCON_REG_DMB : 0x%x",
452 gk20a_readl(g, base_addr + falcon_falcon_icd_rdata_r()));
453
454 gk20a_writel(g, base_addr + falcon_falcon_icd_cmd_r(),
455 falcon_falcon_icd_cmd_opc_rreg_f() |
456 falcon_falcon_icd_cmd_idx_f(FALCON_REG_CSW));
457 nvgpu_err(g, "FALCON_REG_CSW : 0x%x",
458 gk20a_readl(g, base_addr + falcon_falcon_icd_rdata_r()));
459
460 gk20a_writel(g, base_addr + falcon_falcon_icd_cmd_r(),
461 falcon_falcon_icd_cmd_opc_rreg_f() |
462 falcon_falcon_icd_cmd_idx_f(FALCON_REG_CTX));
463 nvgpu_err(g, "FALCON_REG_CTX : 0x%x",
464 gk20a_readl(g, base_addr + falcon_falcon_icd_rdata_r()));
465
466 gk20a_writel(g, base_addr + falcon_falcon_icd_cmd_r(),
467 falcon_falcon_icd_cmd_opc_rreg_f() |
468 falcon_falcon_icd_cmd_idx_f(FALCON_REG_EXCI));
469 nvgpu_err(g, "FALCON_REG_EXCI : 0x%x",
470 gk20a_readl(g, base_addr + falcon_falcon_icd_rdata_r()));
471
472 for (i = 0; i < 6; i++) {
473 gk20a_writel(g, base_addr + falcon_falcon_icd_cmd_r(),
474 falcon_falcon_icd_cmd_opc_rreg_f() |
475 falcon_falcon_icd_cmd_idx_f(
476 falcon_falcon_icd_cmd_opc_rstat_f()));
477 nvgpu_err(g, "FALCON_REG_RSTAT[%d] : 0x%x", i,
478 gk20a_readl(g, base_addr +
479 falcon_falcon_icd_rdata_r()));
480 }
481
482 nvgpu_err(g, " FALCON REGISTERS DUMP");
483 nvgpu_err(g, "falcon_falcon_os_r : %d",
484 gk20a_readl(g, base_addr + falcon_falcon_os_r()));
485 nvgpu_err(g, "falcon_falcon_cpuctl_r : 0x%x",
486 gk20a_readl(g, base_addr + falcon_falcon_cpuctl_r()));
487 nvgpu_err(g, "falcon_falcon_idlestate_r : 0x%x",
488 gk20a_readl(g, base_addr + falcon_falcon_idlestate_r()));
489 nvgpu_err(g, "falcon_falcon_mailbox0_r : 0x%x",
490 gk20a_readl(g, base_addr + falcon_falcon_mailbox0_r()));
491 nvgpu_err(g, "falcon_falcon_mailbox1_r : 0x%x",
492 gk20a_readl(g, base_addr + falcon_falcon_mailbox1_r()));
493 nvgpu_err(g, "falcon_falcon_irqstat_r : 0x%x",
494 gk20a_readl(g, base_addr + falcon_falcon_irqstat_r()));
495 nvgpu_err(g, "falcon_falcon_irqmode_r : 0x%x",
496 gk20a_readl(g, base_addr + falcon_falcon_irqmode_r()));
497 nvgpu_err(g, "falcon_falcon_irqmask_r : 0x%x",
498 gk20a_readl(g, base_addr + falcon_falcon_irqmask_r()));
499 nvgpu_err(g, "falcon_falcon_irqdest_r : 0x%x",
500 gk20a_readl(g, base_addr + falcon_falcon_irqdest_r()));
501 nvgpu_err(g, "falcon_falcon_debug1_r : 0x%x",
502 gk20a_readl(g, base_addr + falcon_falcon_debug1_r()));
503 nvgpu_err(g, "falcon_falcon_debuginfo_r : 0x%x",
504 gk20a_readl(g, base_addr + falcon_falcon_debuginfo_r()));
505 nvgpu_err(g, "falcon_falcon_bootvec_r : 0x%x",
506 gk20a_readl(g, base_addr + falcon_falcon_bootvec_r()));
507 nvgpu_err(g, "falcon_falcon_hwcfg_r : 0x%x",
508 gk20a_readl(g, base_addr + falcon_falcon_hwcfg_r()));
509 nvgpu_err(g, "falcon_falcon_engctl_r : 0x%x",
510 gk20a_readl(g, base_addr + falcon_falcon_engctl_r()));
511 nvgpu_err(g, "falcon_falcon_curctx_r : 0x%x",
512 gk20a_readl(g, base_addr + falcon_falcon_curctx_r()));
513 nvgpu_err(g, "falcon_falcon_nxtctx_r : 0x%x",
514 gk20a_readl(g, base_addr + falcon_falcon_nxtctx_r()));
515 nvgpu_err(g, "falcon_falcon_exterrstat_r : 0x%x",
516 gk20a_readl(g, base_addr + falcon_falcon_exterrstat_r()));
517 nvgpu_err(g, "falcon_falcon_exterraddr_r : 0x%x",
518 gk20a_readl(g, base_addr + falcon_falcon_exterraddr_r()));
519}
520
347static void gk20a_falcon_engine_dependency_ops(struct nvgpu_falcon *flcn) 521static void gk20a_falcon_engine_dependency_ops(struct nvgpu_falcon *flcn)
348{ 522{
349 struct nvgpu_falcon_engine_dependency_ops *flcn_eng_dep_ops = 523 struct nvgpu_falcon_engine_dependency_ops *flcn_eng_dep_ops =
@@ -378,6 +552,7 @@ void gk20a_falcon_ops(struct nvgpu_falcon *flcn)
378 flcn_ops->copy_to_dmem = gk20a_flcn_copy_to_dmem; 552 flcn_ops->copy_to_dmem = gk20a_flcn_copy_to_dmem;
379 flcn_ops->copy_to_imem = gk20a_flcn_copy_to_imem; 553 flcn_ops->copy_to_imem = gk20a_flcn_copy_to_imem;
380 flcn_ops->bootstrap = gk20a_falcon_bootstrap; 554 flcn_ops->bootstrap = gk20a_falcon_bootstrap;
555 flcn_ops->dump_falcon_stats = gk20a_falcon_dump_stats;
381 556
382 gk20a_falcon_engine_dependency_ops(flcn); 557 gk20a_falcon_engine_dependency_ops(flcn);
383} 558}