summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/fifo_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/fifo_gk20a.c62
1 files changed, 32 insertions, 30 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c
index 6c4f12df..35a07439 100644
--- a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c
@@ -726,8 +726,6 @@ clean_up_runlist:
726 return -ENOMEM; 726 return -ENOMEM;
727} 727}
728 728
729#define GRFIFO_TIMEOUT_CHECK_PERIOD_US 100000
730
731u32 gk20a_fifo_intr_0_error_mask(struct gk20a *g) 729u32 gk20a_fifo_intr_0_error_mask(struct gk20a *g)
732{ 730{
733 u32 intr_0_error_mask = 731 u32 intr_0_error_mask =
@@ -765,6 +763,7 @@ int gk20a_init_fifo_reset_enable_hw(struct gk20a *g)
765 u32 host_num_pbdma = nvgpu_get_litter_value(g, GPU_LIT_HOST_NUM_PBDMA); 763 u32 host_num_pbdma = nvgpu_get_litter_value(g, GPU_LIT_HOST_NUM_PBDMA);
766 764
767 gk20a_dbg_fn(""); 765 gk20a_dbg_fn("");
766
768 /* enable pmc pfifo */ 767 /* enable pmc pfifo */
769 g->ops.mc.reset(g, mc_enable_pfifo_enabled_f()); 768 g->ops.mc.reset(g, mc_enable_pfifo_enabled_f());
770 769
@@ -784,36 +783,10 @@ int gk20a_init_fifo_reset_enable_hw(struct gk20a *g)
784 mask |= mc_enable_pb_sel_f(mc_enable_pb_0_enabled_v(), i); 783 mask |= mc_enable_pb_sel_f(mc_enable_pb_0_enabled_v(), i);
785 gk20a_writel(g, mc_enable_pb_r(), mask); 784 gk20a_writel(g, mc_enable_pb_r(), mask);
786 785
787 /* enable pfifo interrupt */
788 gk20a_writel(g, fifo_intr_0_r(), 0xFFFFFFFF);
789 gk20a_writel(g, fifo_intr_en_0_r(), gk20a_fifo_intr_0_en_mask(g));
790 gk20a_writel(g, fifo_intr_en_1_r(), 0x80000000);
791
792 /* enable pbdma interrupt */
793 mask = 0;
794 for (i = 0; i < host_num_pbdma; i++) {
795 intr_stall = gk20a_readl(g, pbdma_intr_stall_r(i));
796 intr_stall &= ~pbdma_intr_stall_lbreq_enabled_f();
797 gk20a_writel(g, pbdma_intr_stall_r(i), intr_stall);
798 gk20a_writel(g, pbdma_intr_0_r(i), 0xFFFFFFFF);
799 gk20a_writel(g, pbdma_intr_en_0_r(i),
800 ~pbdma_intr_en_0_lbreq_enabled_f());
801 gk20a_writel(g, pbdma_intr_1_r(i), 0xFFFFFFFF);
802 gk20a_writel(g, pbdma_intr_en_1_r(i),
803 ~pbdma_intr_en_0_lbreq_enabled_f());
804 }
805
806 /* TBD: apply overrides */
807
808 /* TBD: BLCG prod */
809
810 /* reset runlist interrupts */
811 gk20a_writel(g, fifo_intr_runlist_r(), ~0);
812
813 /* TBD: do we need those? */
814 timeout = gk20a_readl(g, fifo_fb_timeout_r()); 786 timeout = gk20a_readl(g, fifo_fb_timeout_r());
815 timeout = set_field(timeout, fifo_fb_timeout_period_m(), 787 timeout = set_field(timeout, fifo_fb_timeout_period_m(),
816 fifo_fb_timeout_period_max_f()); 788 fifo_fb_timeout_period_max_f());
789 gk20a_dbg_info("fifo_fb_timeout reg val = 0x%08x", timeout);
817 gk20a_writel(g, fifo_fb_timeout_r(), timeout); 790 gk20a_writel(g, fifo_fb_timeout_r(), timeout);
818 791
819 /* write pbdma timeout value */ 792 /* write pbdma timeout value */
@@ -821,9 +794,9 @@ int gk20a_init_fifo_reset_enable_hw(struct gk20a *g)
821 timeout = gk20a_readl(g, pbdma_timeout_r(i)); 794 timeout = gk20a_readl(g, pbdma_timeout_r(i));
822 timeout = set_field(timeout, pbdma_timeout_period_m(), 795 timeout = set_field(timeout, pbdma_timeout_period_m(),
823 pbdma_timeout_period_max_f()); 796 pbdma_timeout_period_max_f());
797 gk20a_dbg_info("pbdma_timeout reg val = 0x%08x", timeout);
824 gk20a_writel(g, pbdma_timeout_r(i), timeout); 798 gk20a_writel(g, pbdma_timeout_r(i), timeout);
825 } 799 }
826
827 if (g->ops.fifo.apply_pb_timeout) 800 if (g->ops.fifo.apply_pb_timeout)
828 g->ops.fifo.apply_pb_timeout(g); 801 g->ops.fifo.apply_pb_timeout(g);
829 802
@@ -833,6 +806,34 @@ int gk20a_init_fifo_reset_enable_hw(struct gk20a *g)
833 timeout |= fifo_eng_timeout_detection_enabled_f(); 806 timeout |= fifo_eng_timeout_detection_enabled_f();
834 gk20a_writel(g, fifo_eng_timeout_r(), timeout); 807 gk20a_writel(g, fifo_eng_timeout_r(), timeout);
835 808
809 /* clear and enable pbdma interrupt */
810 for (i = 0; i < host_num_pbdma; i++) {
811 gk20a_writel(g, pbdma_intr_0_r(i), 0xFFFFFFFF);
812 gk20a_writel(g, pbdma_intr_1_r(i), 0xFFFFFFFF);
813
814 intr_stall = gk20a_readl(g, pbdma_intr_stall_r(i));
815 intr_stall &= ~pbdma_intr_stall_lbreq_enabled_f();
816 gk20a_writel(g, pbdma_intr_stall_r(i), intr_stall);
817 gk20a_dbg_info("pbdma id:%u, intr_en_0 0x%08x", i, intr_stall);
818 gk20a_writel(g, pbdma_intr_en_0_r(i), intr_stall);
819
820 gk20a_dbg_info("pbdma id:%u, intr_en_1 0x%08x", i,
821 ~pbdma_intr_en_0_lbreq_enabled_f());
822 gk20a_writel(g, pbdma_intr_en_1_r(i),
823 ~pbdma_intr_en_0_lbreq_enabled_f());
824 }
825
826 /* reset runlist interrupts */
827 gk20a_writel(g, fifo_intr_runlist_r(), ~0);
828
829 /* clear and enable pfifo interrupt */
830 gk20a_writel(g, fifo_intr_0_r(), 0xFFFFFFFF);
831 mask = gk20a_fifo_intr_0_en_mask(g);
832 gk20a_dbg_info("fifo_intr_en_0 0x%08x", mask);
833 gk20a_writel(g, fifo_intr_en_0_r(), mask);
834 gk20a_dbg_info("fifo_intr_en_1 = 0x80000000");
835 gk20a_writel(g, fifo_intr_en_1_r(), 0x80000000);
836
836 gk20a_dbg_fn("done"); 837 gk20a_dbg_fn("done");
837 838
838 return 0; 839 return 0;
@@ -3881,4 +3882,5 @@ void gk20a_init_fifo(struct gpu_ops *gops)
3881 gops->fifo.intr_0_error_mask = gk20a_fifo_intr_0_error_mask; 3882 gops->fifo.intr_0_error_mask = gk20a_fifo_intr_0_error_mask;
3882 gops->fifo.is_preempt_pending = gk20a_fifo_is_preempt_pending; 3883 gops->fifo.is_preempt_pending = gk20a_fifo_is_preempt_pending;
3883 gops->fifo.init_pbdma_intr_descs = gk20a_fifo_init_pbdma_intr_descs; 3884 gops->fifo.init_pbdma_intr_descs = gk20a_fifo_init_pbdma_intr_descs;
3885 gops->fifo.reset_enable_hw = gk20a_init_fifo_reset_enable_hw;
3884} 3886}