From 595fa7158551ef130ddd5e04d3edd38aab4f0006 Mon Sep 17 00:00:00 2001 From: Deepak Nibade Date: Tue, 29 Dec 2015 13:47:39 +0530 Subject: 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 Reviewed-on: http://git-master/r/925882 GVS: Gerrit_Virtual_Submit Reviewed-by: Terje Bergstrom --- drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c | 65 +++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) (limited to 'drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c') 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) mutex_unlock(&ch->dbg_s_lock); } +bool gk20a_dbg_gpu_broadcast_stop_trigger(struct channel_gk20a *ch) +{ + struct dbg_session_gk20a *dbg_s; + bool broadcast = false; + + gk20a_dbg(gpu_dbg_fn | gpu_dbg_gpu_dbg | gpu_dbg_intr, ""); + + /* guard against the session list being modified */ + mutex_lock(&ch->dbg_s_lock); + + list_for_each_entry(dbg_s, &ch->dbg_s_list, dbg_s_list_node) { + if (dbg_s->broadcast_stop_trigger) { + gk20a_dbg(gpu_dbg_gpu_dbg | gpu_dbg_fn | gpu_dbg_intr, + "stop trigger broadcast enabled"); + broadcast = true; + break; + } + } + + mutex_unlock(&ch->dbg_s_lock); + + return broadcast; +} + +int gk20a_dbg_gpu_clear_broadcast_stop_trigger(struct channel_gk20a *ch) +{ + struct dbg_session_gk20a *dbg_s; + + gk20a_dbg(gpu_dbg_fn | gpu_dbg_gpu_dbg | gpu_dbg_intr, ""); + + /* guard against the session list being modified */ + mutex_lock(&ch->dbg_s_lock); + + list_for_each_entry(dbg_s, &ch->dbg_s_list, dbg_s_list_node) { + if (dbg_s->broadcast_stop_trigger) { + gk20a_dbg(gpu_dbg_gpu_dbg | gpu_dbg_fn | gpu_dbg_intr, + "stop trigger broadcast disabled"); + dbg_s->broadcast_stop_trigger = false; + } + } + + mutex_unlock(&ch->dbg_s_lock); + + return 0; +} static int dbg_set_powergate(struct dbg_session_gk20a *dbg_s, __u32 powermode); @@ -465,6 +510,21 @@ static void nvgpu_dbg_gpu_ioctl_get_timeout(struct dbg_session_gk20a *dbg_s, args->enable = NVGPU_DBG_GPU_IOCTL_TIMEOUT_DISABLE; } +static int nvgpu_dbg_gpu_ioctl_set_next_stop_trigger_type( + struct dbg_session_gk20a *dbg_s, + struct nvgpu_dbg_gpu_set_next_stop_trigger_type_args *args) +{ + gk20a_dbg(gpu_dbg_fn | gpu_dbg_gpu_dbg, ""); + + gk20a_dbg_session_mutex_lock(dbg_s); + + dbg_s->broadcast_stop_trigger = (args->broadcast != 0); + + gk20a_dbg_session_mutex_unlock(dbg_s); + + return 0; +} + long gk20a_dbg_gpu_dev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) { @@ -542,6 +602,11 @@ long gk20a_dbg_gpu_dev_ioctl(struct file *filp, unsigned int cmd, (struct nvgpu_dbg_gpu_pc_sampling_args *)buf); break; + case NVGPU_DBG_GPU_IOCTL_SET_NEXT_STOP_TRIGGER_TYPE: + err = nvgpu_dbg_gpu_ioctl_set_next_stop_trigger_type(dbg_s, + (struct nvgpu_dbg_gpu_set_next_stop_trigger_type_args *)buf); + break; + case NVGPU_DBG_GPU_IOCTL_TIMEOUT: err = nvgpu_dbg_gpu_ioctl_timeout(dbg_s, (struct nvgpu_dbg_gpu_timeout_args *)buf); -- cgit v1.2.2