summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c
diff options
context:
space:
mode:
authorDeepak Nibade <dnibade@nvidia.com>2016-06-30 05:05:37 -0400
committerTerje Bergstrom <tbergstrom@nvidia.com>2016-07-07 07:40:10 -0400
commit8417698b519be9dc8c1bd04714fc72ce4e0bc38f (patch)
tree3d0d2742ae9919532382442c167922d6c43f0963 /drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c
parent3da46822fc124fa83288d6e282c8f0ec4d727a5c (diff)
gpu: nvgpu: add gk20a_busy() for debug operations
Add missing gk20a_busy()/idle() for debug operation IOCTLs Bug 1765446 Change-Id: Id238646a116ea573f64e3f92def40e52aadd5a11 Signed-off-by: Deepak Nibade <dnibade@nvidia.com> Reviewed-on: http://git-master/r/1173719 Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com> Tested-by: Terje Bergstrom <tbergstrom@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c46
1 files changed, 44 insertions, 2 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c b/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c
index a23758ab..de8db2ba 100644
--- a/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c
@@ -1181,6 +1181,12 @@ static int nvgpu_dbg_gpu_ioctl_smpc_ctxsw_mode(struct dbg_session_gk20a *dbg_s,
1181 gk20a_dbg_fn("%s smpc ctxsw mode = %d", 1181 gk20a_dbg_fn("%s smpc ctxsw mode = %d",
1182 dev_name(dbg_s->dev), args->mode); 1182 dev_name(dbg_s->dev), args->mode);
1183 1183
1184 err = gk20a_busy(g->dev);
1185 if (err) {
1186 gk20a_err(dev_from_gk20a(g), "failed to poweron");
1187 return err;
1188 }
1189
1184 /* Take the global lock, since we'll be doing global regops */ 1190 /* Take the global lock, since we'll be doing global regops */
1185 mutex_lock(&g->dbg_sessions_lock); 1191 mutex_lock(&g->dbg_sessions_lock);
1186 1192
@@ -1203,6 +1209,7 @@ static int nvgpu_dbg_gpu_ioctl_smpc_ctxsw_mode(struct dbg_session_gk20a *dbg_s,
1203 err = g->ops.regops.apply_smpc_war(dbg_s); 1209 err = g->ops.regops.apply_smpc_war(dbg_s);
1204 clean_up: 1210 clean_up:
1205 mutex_unlock(&g->dbg_sessions_lock); 1211 mutex_unlock(&g->dbg_sessions_lock);
1212 gk20a_idle(g->dev);
1206 return err; 1213 return err;
1207} 1214}
1208 1215
@@ -1216,6 +1223,12 @@ static int nvgpu_dbg_gpu_ioctl_hwpm_ctxsw_mode(struct dbg_session_gk20a *dbg_s,
1216 gk20a_dbg_fn("%s pm ctxsw mode = %d", 1223 gk20a_dbg_fn("%s pm ctxsw mode = %d",
1217 dev_name(dbg_s->dev), args->mode); 1224 dev_name(dbg_s->dev), args->mode);
1218 1225
1226 err = gk20a_busy(g->dev);
1227 if (err) {
1228 gk20a_err(dev_from_gk20a(g), "failed to poweron");
1229 return err;
1230 }
1231
1219 /* Take the global lock, since we'll be doing global regops */ 1232 /* Take the global lock, since we'll be doing global regops */
1220 mutex_lock(&g->dbg_sessions_lock); 1233 mutex_lock(&g->dbg_sessions_lock);
1221 1234
@@ -1238,6 +1251,7 @@ static int nvgpu_dbg_gpu_ioctl_hwpm_ctxsw_mode(struct dbg_session_gk20a *dbg_s,
1238 */ 1251 */
1239 clean_up: 1252 clean_up:
1240 mutex_unlock(&g->dbg_sessions_lock); 1253 mutex_unlock(&g->dbg_sessions_lock);
1254 gk20a_idle(g->dev);
1241 return err; 1255 return err;
1242} 1256}
1243 1257
@@ -1255,6 +1269,12 @@ static int nvgpu_dbg_gpu_ioctl_suspend_resume_sm(
1255 if (!ch) 1269 if (!ch)
1256 return -EINVAL; 1270 return -EINVAL;
1257 1271
1272 err = gk20a_busy(g->dev);
1273 if (err) {
1274 gk20a_err(dev_from_gk20a(g), "failed to poweron");
1275 return err;
1276 }
1277
1258 mutex_lock(&g->dbg_sessions_lock); 1278 mutex_lock(&g->dbg_sessions_lock);
1259 1279
1260 /* Suspend GPU context switching */ 1280 /* Suspend GPU context switching */
@@ -1281,6 +1301,7 @@ static int nvgpu_dbg_gpu_ioctl_suspend_resume_sm(
1281 1301
1282clean_up: 1302clean_up:
1283 mutex_unlock(&g->dbg_sessions_lock); 1303 mutex_unlock(&g->dbg_sessions_lock);
1304 gk20a_idle(g->dev);
1284 1305
1285 return err; 1306 return err;
1286} 1307}
@@ -1316,8 +1337,14 @@ static int gk20a_perfbuf_map(struct dbg_session_gk20a *dbg_s,
1316 virt_addr_hi = u64_hi32(args->offset); 1337 virt_addr_hi = u64_hi32(args->offset);
1317 /* but check anyway */ 1338 /* but check anyway */
1318 if (args->offset + virt_size > SZ_4G) { 1339 if (args->offset + virt_size > SZ_4G) {
1319 gk20a_vm_unmap_buffer(&g->mm.pmu.vm, args->offset, NULL); 1340 err = -EINVAL;
1320 return -EINVAL; 1341 goto fail_unmap;
1342 }
1343
1344 err = gk20a_busy(g->dev);
1345 if (err) {
1346 gk20a_err(dev_from_gk20a(g), "failed to poweron");
1347 goto fail_unmap;
1321 } 1348 }
1322 1349
1323 /* address and size are aligned to 32 bytes, the lowest bits read back 1350 /* address and size are aligned to 32 bytes, the lowest bits read back
@@ -1337,17 +1364,30 @@ static int gk20a_perfbuf_map(struct dbg_session_gk20a *dbg_s,
1337 perf_pmasys_mem_block_valid_true_f() | 1364 perf_pmasys_mem_block_valid_true_f() |
1338 perf_pmasys_mem_block_target_lfb_f()); 1365 perf_pmasys_mem_block_target_lfb_f());
1339 1366
1367 gk20a_idle(g->dev);
1368
1340 return 0; 1369 return 0;
1370
1371fail_unmap:
1372 gk20a_vm_unmap_buffer(&g->mm.pmu.vm, args->offset, NULL);
1373 return err;
1341} 1374}
1342 1375
1343static int gk20a_perfbuf_unmap(struct dbg_session_gk20a *dbg_s, 1376static int gk20a_perfbuf_unmap(struct dbg_session_gk20a *dbg_s,
1344 struct nvgpu_dbg_gpu_perfbuf_unmap_args *args) 1377 struct nvgpu_dbg_gpu_perfbuf_unmap_args *args)
1345{ 1378{
1346 struct gk20a *g = dbg_s->g; 1379 struct gk20a *g = dbg_s->g;
1380 int err;
1347 1381
1348 if (!g->allow_all) 1382 if (!g->allow_all)
1349 return -EACCES; 1383 return -EACCES;
1350 1384
1385 err = gk20a_busy(g->dev);
1386 if (err) {
1387 gk20a_err(dev_from_gk20a(g), "failed to poweron");
1388 return err;
1389 }
1390
1351 gk20a_writel(g, perf_pmasys_outbase_r(), 0); 1391 gk20a_writel(g, perf_pmasys_outbase_r(), 0);
1352 gk20a_writel(g, perf_pmasys_outbaseupper_r(), 1392 gk20a_writel(g, perf_pmasys_outbaseupper_r(),
1353 perf_pmasys_outbaseupper_ptr_f(0)); 1393 perf_pmasys_outbaseupper_ptr_f(0));
@@ -1358,6 +1398,8 @@ static int gk20a_perfbuf_unmap(struct dbg_session_gk20a *dbg_s,
1358 perf_pmasys_mem_block_valid_false_f() | 1398 perf_pmasys_mem_block_valid_false_f() |
1359 perf_pmasys_mem_block_target_f(0)); 1399 perf_pmasys_mem_block_target_f(0));
1360 1400
1401 gk20a_idle(g->dev);
1402
1361 gk20a_vm_unmap_buffer(&g->mm.pmu.vm, args->offset, NULL); 1403 gk20a_vm_unmap_buffer(&g->mm.pmu.vm, args->offset, NULL);
1362 1404
1363 return 0; 1405 return 0;