summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gv11b/fifo_gv11b.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/nvgpu/gv11b/fifo_gv11b.c')
-rw-r--r--drivers/gpu/nvgpu/gv11b/fifo_gv11b.c88
1 files changed, 88 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/gv11b/fifo_gv11b.c b/drivers/gpu/nvgpu/gv11b/fifo_gv11b.c
index 1bbf09ec..bb9def35 100644
--- a/drivers/gpu/nvgpu/gv11b/fifo_gv11b.c
+++ b/drivers/gpu/nvgpu/gv11b/fifo_gv11b.c
@@ -29,6 +29,7 @@
29#include <nvgpu/hw/gv11b/hw_usermode_gv11b.h> 29#include <nvgpu/hw/gv11b/hw_usermode_gv11b.h>
30#include <nvgpu/hw/gv11b/hw_top_gv11b.h> 30#include <nvgpu/hw/gv11b/hw_top_gv11b.h>
31#include <nvgpu/hw/gv11b/hw_gmmu_gv11b.h> 31#include <nvgpu/hw/gv11b/hw_gmmu_gv11b.h>
32#include <nvgpu/hw/gv11b/hw_mc_gv11b.h>
32 33
33#include "fifo_gv11b.h" 34#include "fifo_gv11b.h"
34#include "subctx_gv11b.h" 35#include "subctx_gv11b.h"
@@ -684,6 +685,92 @@ static void gv11b_fifo_init_pbdma_intr_descs(struct fifo_gk20a *f)
684 pbdma_intr_0_device_pending_f(); 685 pbdma_intr_0_device_pending_f();
685} 686}
686 687
688static u32 gv11b_fifo_intr_0_en_mask(struct gk20a *g)
689{
690 u32 intr_0_en_mask;
691
692 intr_0_en_mask = g->ops.fifo.intr_0_error_mask(g);
693
694 intr_0_en_mask |= fifo_intr_0_runlist_event_pending_f() |
695 fifo_intr_0_pbdma_intr_pending_f();
696
697 return intr_0_en_mask;
698}
699
700int gv11b_init_fifo_reset_enable_hw(struct gk20a *g)
701{
702 u32 intr_stall;
703 u32 mask;
704 u32 timeout;
705 unsigned int i;
706 u32 host_num_pbdma = nvgpu_get_litter_value(g, GPU_LIT_HOST_NUM_PBDMA);
707
708 gk20a_dbg_fn("");
709
710 /* enable pmc pfifo */
711 g->ops.mc.reset(g, mc_enable_pfifo_enabled_f());
712
713 if (g->ops.clock_gating.slcg_ce2_load_gating_prod)
714 g->ops.clock_gating.slcg_ce2_load_gating_prod(g,
715 g->slcg_enabled);
716 if (g->ops.clock_gating.slcg_fifo_load_gating_prod)
717 g->ops.clock_gating.slcg_fifo_load_gating_prod(g,
718 g->slcg_enabled);
719 if (g->ops.clock_gating.blcg_fifo_load_gating_prod)
720 g->ops.clock_gating.blcg_fifo_load_gating_prod(g,
721 g->blcg_enabled);
722
723 /* enable pbdma */
724 mask = 0;
725 for (i = 0; i < host_num_pbdma; ++i)
726 mask |= mc_enable_pb_sel_f(mc_enable_pb_0_enabled_v(), i);
727 gk20a_writel(g, mc_enable_pb_r(), mask);
728
729
730 timeout = gk20a_readl(g, fifo_fb_timeout_r());
731 timeout = set_field(timeout, fifo_fb_timeout_period_m(),
732 fifo_fb_timeout_period_init_f());
733 gk20a_dbg_info("fifo_fb_timeout reg val = 0x%08x", timeout);
734 gk20a_writel(g, fifo_fb_timeout_r(), timeout);
735
736 /* write pbdma timeout value */
737 for (i = 0; i < host_num_pbdma; i++) {
738 timeout = gk20a_readl(g, pbdma_timeout_r(i));
739 timeout = set_field(timeout, pbdma_timeout_period_m(),
740 pbdma_timeout_period_init_f());
741 gk20a_dbg_info("pbdma_timeout reg val = 0x%08x", timeout);
742 gk20a_writel(g, pbdma_timeout_r(i), timeout);
743 }
744 /* clear and enable pbdma interrupt */
745 for (i = 0; i < host_num_pbdma; i++) {
746 gk20a_writel(g, pbdma_intr_0_r(i), 0xFFFFFFFF);
747 gk20a_writel(g, pbdma_intr_1_r(i), 0xFFFFFFFF);
748
749 intr_stall = gk20a_readl(g, pbdma_intr_stall_r(i));
750 gk20a_dbg_info("pbdma id:%u, intr_en_0 0x%08x", i, intr_stall);
751 gk20a_writel(g, pbdma_intr_en_0_r(i), intr_stall);
752
753 intr_stall = gk20a_readl(g, pbdma_intr_stall_1_r(i));
754 gk20a_dbg_info("pbdma id:%u, intr_en_1 0x%08x", i, intr_stall);
755 gk20a_writel(g, pbdma_intr_en_1_r(i), intr_stall);
756 }
757
758 /* clear runlist interrupts */
759 gk20a_writel(g, fifo_intr_runlist_r(), ~0);
760
761 /* clear and enable pfifo interrupt */
762 gk20a_writel(g, fifo_intr_0_r(), 0xFFFFFFFF);
763 mask = gv11b_fifo_intr_0_en_mask(g);
764 gk20a_dbg_info("fifo_intr_en_0 0x%08x", mask);
765 gk20a_writel(g, fifo_intr_en_0_r(), mask);
766 gk20a_dbg_info("fifo_intr_en_1 = 0x80000000");
767 gk20a_writel(g, fifo_intr_en_1_r(), 0x80000000);
768
769 gk20a_dbg_fn("done");
770
771 return 0;
772}
773
687void gv11b_init_fifo(struct gpu_ops *gops) 774void gv11b_init_fifo(struct gpu_ops *gops)
688{ 775{
689 gp10b_init_fifo(gops); 776 gp10b_init_fifo(gops);
@@ -712,4 +799,5 @@ void gv11b_init_fifo(struct gpu_ops *gops)
712 gops->fifo.is_preempt_pending = gv11b_fifo_is_preempt_pending; 799 gops->fifo.is_preempt_pending = gv11b_fifo_is_preempt_pending;
713 gops->fifo.preempt_ch_tsg = gv11b_fifo_preempt_ch_tsg; 800 gops->fifo.preempt_ch_tsg = gv11b_fifo_preempt_ch_tsg;
714 gops->fifo.init_pbdma_intr_descs = gv11b_fifo_init_pbdma_intr_descs; 801 gops->fifo.init_pbdma_intr_descs = gv11b_fifo_init_pbdma_intr_descs;
802 gops->fifo.reset_enable_hw = gv11b_init_fifo_reset_enable_hw;
715} 803}