diff options
-rw-r--r-- | drivers/gpu/nvgpu/common/linux/ioctl_dbg.c | 16 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c | 25 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.h | 2 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/gk20a.h | 2 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/vgpu/dbg_vgpu.c | 14 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/vgpu/dbg_vgpu.h | 2 |
6 files changed, 27 insertions, 34 deletions
diff --git a/drivers/gpu/nvgpu/common/linux/ioctl_dbg.c b/drivers/gpu/nvgpu/common/linux/ioctl_dbg.c index f8bdd19b..c8d7468e 100644 --- a/drivers/gpu/nvgpu/common/linux/ioctl_dbg.c +++ b/drivers/gpu/nvgpu/common/linux/ioctl_dbg.c | |||
@@ -178,8 +178,7 @@ int gk20a_dbg_gpu_dev_release(struct inode *inode, struct file *filp) | |||
178 | * calling powergate/timeout enable ioctl | 178 | * calling powergate/timeout enable ioctl |
179 | */ | 179 | */ |
180 | nvgpu_mutex_acquire(&g->dbg_sessions_lock); | 180 | nvgpu_mutex_acquire(&g->dbg_sessions_lock); |
181 | g->ops.dbg_session_ops.dbg_set_powergate(dbg_s, | 181 | g->ops.dbg_session_ops.dbg_set_powergate(dbg_s, false); |
182 | NVGPU_DBG_GPU_POWERGATE_MODE_ENABLE); | ||
183 | nvgpu_dbg_timeout_enable(dbg_s, NVGPU_DBG_GPU_IOCTL_TIMEOUT_ENABLE); | 182 | nvgpu_dbg_timeout_enable(dbg_s, NVGPU_DBG_GPU_IOCTL_TIMEOUT_ENABLE); |
184 | 183 | ||
185 | /* If this session owned the perf buffer, release it */ | 184 | /* If this session owned the perf buffer, release it */ |
@@ -651,7 +650,7 @@ static int nvgpu_ioctl_channel_reg_ops(struct dbg_session_gk20a *dbg_s, | |||
651 | * disabling/enabling powergating when processing reg ops | 650 | * disabling/enabling powergating when processing reg ops |
652 | */ | 651 | */ |
653 | powergate_err = g->ops.dbg_session_ops.dbg_set_powergate(dbg_s, | 652 | powergate_err = g->ops.dbg_session_ops.dbg_set_powergate(dbg_s, |
654 | NVGPU_DBG_GPU_POWERGATE_MODE_DISABLE); | 653 | true); |
655 | is_pg_disabled = true; | 654 | is_pg_disabled = true; |
656 | } | 655 | } |
657 | 656 | ||
@@ -701,7 +700,7 @@ static int nvgpu_ioctl_channel_reg_ops(struct dbg_session_gk20a *dbg_s, | |||
701 | if (is_pg_disabled) { | 700 | if (is_pg_disabled) { |
702 | powergate_err = | 701 | powergate_err = |
703 | g->ops.dbg_session_ops.dbg_set_powergate(dbg_s, | 702 | g->ops.dbg_session_ops.dbg_set_powergate(dbg_s, |
704 | NVGPU_DBG_GPU_POWERGATE_MODE_ENABLE); | 703 | false); |
705 | } | 704 | } |
706 | } | 705 | } |
707 | 706 | ||
@@ -725,7 +724,14 @@ static int nvgpu_ioctl_powergate_gk20a(struct dbg_session_gk20a *dbg_s, | |||
725 | g->name, args->mode); | 724 | g->name, args->mode); |
726 | 725 | ||
727 | nvgpu_mutex_acquire(&g->dbg_sessions_lock); | 726 | nvgpu_mutex_acquire(&g->dbg_sessions_lock); |
728 | err = g->ops.dbg_session_ops.dbg_set_powergate(dbg_s, args->mode); | 727 | if (args->mode == NVGPU_DBG_GPU_POWERGATE_MODE_DISABLE) { |
728 | err = g->ops.dbg_session_ops.dbg_set_powergate(dbg_s, true); | ||
729 | } else if (args->mode == NVGPU_DBG_GPU_POWERGATE_MODE_ENABLE) { | ||
730 | err = g->ops.dbg_session_ops.dbg_set_powergate(dbg_s, false); | ||
731 | } else { | ||
732 | nvgpu_err(g, "invalid powergate mode"); | ||
733 | err = -EINVAL; | ||
734 | } | ||
729 | nvgpu_mutex_release(&g->dbg_sessions_lock); | 735 | nvgpu_mutex_release(&g->dbg_sessions_lock); |
730 | return err; | 736 | return err; |
731 | } | 737 | } |
diff --git a/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c b/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c index 6645e21f..fd31ab89 100644 --- a/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c | |||
@@ -144,17 +144,16 @@ int gk20a_dbg_gpu_clear_broadcast_stop_trigger(struct channel_gk20a *ch) | |||
144 | return 0; | 144 | return 0; |
145 | } | 145 | } |
146 | 146 | ||
147 | int dbg_set_powergate(struct dbg_session_gk20a *dbg_s, u32 powermode) | 147 | int dbg_set_powergate(struct dbg_session_gk20a *dbg_s, bool disable_powergate) |
148 | { | 148 | { |
149 | int err = 0; | 149 | int err = 0; |
150 | struct gk20a *g = dbg_s->g; | 150 | struct gk20a *g = dbg_s->g; |
151 | 151 | ||
152 | /* This function must be called with g->dbg_sessions_lock held */ | 152 | /* This function must be called with g->dbg_sessions_lock held */ |
153 | 153 | ||
154 | nvgpu_log(g, gpu_dbg_fn|gpu_dbg_gpu_dbg, "%s powergate mode = %d", | 154 | nvgpu_log(g, gpu_dbg_fn|gpu_dbg_gpu_dbg, "%s powergate mode = %s", |
155 | g->name, powermode); | 155 | g->name, disable_powergate ? "disable" : "enable"); |
156 | 156 | ||
157 | switch (powermode) { | ||
158 | /* | 157 | /* |
159 | * Powergate mode here refers to railgate+powergate+clockgate | 158 | * Powergate mode here refers to railgate+powergate+clockgate |
160 | * so in case slcg/blcg/elcg are disabled and railgating is enabled, | 159 | * so in case slcg/blcg/elcg are disabled and railgating is enabled, |
@@ -162,7 +161,7 @@ int dbg_set_powergate(struct dbg_session_gk20a *dbg_s, u32 powermode) | |||
162 | * Similarly re-enable railgating and not other features if they are not | 161 | * Similarly re-enable railgating and not other features if they are not |
163 | * enabled when powermode=MODE_ENABLE | 162 | * enabled when powermode=MODE_ENABLE |
164 | */ | 163 | */ |
165 | case NVGPU_DBG_GPU_POWERGATE_MODE_DISABLE: | 164 | if (disable_powergate) { |
166 | /* save off current powergate, clk state. | 165 | /* save off current powergate, clk state. |
167 | * set gpu module's can_powergate = 0. | 166 | * set gpu module's can_powergate = 0. |
168 | * set gpu module's clk to max. | 167 | * set gpu module's clk to max. |
@@ -202,9 +201,7 @@ int dbg_set_powergate(struct dbg_session_gk20a *dbg_s, u32 powermode) | |||
202 | } | 201 | } |
203 | 202 | ||
204 | dbg_s->is_pg_disabled = true; | 203 | dbg_s->is_pg_disabled = true; |
205 | break; | 204 | } else { |
206 | |||
207 | case NVGPU_DBG_GPU_POWERGATE_MODE_ENABLE: | ||
208 | /* restore (can) powergate, clk state */ | 205 | /* restore (can) powergate, clk state */ |
209 | /* release pending exceptions to fault/be handled as usual */ | 206 | /* release pending exceptions to fault/be handled as usual */ |
210 | /*TBD: ordering of these? */ | 207 | /*TBD: ordering of these? */ |
@@ -247,18 +244,10 @@ int dbg_set_powergate(struct dbg_session_gk20a *dbg_s, u32 powermode) | |||
247 | } | 244 | } |
248 | 245 | ||
249 | dbg_s->is_pg_disabled = false; | 246 | dbg_s->is_pg_disabled = false; |
250 | break; | ||
251 | |||
252 | default: | ||
253 | nvgpu_err(g, | ||
254 | "unrecognized dbg gpu powergate mode: 0x%x", | ||
255 | powermode); | ||
256 | err = -ENOTTY; | ||
257 | break; | ||
258 | } | 247 | } |
259 | 248 | ||
260 | nvgpu_log(g, gpu_dbg_fn|gpu_dbg_gpu_dbg, "%s powergate mode = %d done", | 249 | nvgpu_log(g, gpu_dbg_fn|gpu_dbg_gpu_dbg, "%s powergate mode = %s done", |
261 | g->name, powermode); | 250 | g->name, disable_powergate ? "disable" : "enable"); |
262 | return err; | 251 | return err; |
263 | } | 252 | } |
264 | 253 | ||
diff --git a/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.h b/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.h index 781e2176..28db053c 100644 --- a/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.h | |||
@@ -120,7 +120,7 @@ dbg_profiler_object_data_from_prof_obj_entry(struct nvgpu_list_node *node) | |||
120 | bool gk20a_dbg_gpu_broadcast_stop_trigger(struct channel_gk20a *ch); | 120 | bool gk20a_dbg_gpu_broadcast_stop_trigger(struct channel_gk20a *ch); |
121 | int gk20a_dbg_gpu_clear_broadcast_stop_trigger(struct channel_gk20a *ch); | 121 | int gk20a_dbg_gpu_clear_broadcast_stop_trigger(struct channel_gk20a *ch); |
122 | 122 | ||
123 | int dbg_set_powergate(struct dbg_session_gk20a *dbg_s, u32 powermode); | 123 | int dbg_set_powergate(struct dbg_session_gk20a *dbg_s, bool disable_powergate); |
124 | bool nvgpu_check_and_set_global_reservation( | 124 | bool nvgpu_check_and_set_global_reservation( |
125 | struct dbg_session_gk20a *dbg_s, | 125 | struct dbg_session_gk20a *dbg_s, |
126 | struct dbg_profiler_object_data *prof_obj); | 126 | struct dbg_profiler_object_data *prof_obj); |
diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.h b/drivers/gpu/nvgpu/gk20a/gk20a.h index 96333277..4a344387 100644 --- a/drivers/gpu/nvgpu/gk20a/gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/gk20a.h | |||
@@ -947,7 +947,7 @@ struct gpu_ops { | |||
947 | struct nvgpu_dbg_gpu_reg_op *ops, | 947 | struct nvgpu_dbg_gpu_reg_op *ops, |
948 | u64 num_ops); | 948 | u64 num_ops); |
949 | int (*dbg_set_powergate)(struct dbg_session_gk20a *dbg_s, | 949 | int (*dbg_set_powergate)(struct dbg_session_gk20a *dbg_s, |
950 | u32 mode); | 950 | bool disable_powergate); |
951 | bool (*check_and_set_global_reservation)( | 951 | bool (*check_and_set_global_reservation)( |
952 | struct dbg_session_gk20a *dbg_s, | 952 | struct dbg_session_gk20a *dbg_s, |
953 | struct dbg_profiler_object_data *prof_obj); | 953 | struct dbg_profiler_object_data *prof_obj); |
diff --git a/drivers/gpu/nvgpu/vgpu/dbg_vgpu.c b/drivers/gpu/nvgpu/vgpu/dbg_vgpu.c index 6e8ab561..0ed66eb9 100644 --- a/drivers/gpu/nvgpu/vgpu/dbg_vgpu.c +++ b/drivers/gpu/nvgpu/vgpu/dbg_vgpu.c | |||
@@ -77,28 +77,26 @@ fail: | |||
77 | return err; | 77 | return err; |
78 | } | 78 | } |
79 | 79 | ||
80 | int vgpu_dbg_set_powergate(struct dbg_session_gk20a *dbg_s, __u32 mode) | 80 | int vgpu_dbg_set_powergate(struct dbg_session_gk20a *dbg_s, bool disable_powergate) |
81 | { | 81 | { |
82 | struct tegra_vgpu_cmd_msg msg; | 82 | struct tegra_vgpu_cmd_msg msg; |
83 | struct tegra_vgpu_set_powergate_params *p = &msg.params.set_powergate; | 83 | struct tegra_vgpu_set_powergate_params *p = &msg.params.set_powergate; |
84 | int err = 0; | 84 | int err = 0; |
85 | u32 mode; | ||
85 | 86 | ||
86 | gk20a_dbg_fn(""); | 87 | gk20a_dbg_fn(""); |
87 | 88 | ||
88 | /* Just return if requested mode is the same as the session's mode */ | 89 | /* Just return if requested mode is the same as the session's mode */ |
89 | switch (mode) { | 90 | if (disable_powergate) { |
90 | case NVGPU_DBG_GPU_POWERGATE_MODE_DISABLE: | ||
91 | if (dbg_s->is_pg_disabled) | 91 | if (dbg_s->is_pg_disabled) |
92 | return 0; | 92 | return 0; |
93 | dbg_s->is_pg_disabled = true; | 93 | dbg_s->is_pg_disabled = true; |
94 | break; | 94 | mode = NVGPU_DBG_GPU_POWERGATE_MODE_DISABLE; |
95 | case NVGPU_DBG_GPU_POWERGATE_MODE_ENABLE: | 95 | } else { |
96 | if (!dbg_s->is_pg_disabled) | 96 | if (!dbg_s->is_pg_disabled) |
97 | return 0; | 97 | return 0; |
98 | dbg_s->is_pg_disabled = false; | 98 | dbg_s->is_pg_disabled = false; |
99 | break; | 99 | mode = NVGPU_DBG_GPU_POWERGATE_MODE_ENABLE; |
100 | default: | ||
101 | return -EINVAL; | ||
102 | } | 100 | } |
103 | 101 | ||
104 | msg.cmd = TEGRA_VGPU_CMD_SET_POWERGATE; | 102 | msg.cmd = TEGRA_VGPU_CMD_SET_POWERGATE; |
diff --git a/drivers/gpu/nvgpu/vgpu/dbg_vgpu.h b/drivers/gpu/nvgpu/vgpu/dbg_vgpu.h index fcdea931..b2ca2a7b 100644 --- a/drivers/gpu/nvgpu/vgpu/dbg_vgpu.h +++ b/drivers/gpu/nvgpu/vgpu/dbg_vgpu.h | |||
@@ -31,7 +31,7 @@ struct gk20a; | |||
31 | int vgpu_exec_regops(struct dbg_session_gk20a *dbg_s, | 31 | int vgpu_exec_regops(struct dbg_session_gk20a *dbg_s, |
32 | struct nvgpu_dbg_gpu_reg_op *ops, | 32 | struct nvgpu_dbg_gpu_reg_op *ops, |
33 | u64 num_ops); | 33 | u64 num_ops); |
34 | int vgpu_dbg_set_powergate(struct dbg_session_gk20a *dbg_s, __u32 mode); | 34 | int vgpu_dbg_set_powergate(struct dbg_session_gk20a *dbg_s, bool disable_powergate); |
35 | bool vgpu_check_and_set_global_reservation( | 35 | bool vgpu_check_and_set_global_reservation( |
36 | struct dbg_session_gk20a *dbg_s, | 36 | struct dbg_session_gk20a *dbg_s, |
37 | struct dbg_profiler_object_data *prof_obj); | 37 | struct dbg_profiler_object_data *prof_obj); |