summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/mc_gk20a.c
diff options
context:
space:
mode:
authorLakshmanan M <lm@nvidia.com>2016-06-02 00:04:46 -0400
committerTerje Bergstrom <tbergstrom@nvidia.com>2016-06-07 15:31:34 -0400
commit6299b00beb9dabdd53c211b02658d022827b3232 (patch)
tree941d8dd8aae8f7f8c73329e182984c36a5a9bf88 /drivers/gpu/nvgpu/gk20a/mc_gk20a.c
parent3d7263d3cafdcfc57a6d6b9f829562845d116294 (diff)
gpu: nvgpu: Add multiple engine and runlist support
This CL covers the following modification, 1) Added multiple engine_info support 2) Added multiple runlist_info support 3) Initial changes for ASYNC CE support 4) Added ASYNC CE interrupt handling support for gm206 GPU family 5) Added generic mechanism to identify the CE engine pri_base address for gm206 (CE0, CE1 and CE2) 6) Removed hard coded engine_id logic and made generic way 7) Code cleanup for readability JIRA DNVGPU-26 Change-Id: I2c3846c40bcc8d10c2dfb225caa4105fc9123b65 Signed-off-by: Lakshmanan M <lm@nvidia.com> Reviewed-on: http://git-master/r/1155963 Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com> Tested-by: Terje Bergstrom <tbergstrom@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/mc_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/mc_gk20a.c57
1 files changed, 47 insertions, 10 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/mc_gk20a.c b/drivers/gpu/nvgpu/gk20a/mc_gk20a.c
index 70da7a02..57368235 100644
--- a/drivers/gpu/nvgpu/gk20a/mc_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/mc_gk20a.c
@@ -74,6 +74,9 @@ irqreturn_t mc_gk20a_intr_thread_stall(struct gk20a *g)
74{ 74{
75 u32 mc_intr_0; 75 u32 mc_intr_0;
76 int hw_irq_count; 76 int hw_irq_count;
77 u32 engine_id_idx;
78 u32 active_engine_id = 0;
79 u32 engine_enum = ENGINE_INVAL_GK20A;
77 80
78 gk20a_dbg(gpu_dbg_intr, "interrupt thread launched"); 81 gk20a_dbg(gpu_dbg_intr, "interrupt thread launched");
79 82
@@ -84,11 +87,26 @@ irqreturn_t mc_gk20a_intr_thread_stall(struct gk20a *g)
84 87
85 gk20a_dbg(gpu_dbg_intr, "stall intr %08x\n", mc_intr_0); 88 gk20a_dbg(gpu_dbg_intr, "stall intr %08x\n", mc_intr_0);
86 89
87 if (mc_intr_0 & g->fifo.engine_info[ENGINE_GR_GK20A].intr_mask) 90 for (engine_id_idx = 0; engine_id_idx < g->fifo.num_engines; engine_id_idx++) {
88 gr_gk20a_elpg_protected_call(g, gk20a_gr_isr(g)); 91 active_engine_id = g->fifo.active_engines_list[engine_id_idx];
89 if (mc_intr_0 & g->fifo.engine_info[ENGINE_CE2_GK20A].intr_mask 92
90 && g->ops.ce2.isr_stall) 93 if (mc_intr_0 & g->fifo.engine_info[active_engine_id].intr_mask) {
91 g->ops.ce2.isr_stall(g); 94 engine_enum = g->fifo.engine_info[active_engine_id].engine_enum;
95 /* GR Engine */
96 if (engine_enum == ENGINE_GR_GK20A) {
97 gr_gk20a_elpg_protected_call(g, gk20a_gr_isr(g));
98 }
99
100 /* CE Engine */
101 if (((engine_enum == ENGINE_GRCE_GK20A) ||
102 (engine_enum == ENGINE_ASYNC_CE_GK20A)) &&
103 g->ops.ce2.isr_stall){
104 g->ops.ce2.isr_stall(g,
105 g->fifo.engine_info[active_engine_id].inst_id,
106 g->fifo.engine_info[active_engine_id].pri_base);
107 }
108 }
109 }
92 if (mc_intr_0 & mc_intr_0_pfifo_pending_f()) 110 if (mc_intr_0 & mc_intr_0_pfifo_pending_f())
93 gk20a_fifo_isr(g); 111 gk20a_fifo_isr(g);
94 if (mc_intr_0 & mc_intr_0_pmu_pending_f()) 112 if (mc_intr_0 & mc_intr_0_pmu_pending_f())
@@ -120,6 +138,9 @@ irqreturn_t mc_gk20a_intr_thread_nonstall(struct gk20a *g)
120{ 138{
121 u32 mc_intr_1; 139 u32 mc_intr_1;
122 int hw_irq_count; 140 int hw_irq_count;
141 u32 engine_id_idx;
142 u32 active_engine_id = 0;
143 u32 engine_enum = ENGINE_INVAL_GK20A;
123 144
124 gk20a_dbg(gpu_dbg_intr, "interrupt thread launched"); 145 gk20a_dbg(gpu_dbg_intr, "interrupt thread launched");
125 146
@@ -132,11 +153,27 @@ irqreturn_t mc_gk20a_intr_thread_nonstall(struct gk20a *g)
132 gk20a_fifo_nonstall_isr(g); 153 gk20a_fifo_nonstall_isr(g);
133 if (mc_intr_1 & mc_intr_0_priv_ring_pending_f()) 154 if (mc_intr_1 & mc_intr_0_priv_ring_pending_f())
134 gk20a_priv_ring_isr(g); 155 gk20a_priv_ring_isr(g);
135 if (mc_intr_1 & g->fifo.engine_info[ENGINE_GR_GK20A].intr_mask) 156
136 gk20a_gr_nonstall_isr(g); 157 for (engine_id_idx = 0; engine_id_idx < g->fifo.num_engines; engine_id_idx++) {
137 if (mc_intr_1 & g->fifo.engine_info[ENGINE_CE2_GK20A].intr_mask 158 active_engine_id = g->fifo.active_engines_list[engine_id_idx];
138 && g->ops.ce2.isr_nonstall) 159
139 g->ops.ce2.isr_nonstall(g); 160 if (mc_intr_1 & g->fifo.engine_info[active_engine_id].intr_mask) {
161 engine_enum = g->fifo.engine_info[active_engine_id].engine_enum;
162 /* GR Engine */
163 if (engine_enum == ENGINE_GR_GK20A) {
164 gk20a_gr_nonstall_isr(g);
165 }
166
167 /* CE Engine */
168 if (((engine_enum == ENGINE_GRCE_GK20A) ||
169 (engine_enum == ENGINE_ASYNC_CE_GK20A)) &&
170 g->ops.ce2.isr_nonstall) {
171 g->ops.ce2.isr_nonstall(g,
172 g->fifo.engine_info[active_engine_id].inst_id,
173 g->fifo.engine_info[active_engine_id].pri_base);
174 }
175 }
176 }
140 177
141 /* sync handled irq counter before re-enabling interrupts */ 178 /* sync handled irq counter before re-enabling interrupts */
142 atomic_set(&g->sw_irq_nonstall_last_handled, hw_irq_count); 179 atomic_set(&g->sw_irq_nonstall_last_handled, hw_irq_count);