diff options
author | Deepak Nibade <dnibade@nvidia.com> | 2016-06-30 05:05:37 -0400 |
---|---|---|
committer | Terje Bergstrom <tbergstrom@nvidia.com> | 2016-07-07 07:40:10 -0400 |
commit | 8417698b519be9dc8c1bd04714fc72ce4e0bc38f (patch) | |
tree | 3d0d2742ae9919532382442c167922d6c43f0963 /drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c | |
parent | 3da46822fc124fa83288d6e282c8f0ec4d727a5c (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.c | 46 |
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 | ||
1282 | clean_up: | 1302 | clean_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 | |||
1371 | fail_unmap: | ||
1372 | gk20a_vm_unmap_buffer(&g->mm.pmu.vm, args->offset, NULL); | ||
1373 | return err; | ||
1341 | } | 1374 | } |
1342 | 1375 | ||
1343 | static int gk20a_perfbuf_unmap(struct dbg_session_gk20a *dbg_s, | 1376 | static 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; |