]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
gpu: nvgpu: Do not panic if PMU/regops not supported
authorTerje Bergstrom <tbergstrom@nvidia.com>
Tue, 13 Jan 2015 01:17:16 +0000 (03:17 +0200)
committerTerje Bergstrom <tbergstrom@nvidia.com>
Fri, 23 Jan 2015 04:57:22 +0000 (20:57 -0800)
Fix panics when using regops when PMU is disabled, or when whitelists
have not been defined.

Bug 1592505

Change-Id: I316c98147c54be7b1114ad23049ce3a634d4805e
Signed-off-by: Terje Bergstrom <tbergstrom@nvidia.com>
Reviewed-on: http://git-master/r/671841

drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c
drivers/gpu/nvgpu/gk20a/regops_gk20a.c

index 35a43130cfdd5d0384896bcf8d6b7554c4b59c82..daed29670035266c034bf283439374ce1f7d4200 100644 (file)
@@ -600,7 +600,8 @@ static int dbg_set_powergate(struct dbg_session_gk20a *dbg_s,
                                return -EPERM;
 
                        /*do elpg disable before clock gating */
-                       gk20a_pmu_disable_elpg(g);
+                       if (support_gk20a_pmu(g->dev))
+                               gk20a_pmu_disable_elpg(g);
                        g->ops.clock_gating.slcg_gr_load_gating_prod(g,
                                        false);
                        g->ops.clock_gating.slcg_perf_load_gating_prod(g,
@@ -640,7 +641,8 @@ static int dbg_set_powergate(struct dbg_session_gk20a *dbg_s,
                        g->ops.clock_gating.slcg_perf_load_gating_prod(g,
                                        g->slcg_enabled);
 
-                       gk20a_pmu_enable_elpg(g);
+                       if (support_gk20a_pmu(g->dev))
+                               gk20a_pmu_enable_elpg(g);
 
                        gk20a_dbg(gpu_dbg_gpu_dbg | gpu_dbg_fn, "module idle");
                        gk20a_idle(dbg_s->pdev);
index 04659bcf11b0d4efb5f8fc2c380af01fe53a3b52..11ab7bc3645f6b97d3f55816cb17fcf57f7e9d00 100644 (file)
@@ -561,7 +561,8 @@ static bool check_whitelists(struct dbg_session_gk20a *dbg_s,
 
        if (op->type == REGOP(TYPE_GLOBAL)) {
                /* search global list */
-               valid = !!bsearch(&offset,
+               valid = g->ops.regops.get_global_whitelist_ranges &&
+                       !!bsearch(&offset,
                        g->ops.regops.get_global_whitelist_ranges(),
                        g->ops.regops.get_global_whitelist_ranges_count(),
                        sizeof(*g->ops.regops.get_global_whitelist_ranges()),
@@ -570,7 +571,8 @@ static bool check_whitelists(struct dbg_session_gk20a *dbg_s,
                /* if debug session and channel is bound search context list */
                if ((!valid) && (!dbg_s->is_profiler && dbg_s->ch)) {
                        /* binary search context list */
-                       valid = !!bsearch(&offset,
+                       valid = g->ops.regops.get_context_whitelist_ranges &&
+                               !!bsearch(&offset,
                        g->ops.regops.get_context_whitelist_ranges(),
                        g->ops.regops.get_context_whitelist_ranges_count(),
                        sizeof(*g->ops.regops.get_context_whitelist_ranges()),
@@ -579,7 +581,8 @@ static bool check_whitelists(struct dbg_session_gk20a *dbg_s,
 
                /* if debug session and channel is bound search runcontrol list */
                if ((!valid) && (!dbg_s->is_profiler && dbg_s->ch)) {
-                       valid = linear_search(offset,
+                       valid = g->ops.regops.get_runcontrol_whitelist &&
+                               linear_search(offset,
                                g->ops.regops.get_runcontrol_whitelist(),
                                g->ops.regops.get_runcontrol_whitelist_count());
                }
@@ -592,7 +595,8 @@ static bool check_whitelists(struct dbg_session_gk20a *dbg_s,
                }
 
                /* binary search context list */
-               valid = !!bsearch(&offset,
+               valid = g->ops.regops.get_context_whitelist_ranges &&
+                       !!bsearch(&offset,
                        g->ops.regops.get_context_whitelist_ranges(),
                        g->ops.regops.get_context_whitelist_ranges_count(),
                        sizeof(*g->ops.regops.get_context_whitelist_ranges()),
@@ -600,13 +604,15 @@ static bool check_whitelists(struct dbg_session_gk20a *dbg_s,
 
                /* if debug session and channel is bound search runcontrol list */
                if ((!valid) && (!dbg_s->is_profiler && dbg_s->ch)) {
-                       valid = linear_search(offset,
+                       valid = g->ops.regops.get_runcontrol_whitelist &&
+                               linear_search(offset,
                                g->ops.regops.get_runcontrol_whitelist(),
                                g->ops.regops.get_runcontrol_whitelist_count());
                }
 
        } else if (op->type == REGOP(TYPE_GR_CTX_QUAD)) {
-               valid = linear_search(offset,
+               valid = g->ops.regops.get_qctl_whitelist &&
+                       linear_search(offset,
                                g->ops.regops.get_qctl_whitelist(),
                                g->ops.regops.get_qctl_whitelist_count());
        }