summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c
diff options
context:
space:
mode:
authorPeter Daifuku <pdaifuku@nvidia.com>2016-06-09 19:09:52 -0400
committerVladislav Buzov <vbuzov@nvidia.com>2016-07-06 18:26:22 -0400
commit1b04326f400489f25399167ef9f1c931a576656e (patch)
tree0dca7cf0982773647ca7bee54b2e190e02a97f97 /drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c
parentda4d5130e81b68d9773c8d64c7a6d944acfac0c8 (diff)
gpu: nvgpu: vgpu: dbg_set_powergate support
Add support for dbg_set_powergate when virtualized Jira VFND-1905 Change-Id: I0d81c8863b3eda4ae4fee42e5a95d2fc9d78b174 Signed-off-by: Peter Daifuku <pdaifuku@nvidia.com> Reviewed-on: http://git-master/r/1162048 (cherry picked from commit 0dfc55f390a10e21ae13e14dd2f16e89a3bddfa7) Reviewed-on: http://git-master/r/1167182 (cherry picked from commit 4e34a1844558d93da5ad208532ec28aeda228f95) Reviewed-on: http://git-master/r/1174701 Reviewed-by: Automatic_Commit_Validation_User GVS: Gerrit_Virtual_Submit Reviewed-by: Richard Zhao <rizhao@nvidia.com> Reviewed-by: Vladislav Buzov <vbuzov@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c28
1 files changed, 13 insertions, 15 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c b/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c
index 5e57502e..a23758ab 100644
--- a/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c
@@ -31,8 +31,11 @@
31#include "hw_gr_gk20a.h" 31#include "hw_gr_gk20a.h"
32#include "hw_perf_gk20a.h" 32#include "hw_perf_gk20a.h"
33 33
34static int dbg_set_powergate(struct dbg_session_gk20a *dbg_s, u32 powermode);
35
34struct dbg_gpu_session_ops dbg_gpu_session_ops_gk20a = { 36struct dbg_gpu_session_ops dbg_gpu_session_ops_gk20a = {
35 .exec_reg_ops = exec_regops_gk20a, 37 .exec_reg_ops = exec_regops_gk20a,
38 .dbg_set_powergate = dbg_set_powergate,
36}; 39};
37 40
38/* 41/*
@@ -116,11 +119,6 @@ static int gk20a_dbg_gpu_do_dev_open(struct inode *inode,
116 dbg_session->is_profiler = is_profiler; 119 dbg_session->is_profiler = is_profiler;
117 dbg_session->is_pg_disabled = false; 120 dbg_session->is_pg_disabled = false;
118 dbg_session->is_timeout_disabled = false; 121 dbg_session->is_timeout_disabled = false;
119 /* For vgpu, all power-gating features are currently disabled
120 * in the server. Set is_pg_disable to true to reflect this
121 * on the client side. */
122 if (gk20a_gpu_is_virtual(dev))
123 dbg_session->is_pg_disabled = true;
124 122
125 init_waitqueue_head(&dbg_session->dbg_events.wait_queue); 123 init_waitqueue_head(&dbg_session->dbg_events.wait_queue);
126 INIT_LIST_HEAD(&dbg_session->ch_list); 124 INIT_LIST_HEAD(&dbg_session->ch_list);
@@ -344,9 +342,6 @@ int gk20a_dbg_gpu_clear_broadcast_stop_trigger(struct channel_gk20a *ch)
344 return 0; 342 return 0;
345} 343}
346 344
347static int dbg_set_powergate(struct dbg_session_gk20a *dbg_s,
348 __u32 powermode);
349
350static int nvgpu_dbg_timeout_enable(struct dbg_session_gk20a *dbg_s, 345static int nvgpu_dbg_timeout_enable(struct dbg_session_gk20a *dbg_s,
351 int timeout_mode) 346 int timeout_mode)
352{ 347{
@@ -483,7 +478,8 @@ int gk20a_dbg_gpu_dev_release(struct inode *inode, struct file *filp)
483 * calling powergate/timeout enable ioctl 478 * calling powergate/timeout enable ioctl
484 */ 479 */
485 mutex_lock(&g->dbg_sessions_lock); 480 mutex_lock(&g->dbg_sessions_lock);
486 dbg_set_powergate(dbg_s, NVGPU_DBG_GPU_POWERGATE_MODE_ENABLE); 481 dbg_s->ops->dbg_set_powergate(dbg_s,
482 NVGPU_DBG_GPU_POWERGATE_MODE_ENABLE);
487 nvgpu_dbg_timeout_enable(dbg_s, NVGPU_DBG_GPU_IOCTL_TIMEOUT_ENABLE); 483 nvgpu_dbg_timeout_enable(dbg_s, NVGPU_DBG_GPU_IOCTL_TIMEOUT_ENABLE);
488 mutex_unlock(&g->dbg_sessions_lock); 484 mutex_unlock(&g->dbg_sessions_lock);
489 485
@@ -1018,8 +1014,11 @@ static int nvgpu_ioctl_channel_reg_ops(struct dbg_session_gk20a *dbg_s,
1018 * on other channels */ 1014 * on other channels */
1019 mutex_lock(&g->dbg_sessions_lock); 1015 mutex_lock(&g->dbg_sessions_lock);
1020 1016
1021 if (!dbg_s->is_pg_disabled) { 1017 if (!dbg_s->is_pg_disabled && !gk20a_gpu_is_virtual(dbg_s->dev)) {
1022 powergate_err = dbg_set_powergate(dbg_s, 1018 /* In the virtual case, the server will handle
1019 * disabling/enabling powergating when processing reg ops
1020 */
1021 powergate_err = dbg_s->ops->dbg_set_powergate(dbg_s,
1023 NVGPU_DBG_GPU_POWERGATE_MODE_DISABLE); 1022 NVGPU_DBG_GPU_POWERGATE_MODE_DISABLE);
1024 is_pg_disabled = true; 1023 is_pg_disabled = true;
1025 } 1024 }
@@ -1028,7 +1027,7 @@ static int nvgpu_ioctl_channel_reg_ops(struct dbg_session_gk20a *dbg_s,
1028 err = dbg_s->ops->exec_reg_ops(dbg_s, ops, args->num_ops); 1027 err = dbg_s->ops->exec_reg_ops(dbg_s, ops, args->num_ops);
1029 /* enable powergate, if previously disabled */ 1028 /* enable powergate, if previously disabled */
1030 if (is_pg_disabled) { 1029 if (is_pg_disabled) {
1031 powergate_err = dbg_set_powergate(dbg_s, 1030 powergate_err = dbg_s->ops->dbg_set_powergate(dbg_s,
1032 NVGPU_DBG_GPU_POWERGATE_MODE_ENABLE); 1031 NVGPU_DBG_GPU_POWERGATE_MODE_ENABLE);
1033 } 1032 }
1034 } 1033 }
@@ -1056,8 +1055,7 @@ static int nvgpu_ioctl_channel_reg_ops(struct dbg_session_gk20a *dbg_s,
1056 return err; 1055 return err;
1057} 1056}
1058 1057
1059static int dbg_set_powergate(struct dbg_session_gk20a *dbg_s, 1058static int dbg_set_powergate(struct dbg_session_gk20a *dbg_s, u32 powermode)
1060 __u32 powermode)
1061{ 1059{
1062 int err = 0; 1060 int err = 0;
1063 struct gk20a *g = get_gk20a(dbg_s->dev); 1061 struct gk20a *g = get_gk20a(dbg_s->dev);
@@ -1168,7 +1166,7 @@ static int nvgpu_ioctl_powergate_gk20a(struct dbg_session_gk20a *dbg_s,
1168 dev_name(dbg_s->dev), args->mode); 1166 dev_name(dbg_s->dev), args->mode);
1169 1167
1170 mutex_lock(&g->dbg_sessions_lock); 1168 mutex_lock(&g->dbg_sessions_lock);
1171 err = dbg_set_powergate(dbg_s, args->mode); 1169 err = dbg_s->ops->dbg_set_powergate(dbg_s, args->mode);
1172 mutex_unlock(&g->dbg_sessions_lock); 1170 mutex_unlock(&g->dbg_sessions_lock);
1173 return err; 1171 return err;
1174} 1172}