summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a
diff options
context:
space:
mode:
authorseshendra <sgadagottu@nvidia.com>2019-09-03 13:47:41 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2019-09-06 01:39:24 -0400
commit07ddc5aaad9a89a758cb5fe247c06d845b025e65 (patch)
treebee0c647e6e484d52c8f41971eb625c0f1db91f1 /drivers/gpu/nvgpu/gk20a
parentf57cf74d57718c672b1af8dd957cc8bd9ea3bb6c (diff)
gpu: nvgpu: Enabling/disabling FECS trace support
- To enable FECS trace support, nvgpu should set the MSB of the read pointer (MAILBOX1). - The ucode will check if the feature is enabled/disabled before writing a record into the circular buffer. If the feature is disabled, it will not write the record. - If the feature is enabled and the buffer is not allocated, HW will throw a page fault error. Bug 2459186 Bug 200542611 Change-Id: I6f181643737d1cf1bda02077eaa714a3f4ef3d8c Signed-off-by: seshendra <sgadagottu@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/2189250 Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a')
-rw-r--r--drivers/gpu/nvgpu/gk20a/fecs_trace_gk20a.c63
1 files changed, 62 insertions, 1 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/fecs_trace_gk20a.c b/drivers/gpu/nvgpu/gk20a/fecs_trace_gk20a.c
index 6b384c89..11f1169b 100644
--- a/drivers/gpu/nvgpu/gk20a/fecs_trace_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/fecs_trace_gk20a.c
@@ -1,5 +1,5 @@
1/* 1/*
2 * Copyright (c) 2016-2018, NVIDIA CORPORATION. All rights reserved. 2 * Copyright (c) 2016-2019, NVIDIA CORPORATION. All rights reserved.
3 * 3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a 4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"), 5 * copy of this software and associated documentation files (the "Software"),
@@ -362,6 +362,11 @@ int gk20a_fecs_trace_poll(struct gk20a *g)
362 /* Ensure all FECS writes have made it to SYSMEM */ 362 /* Ensure all FECS writes have made it to SYSMEM */
363 g->ops.mm.fb_flush(g); 363 g->ops.mm.fb_flush(g);
364 364
365 if (nvgpu_is_enabled(g, NVGPU_FECS_TRACE_FEATURE_CONTROL)) {
366 /* Bits 30:0 of MAILBOX1 represents actual read pointer value */
367 read = read & (~(BIT32(NVGPU_FECS_TRACE_FEATURE_CONTROL_BIT)));
368 }
369
365 while (read != write) { 370 while (read != write) {
366 cnt = gk20a_fecs_trace_ring_read(g, read); 371 cnt = gk20a_fecs_trace_ring_read(g, read);
367 if (cnt <= 0) 372 if (cnt <= 0)
@@ -371,6 +376,15 @@ int gk20a_fecs_trace_poll(struct gk20a *g)
371 read = (read + 1) & (GK20A_FECS_TRACE_NUM_RECORDS - 1); 376 read = (read + 1) & (GK20A_FECS_TRACE_NUM_RECORDS - 1);
372 } 377 }
373 378
379 if (nvgpu_is_enabled(g, NVGPU_FECS_TRACE_FEATURE_CONTROL)) {
380 /*
381 * In the next step, read pointer is going to be updated.
382 * So, MSB of read pointer should be set back to 1. This will
383 * keep FECS trace enabled.
384 */
385 read = read | (BIT32(NVGPU_FECS_TRACE_FEATURE_CONTROL_BIT));
386 }
387
374 /* ensure FECS records has been updated before incrementing read index */ 388 /* ensure FECS records has been updated before incrementing read index */
375 nvgpu_wmb(); 389 nvgpu_wmb();
376 gk20a_fecs_trace_set_read_index(g, read); 390 gk20a_fecs_trace_set_read_index(g, read);
@@ -606,8 +620,30 @@ int gk20a_fecs_trace_enable(struct gk20a *g)
606 if (g->ops.fecs_trace.flush) 620 if (g->ops.fecs_trace.flush)
607 g->ops.fecs_trace.flush(g); 621 g->ops.fecs_trace.flush(g);
608 write = gk20a_fecs_trace_get_write_index(g); 622 write = gk20a_fecs_trace_get_write_index(g);
623
624 if (nvgpu_is_enabled(g, NVGPU_FECS_TRACE_FEATURE_CONTROL)) {
625 /*
626 * For enabling FECS trace support, MAILBOX1's MSB
627 * (Bit 31:31) should be set to 1. Bits 30:0 represents
628 * actual pointer value.
629 */
630 write = write |
631 (BIT32(NVGPU_FECS_TRACE_FEATURE_CONTROL_BIT));
632 }
609 gk20a_fecs_trace_set_read_index(g, write); 633 gk20a_fecs_trace_set_read_index(g, write);
610 634
635 /*
636 * FECS ucode does a priv holdoff around the assertion of
637 * context reset. So, pri transactions (e.g. mailbox1 register
638 * write) might fail due to this. Hence, do write with ack
639 * i.e. write and read it back to make sure write happened for
640 * mailbox1.
641 */
642 while (gk20a_fecs_trace_get_read_index(g) != write) {
643 nvgpu_log(g, gpu_dbg_ctxsw, "mailbox1 update failed");
644 gk20a_fecs_trace_set_read_index(g, write);
645 }
646
611 err = nvgpu_thread_create(&trace->poll_task, g, 647 err = nvgpu_thread_create(&trace->poll_task, g,
612 gk20a_fecs_trace_periodic_polling, __func__); 648 gk20a_fecs_trace_periodic_polling, __func__);
613 if (err) { 649 if (err) {
@@ -622,10 +658,35 @@ int gk20a_fecs_trace_enable(struct gk20a *g)
622int gk20a_fecs_trace_disable(struct gk20a *g) 658int gk20a_fecs_trace_disable(struct gk20a *g)
623{ 659{
624 struct gk20a_fecs_trace *trace = g->fecs_trace; 660 struct gk20a_fecs_trace *trace = g->fecs_trace;
661 int read = 0;
625 662
626 if (nvgpu_thread_is_running(&trace->poll_task)) 663 if (nvgpu_thread_is_running(&trace->poll_task))
627 nvgpu_thread_stop(&trace->poll_task); 664 nvgpu_thread_stop(&trace->poll_task);
628 665
666 if (nvgpu_is_enabled(g, NVGPU_FECS_TRACE_FEATURE_CONTROL)) {
667 /*
668 * For disabling FECS trace support, MAILBOX1's MSB
669 * (Bit 31:31) should be set to 0.
670 */
671 read = gk20a_fecs_trace_get_read_index(g) &
672 (~(BIT32(NVGPU_FECS_TRACE_FEATURE_CONTROL_BIT)));
673
674 gk20a_fecs_trace_set_read_index(g, read);
675
676 /*
677 * FECS ucode does a priv holdoff around the assertion
678 * of context reset. So, pri transactions (e.g.
679 * mailbox1 register write) might fail due to this.
680 * Hence, do write with ack i.e. write and read it back
681 * to make sure write happened for mailbox1.
682 */
683 while (gk20a_fecs_trace_get_read_index(g) != read) {
684 nvgpu_log(g, gpu_dbg_ctxsw,
685 "mailbox1 update failed");
686 gk20a_fecs_trace_set_read_index(g, read);
687 }
688 }
689
629 return -EPERM; 690 return -EPERM;
630} 691}
631 692