summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c
diff options
context:
space:
mode:
authorDeepak Nibade <dnibade@nvidia.com>2015-12-29 03:17:39 -0500
committerTerje Bergstrom <tbergstrom@nvidia.com>2016-02-05 15:44:36 -0500
commit595fa7158551ef130ddd5e04d3edd38aab4f0006 (patch)
treef9b17525d9aa45add4853812f8f62538e8e1a164 /drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c
parent8b665ac6b2984e07a290d5ecbcec2c93ec973c65 (diff)
gpu: nvgpu: IOCTL to set stop_trigger type
Add IOCTL NVGPU_DBG_GPU_IOCTL_SET_NEXT_STOP_TRIGGER_TYPE to set next stop_trigger type (either single SM or broadcast to all SMs) Also, expose below APIs to check and clear broadcast flag: gk20a_dbg_gpu_broadcast_stop_trigger() gk20a_dbg_gpu_clear_broadcast_stop_trigger() Bug 200156699 Change-Id: I5e6cd4b84e601889fb172e0cdbb6bd5a0d366eab Signed-off-by: Deepak Nibade <dnibade@nvidia.com> Reviewed-on: http://git-master/r/925882 GVS: Gerrit_Virtual_Submit Reviewed-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.c65
1 files changed, 65 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c b/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c
index 1f1b164f..1ee0189b 100644
--- a/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c
@@ -261,6 +261,51 @@ void gk20a_dbg_gpu_post_events(struct channel_gk20a *ch)
261 mutex_unlock(&ch->dbg_s_lock); 261 mutex_unlock(&ch->dbg_s_lock);
262} 262}
263 263
264bool gk20a_dbg_gpu_broadcast_stop_trigger(struct channel_gk20a *ch)
265{
266 struct dbg_session_gk20a *dbg_s;
267 bool broadcast = false;
268
269 gk20a_dbg(gpu_dbg_fn | gpu_dbg_gpu_dbg | gpu_dbg_intr, "");
270
271 /* guard against the session list being modified */
272 mutex_lock(&ch->dbg_s_lock);
273
274 list_for_each_entry(dbg_s, &ch->dbg_s_list, dbg_s_list_node) {
275 if (dbg_s->broadcast_stop_trigger) {
276 gk20a_dbg(gpu_dbg_gpu_dbg | gpu_dbg_fn | gpu_dbg_intr,
277 "stop trigger broadcast enabled");
278 broadcast = true;
279 break;
280 }
281 }
282
283 mutex_unlock(&ch->dbg_s_lock);
284
285 return broadcast;
286}
287
288int gk20a_dbg_gpu_clear_broadcast_stop_trigger(struct channel_gk20a *ch)
289{
290 struct dbg_session_gk20a *dbg_s;
291
292 gk20a_dbg(gpu_dbg_fn | gpu_dbg_gpu_dbg | gpu_dbg_intr, "");
293
294 /* guard against the session list being modified */
295 mutex_lock(&ch->dbg_s_lock);
296
297 list_for_each_entry(dbg_s, &ch->dbg_s_list, dbg_s_list_node) {
298 if (dbg_s->broadcast_stop_trigger) {
299 gk20a_dbg(gpu_dbg_gpu_dbg | gpu_dbg_fn | gpu_dbg_intr,
300 "stop trigger broadcast disabled");
301 dbg_s->broadcast_stop_trigger = false;
302 }
303 }
304
305 mutex_unlock(&ch->dbg_s_lock);
306
307 return 0;
308}
264 309
265static int dbg_set_powergate(struct dbg_session_gk20a *dbg_s, 310static int dbg_set_powergate(struct dbg_session_gk20a *dbg_s,
266 __u32 powermode); 311 __u32 powermode);
@@ -465,6 +510,21 @@ static void nvgpu_dbg_gpu_ioctl_get_timeout(struct dbg_session_gk20a *dbg_s,
465 args->enable = NVGPU_DBG_GPU_IOCTL_TIMEOUT_DISABLE; 510 args->enable = NVGPU_DBG_GPU_IOCTL_TIMEOUT_DISABLE;
466} 511}
467 512
513static int nvgpu_dbg_gpu_ioctl_set_next_stop_trigger_type(
514 struct dbg_session_gk20a *dbg_s,
515 struct nvgpu_dbg_gpu_set_next_stop_trigger_type_args *args)
516{
517 gk20a_dbg(gpu_dbg_fn | gpu_dbg_gpu_dbg, "");
518
519 gk20a_dbg_session_mutex_lock(dbg_s);
520
521 dbg_s->broadcast_stop_trigger = (args->broadcast != 0);
522
523 gk20a_dbg_session_mutex_unlock(dbg_s);
524
525 return 0;
526}
527
468long gk20a_dbg_gpu_dev_ioctl(struct file *filp, unsigned int cmd, 528long gk20a_dbg_gpu_dev_ioctl(struct file *filp, unsigned int cmd,
469 unsigned long arg) 529 unsigned long arg)
470{ 530{
@@ -542,6 +602,11 @@ long gk20a_dbg_gpu_dev_ioctl(struct file *filp, unsigned int cmd,
542 (struct nvgpu_dbg_gpu_pc_sampling_args *)buf); 602 (struct nvgpu_dbg_gpu_pc_sampling_args *)buf);
543 break; 603 break;
544 604
605 case NVGPU_DBG_GPU_IOCTL_SET_NEXT_STOP_TRIGGER_TYPE:
606 err = nvgpu_dbg_gpu_ioctl_set_next_stop_trigger_type(dbg_s,
607 (struct nvgpu_dbg_gpu_set_next_stop_trigger_type_args *)buf);
608 break;
609
545 case NVGPU_DBG_GPU_IOCTL_TIMEOUT: 610 case NVGPU_DBG_GPU_IOCTL_TIMEOUT:
546 err = nvgpu_dbg_gpu_ioctl_timeout(dbg_s, 611 err = nvgpu_dbg_gpu_ioctl_timeout(dbg_s,
547 (struct nvgpu_dbg_gpu_timeout_args *)buf); 612 (struct nvgpu_dbg_gpu_timeout_args *)buf);