summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/nvgpu')
-rw-r--r--drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c62
-rw-r--r--drivers/gpu/nvgpu/gk20a/gr_gk20a.c4
2 files changed, 42 insertions, 24 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c b/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c
index f70cfdf8..6645e21f 100644
--- a/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c
@@ -151,10 +151,17 @@ int dbg_set_powergate(struct dbg_session_gk20a *dbg_s, u32 powermode)
151 151
152 /* This function must be called with g->dbg_sessions_lock held */ 152 /* This function must be called with g->dbg_sessions_lock held */
153 153
154 gk20a_dbg(gpu_dbg_fn|gpu_dbg_gpu_dbg, "%s powergate mode = %d", 154 nvgpu_log(g, gpu_dbg_fn|gpu_dbg_gpu_dbg, "%s powergate mode = %d",
155 g->name, powermode); 155 g->name, powermode);
156 156
157 switch (powermode) { 157 switch (powermode) {
158 /*
159 * Powergate mode here refers to railgate+powergate+clockgate
160 * so in case slcg/blcg/elcg are disabled and railgating is enabled,
161 * disable railgating and then set is_pg_disabled = true
162 * Similarly re-enable railgating and not other features if they are not
163 * enabled when powermode=MODE_ENABLE
164 */
158 case NVGPU_DBG_GPU_POWERGATE_MODE_DISABLE: 165 case NVGPU_DBG_GPU_POWERGATE_MODE_DISABLE:
159 /* save off current powergate, clk state. 166 /* save off current powergate, clk state.
160 * set gpu module's can_powergate = 0. 167 * set gpu module's can_powergate = 0.
@@ -171,7 +178,8 @@ int dbg_set_powergate(struct dbg_session_gk20a *dbg_s, u32 powermode)
171 if ((dbg_s->is_pg_disabled == false) && 178 if ((dbg_s->is_pg_disabled == false) &&
172 (g->dbg_powergating_disabled_refcount++ == 0)) { 179 (g->dbg_powergating_disabled_refcount++ == 0)) {
173 180
174 gk20a_dbg(gpu_dbg_gpu_dbg | gpu_dbg_fn, "module busy"); 181 nvgpu_log(g, gpu_dbg_gpu_dbg | gpu_dbg_fn,
182 "module busy");
175 err = gk20a_busy(g); 183 err = gk20a_busy(g);
176 if (err) 184 if (err)
177 return err; 185 return err;
@@ -181,18 +189,16 @@ int dbg_set_powergate(struct dbg_session_gk20a *dbg_s, u32 powermode)
181 189
182 if (g->ops.clock_gating.slcg_gr_load_gating_prod) 190 if (g->ops.clock_gating.slcg_gr_load_gating_prod)
183 g->ops.clock_gating.slcg_gr_load_gating_prod(g, 191 g->ops.clock_gating.slcg_gr_load_gating_prod(g,
184 false); 192 false);
185 if (g->ops.clock_gating.slcg_perf_load_gating_prod) 193 if (g->ops.clock_gating.slcg_perf_load_gating_prod)
186 g->ops.clock_gating.slcg_perf_load_gating_prod(g, 194 g->ops.clock_gating.slcg_perf_load_gating_prod(g,
187 false); 195 false);
188 if (g->ops.clock_gating.slcg_ltc_load_gating_prod) 196 if (g->ops.clock_gating.slcg_ltc_load_gating_prod)
189 g->ops.clock_gating.slcg_ltc_load_gating_prod(g, 197 g->ops.clock_gating.slcg_ltc_load_gating_prod(g,
190 false); 198 false);
191 199
192 gr_gk20a_init_cg_mode(g, BLCG_MODE, BLCG_RUN); 200 gr_gk20a_init_cg_mode(g, BLCG_MODE, BLCG_RUN);
193 g->elcg_enabled = false;
194 gr_gk20a_init_cg_mode(g, ELCG_MODE, ELCG_RUN); 201 gr_gk20a_init_cg_mode(g, ELCG_MODE, ELCG_RUN);
195
196 } 202 }
197 203
198 dbg_s->is_pg_disabled = true; 204 dbg_s->is_pg_disabled = true;
@@ -210,23 +216,33 @@ int dbg_set_powergate(struct dbg_session_gk20a *dbg_s, u32 powermode)
210 if (dbg_s->is_pg_disabled && 216 if (dbg_s->is_pg_disabled &&
211 --g->dbg_powergating_disabled_refcount == 0) { 217 --g->dbg_powergating_disabled_refcount == 0) {
212 218
213 g->elcg_enabled = true; 219 if (g->elcg_enabled)
214 gr_gk20a_init_cg_mode(g, ELCG_MODE, ELCG_AUTO); 220 gr_gk20a_init_cg_mode(g, ELCG_MODE, ELCG_AUTO);
215 gr_gk20a_init_cg_mode(g, BLCG_MODE, BLCG_AUTO); 221
216 222 if (g->blcg_enabled)
217 if (g->ops.clock_gating.slcg_ltc_load_gating_prod) 223 gr_gk20a_init_cg_mode(g, BLCG_MODE, BLCG_AUTO);
218 g->ops.clock_gating.slcg_ltc_load_gating_prod(g, 224
219 g->slcg_enabled); 225 if (g->slcg_enabled) {
220 if (g->ops.clock_gating.slcg_perf_load_gating_prod) 226 if (g->ops.clock_gating.
221 g->ops.clock_gating.slcg_perf_load_gating_prod(g, 227 slcg_ltc_load_gating_prod)
222 g->slcg_enabled); 228 g->ops.clock_gating.
223 if (g->ops.clock_gating.slcg_gr_load_gating_prod) 229 slcg_ltc_load_gating_prod(g,
224 g->ops.clock_gating.slcg_gr_load_gating_prod(g, 230 g->slcg_enabled);
225 g->slcg_enabled); 231 if (g->ops.clock_gating.
226 232 slcg_perf_load_gating_prod)
233 g->ops.clock_gating.
234 slcg_perf_load_gating_prod(g,
235 g->slcg_enabled);
236 if (g->ops.clock_gating.
237 slcg_gr_load_gating_prod)
238 g->ops.clock_gating.
239 slcg_gr_load_gating_prod(g,
240 g->slcg_enabled);
241 }
227 nvgpu_pmu_pg_global_enable(g, true); 242 nvgpu_pmu_pg_global_enable(g, true);
228 243
229 gk20a_dbg(gpu_dbg_gpu_dbg | gpu_dbg_fn, "module idle"); 244 nvgpu_log(g, gpu_dbg_gpu_dbg | gpu_dbg_fn,
245 "module idle");
230 gk20a_idle(g); 246 gk20a_idle(g);
231 } 247 }
232 248
@@ -241,7 +257,7 @@ int dbg_set_powergate(struct dbg_session_gk20a *dbg_s, u32 powermode)
241 break; 257 break;
242 } 258 }
243 259
244 gk20a_dbg(gpu_dbg_fn|gpu_dbg_gpu_dbg, "%s powergate mode = %d done", 260 nvgpu_log(g, gpu_dbg_fn|gpu_dbg_gpu_dbg, "%s powergate mode = %d done",
245 g->name, powermode); 261 g->name, powermode);
246 return err; 262 return err;
247} 263}
diff --git a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
index f7db1ffa..3875ec5c 100644
--- a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
@@ -4170,7 +4170,9 @@ void gr_gk20a_init_cg_mode(struct gk20a *g, u32 cgmode, u32 mode_config)
4170 g->ops.gr.init_elcg_mode(g, mode_config, 4170 g->ops.gr.init_elcg_mode(g, mode_config,
4171 active_engine_id); 4171 active_engine_id);
4172 else 4172 else
4173 nvgpu_err(g, "invalid cg mode %d %d", cgmode, mode_config); 4173 nvgpu_err(g, "invalid cg mode %d, config %d for "
4174 "act_eng_id %d",
4175 cgmode, mode_config, active_engine_id);
4174 } 4176 }
4175} 4177}
4176 4178