diff options
author | Deepak Nibade <dnibade@nvidia.com> | 2015-12-29 03:17:39 -0500 |
---|---|---|
committer | Terje Bergstrom <tbergstrom@nvidia.com> | 2016-02-05 15:44:36 -0500 |
commit | 595fa7158551ef130ddd5e04d3edd38aab4f0006 (patch) | |
tree | f9b17525d9aa45add4853812f8f62538e8e1a164 /drivers/gpu/nvgpu | |
parent | 8b665ac6b2984e07a290d5ecbcec2c93ec973c65 (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')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c | 65 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.h | 5 |
2 files changed, 70 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 | ||
264 | bool 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 | |||
288 | int 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 | ||
265 | static int dbg_set_powergate(struct dbg_session_gk20a *dbg_s, | 310 | static 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 | ||
513 | static 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 | |||
468 | long gk20a_dbg_gpu_dev_ioctl(struct file *filp, unsigned int cmd, | 528 | long 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); |
diff --git a/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.h b/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.h index fc1f2982..a2e075a6 100644 --- a/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.h | |||
@@ -79,8 +79,13 @@ struct dbg_session_gk20a { | |||
79 | /* event support */ | 79 | /* event support */ |
80 | struct dbg_gpu_session_events dbg_events; | 80 | struct dbg_gpu_session_events dbg_events; |
81 | struct list_head dbg_s_list_node; | 81 | struct list_head dbg_s_list_node; |
82 | |||
83 | bool broadcast_stop_trigger; | ||
82 | }; | 84 | }; |
83 | 85 | ||
84 | extern struct dbg_gpu_session_ops dbg_gpu_session_ops_gk20a; | 86 | extern struct dbg_gpu_session_ops dbg_gpu_session_ops_gk20a; |
85 | 87 | ||
88 | bool gk20a_dbg_gpu_broadcast_stop_trigger(struct channel_gk20a *ch); | ||
89 | int gk20a_dbg_gpu_clear_broadcast_stop_trigger(struct channel_gk20a *ch); | ||
90 | |||
86 | #endif /* DBG_GPU_GK20A_H */ | 91 | #endif /* DBG_GPU_GK20A_H */ |