diff options
author | Lakshmanan M <lm@nvidia.com> | 2016-06-02 00:04:46 -0400 |
---|---|---|
committer | Terje Bergstrom <tbergstrom@nvidia.com> | 2016-06-07 15:31:34 -0400 |
commit | 6299b00beb9dabdd53c211b02658d022827b3232 (patch) | |
tree | 941d8dd8aae8f7f8c73329e182984c36a5a9bf88 /drivers/gpu/nvgpu/gk20a/mc_gk20a.c | |
parent | 3d7263d3cafdcfc57a6d6b9f829562845d116294 (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.c | 57 |
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); |