summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gp10b/mc_gp10b.c
diff options
context:
space:
mode:
authorMahantesh Kumbar <mkumbar@nvidia.com>2014-12-09 01:18:54 -0500
committerDeepak Nibade <dnibade@nvidia.com>2016-12-27 04:52:03 -0500
commitd40f3fb2731b9e0586677026dcdeaabf63398933 (patch)
treebfdb5333339f4afc2d5b0a0a351258a09eb7c45f /drivers/gpu/nvgpu/gp10b/mc_gp10b.c
parent5452d161544f40778f75dda06bfddb14bcb48707 (diff)
gpu: nvgpu: Handle MC pmu interrupts
- Made changes to MC to get pmu interrrupts Change-Id: I07aaec8392b1fbb34ae727bc7547a571aaeeb814 Signed-off-by: Mahantesh Kumbar <mkumbar@nvidia.com> Reviewed-on: http://git-master/r/661212 Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com> Tested-by: Bharat Nihalani <bnihalani@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gp10b/mc_gp10b.c')
-rw-r--r--drivers/gpu/nvgpu/gp10b/mc_gp10b.c65
1 files changed, 43 insertions, 22 deletions
diff --git a/drivers/gpu/nvgpu/gp10b/mc_gp10b.c b/drivers/gpu/nvgpu/gp10b/mc_gp10b.c
index 3fae4ea3..c7a4bc75 100644
--- a/drivers/gpu/nvgpu/gp10b/mc_gp10b.c
+++ b/drivers/gpu/nvgpu/gp10b/mc_gp10b.c
@@ -23,17 +23,44 @@ void mc_gp10b_intr_enable(struct gk20a *g)
23{ 23{
24 u32 eng_intr_mask = gk20a_fifo_engine_interrupt_mask(g); 24 u32 eng_intr_mask = gk20a_fifo_engine_interrupt_mask(g);
25 25
26 gk20a_writel(g, mc_intr_en_clear_r(0), 0xffffffff); 26 gk20a_writel(g, mc_intr_en_clear_r(NVGPU_MC_INTR_STALLING),
27 gk20a_writel(g, mc_intr_en_set_r(0), 27 0xffffffff);
28 mc_intr_pfifo_pending_f() 28 g->ops.mc.intr_mask_restore[NVGPU_MC_INTR_STALLING] =
29 | eng_intr_mask); 29 mc_intr_pfifo_pending_f()
30 gk20a_writel(g, mc_intr_en_clear_r(1), 0xffffffff); 30 | eng_intr_mask;
31 gk20a_writel(g, mc_intr_en_set_r(1), 31 gk20a_writel(g, mc_intr_en_set_r(NVGPU_MC_INTR_STALLING),
32 mc_intr_pfifo_pending_f() 32 g->ops.mc.intr_mask_restore[NVGPU_MC_INTR_STALLING]);
33 | mc_intr_priv_ring_pending_f() 33
34 | mc_intr_ltc_pending_f() 34 gk20a_writel(g, mc_intr_en_clear_r(NVGPU_MC_INTR_NONSTALLING),
35 | mc_intr_pbus_pending_f() 35 0xffffffff);
36 | eng_intr_mask); 36 g->ops.mc.intr_mask_restore[NVGPU_MC_INTR_NONSTALLING] =
37 mc_intr_pfifo_pending_f()
38 | mc_intr_priv_ring_pending_f()
39 | mc_intr_ltc_pending_f()
40 | mc_intr_pbus_pending_f()
41 | eng_intr_mask;
42 gk20a_writel(g, mc_intr_en_set_r(NVGPU_MC_INTR_NONSTALLING),
43 g->ops.mc.intr_mask_restore[NVGPU_MC_INTR_NONSTALLING]);
44}
45
46void mc_gp10b_intr_unit_config(struct gk20a *g, bool enable,
47 bool is_stalling, u32 mask)
48{
49 u32 intr_index = 0;
50 u32 reg = 0;
51
52 intr_index = (is_stalling ? NVGPU_MC_INTR_STALLING :
53 NVGPU_MC_INTR_NONSTALLING);
54 if (enable) {
55 reg = mc_intr_en_set_r(intr_index);
56 g->ops.mc.intr_mask_restore[intr_index] |= mask;
57
58 } else {
59 reg = mc_intr_en_clear_r(intr_index);
60 g->ops.mc.intr_mask_restore[intr_index] &= ~mask;
61 }
62
63 gk20a_writel(g, reg, mask);
37} 64}
38 65
39irqreturn_t mc_gp10b_isr_stall(struct gk20a *g) 66irqreturn_t mc_gp10b_isr_stall(struct gk20a *g)
@@ -73,7 +100,6 @@ irqreturn_t mc_gp10b_isr_nonstall(struct gk20a *g)
73irqreturn_t mc_gp10b_intr_thread_stall(struct gk20a *g) 100irqreturn_t mc_gp10b_intr_thread_stall(struct gk20a *g)
74{ 101{
75 u32 mc_intr_0; 102 u32 mc_intr_0;
76 u32 eng_intr_mask = gk20a_fifo_engine_interrupt_mask(g);
77 103
78 gk20a_dbg(gpu_dbg_intr, "interrupt thread launched"); 104 gk20a_dbg(gpu_dbg_intr, "interrupt thread launched");
79 105
@@ -94,9 +120,8 @@ irqreturn_t mc_gp10b_intr_thread_stall(struct gk20a *g)
94 if (mc_intr_0 & mc_intr_pbus_pending_f()) 120 if (mc_intr_0 & mc_intr_pbus_pending_f())
95 gk20a_pbus_isr(g); 121 gk20a_pbus_isr(g);
96 122
97 gk20a_writel(g, mc_intr_en_set_r(0), 123 gk20a_writel(g, mc_intr_en_set_r(NVGPU_MC_INTR_STALLING),
98 mc_intr_pfifo_pending_f() 124 g->ops.mc.intr_mask_restore[NVGPU_MC_INTR_STALLING]);
99 | eng_intr_mask);
100 125
101 return IRQ_HANDLED; 126 return IRQ_HANDLED;
102} 127}
@@ -104,7 +129,6 @@ irqreturn_t mc_gp10b_intr_thread_stall(struct gk20a *g)
104irqreturn_t mc_gp10b_intr_thread_nonstall(struct gk20a *g) 129irqreturn_t mc_gp10b_intr_thread_nonstall(struct gk20a *g)
105{ 130{
106 u32 mc_intr_1; 131 u32 mc_intr_1;
107 u32 eng_intr_mask = gk20a_fifo_engine_interrupt_mask(g);
108 132
109 gk20a_dbg(gpu_dbg_intr, "interrupt thread launched"); 133 gk20a_dbg(gpu_dbg_intr, "interrupt thread launched");
110 134
@@ -117,12 +141,8 @@ irqreturn_t mc_gp10b_intr_thread_nonstall(struct gk20a *g)
117 if (mc_intr_1 & BIT(g->fifo.engine_info[ENGINE_GR_GK20A].intr_id)) 141 if (mc_intr_1 & BIT(g->fifo.engine_info[ENGINE_GR_GK20A].intr_id))
118 gk20a_gr_nonstall_isr(g); 142 gk20a_gr_nonstall_isr(g);
119 143
120 gk20a_writel(g, mc_intr_en_set_r(1), 144 gk20a_writel(g, mc_intr_en_set_r(NVGPU_MC_INTR_NONSTALLING),
121 mc_intr_pfifo_pending_f() 145 g->ops.mc.intr_mask_restore[NVGPU_MC_INTR_NONSTALLING]);
122 | mc_intr_priv_ring_pending_f()
123 | mc_intr_ltc_pending_f()
124 | mc_intr_pbus_pending_f()
125 | eng_intr_mask);
126 146
127 return IRQ_HANDLED; 147 return IRQ_HANDLED;
128} 148}
@@ -130,6 +150,7 @@ irqreturn_t mc_gp10b_intr_thread_nonstall(struct gk20a *g)
130void gp10b_init_mc(struct gpu_ops *gops) 150void gp10b_init_mc(struct gpu_ops *gops)
131{ 151{
132 gops->mc.intr_enable = mc_gp10b_intr_enable; 152 gops->mc.intr_enable = mc_gp10b_intr_enable;
153 gops->mc.intr_unit_config = mc_gp10b_intr_unit_config;
133 gops->mc.isr_stall = mc_gp10b_isr_stall; 154 gops->mc.isr_stall = mc_gp10b_isr_stall;
134 gops->mc.isr_nonstall = mc_gp10b_isr_nonstall; 155 gops->mc.isr_nonstall = mc_gp10b_isr_nonstall;
135 gops->mc.isr_thread_stall = mc_gp10b_intr_thread_stall; 156 gops->mc.isr_thread_stall = mc_gp10b_intr_thread_stall;