diff options
author | Terje Bergstrom <tbergstrom@nvidia.com> | 2017-05-01 21:32:46 -0400 |
---|---|---|
committer | mobile promotions <svcmobile_promotions@nvidia.com> | 2017-05-03 15:16:24 -0400 |
commit | e2148ead8bbf51c2dbf9e2b501c989f2c27582a0 (patch) | |
tree | 2124f62df3dd52478f70b4309a00e6661ad6dc43 /drivers/gpu | |
parent | b3c3ffcbfba99628f033b36e53d8dfc4a5ccd7b9 (diff) |
gpu: nvgpu: Program CE clock gating list after reset
Clock gating list for CE was programmed at GR init, but at that time
CE has not yet been brought out of reset. This causes a priv ring
error and the clock gating setting does not take place. Move
programming of CE clock gating list to CE initialization.
Bug 1846641
Change-Id: Ibc9fe2487408358304f80cd679d3b1ecac7cebe8
Signed-off-by: Terje Bergstrom <tbergstrom@nvidia.com>
Reviewed-on: http://git-master/r/1473301
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/ce2_gk20a.c | 12 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/fifo_gk20a.c | 3 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/gr_gk20a.c | 9 |
3 files changed, 13 insertions, 11 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/ce2_gk20a.c b/drivers/gpu/nvgpu/gk20a/ce2_gk20a.c index ed5a8b4e..8e3f1754 100644 --- a/drivers/gpu/nvgpu/gk20a/ce2_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/ce2_gk20a.c | |||
@@ -339,6 +339,18 @@ int gk20a_init_ce_support(struct gk20a *g) | |||
339 | { | 339 | { |
340 | struct gk20a_ce_app *ce_app = &g->ce_app; | 340 | struct gk20a_ce_app *ce_app = &g->ce_app; |
341 | int err; | 341 | int err; |
342 | u32 ce_reset_mask; | ||
343 | |||
344 | ce_reset_mask = gk20a_fifo_get_all_ce_engine_reset_mask(g); | ||
345 | |||
346 | g->ops.mc.reset(g, ce_reset_mask); | ||
347 | |||
348 | if (g->ops.clock_gating.slcg_ce2_load_gating_prod) | ||
349 | g->ops.clock_gating.slcg_ce2_load_gating_prod(g, | ||
350 | g->slcg_enabled); | ||
351 | if (g->ops.clock_gating.blcg_ce_load_gating_prod) | ||
352 | g->ops.clock_gating.blcg_ce_load_gating_prod(g, | ||
353 | g->blcg_enabled); | ||
342 | 354 | ||
343 | if (ce_app->initialised) { | 355 | if (ce_app->initialised) { |
344 | /* assume this happen during poweron/poweroff GPU sequence */ | 356 | /* assume this happen during poweron/poweroff GPU sequence */ |
diff --git a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c index 4129e407..cb54a1ca 100644 --- a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c | |||
@@ -767,9 +767,6 @@ int gk20a_init_fifo_reset_enable_hw(struct gk20a *g) | |||
767 | /* enable pmc pfifo */ | 767 | /* enable pmc pfifo */ |
768 | g->ops.mc.reset(g, mc_enable_pfifo_enabled_f()); | 768 | g->ops.mc.reset(g, mc_enable_pfifo_enabled_f()); |
769 | 769 | ||
770 | if (g->ops.clock_gating.slcg_ce2_load_gating_prod) | ||
771 | g->ops.clock_gating.slcg_ce2_load_gating_prod(g, | ||
772 | g->slcg_enabled); | ||
773 | if (g->ops.clock_gating.slcg_fifo_load_gating_prod) | 770 | if (g->ops.clock_gating.slcg_fifo_load_gating_prod) |
774 | g->ops.clock_gating.slcg_fifo_load_gating_prod(g, | 771 | g->ops.clock_gating.slcg_fifo_load_gating_prod(g, |
775 | g->slcg_enabled); | 772 | g->slcg_enabled); |
diff --git a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c index b2225dae..48becc81 100644 --- a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c | |||
@@ -4935,9 +4935,6 @@ static void gr_gk20a_load_gating_prod(struct gk20a *g) | |||
4935 | if (g->ops.clock_gating.blcg_bus_load_gating_prod) | 4935 | if (g->ops.clock_gating.blcg_bus_load_gating_prod) |
4936 | g->ops.clock_gating.blcg_bus_load_gating_prod(g, | 4936 | g->ops.clock_gating.blcg_bus_load_gating_prod(g, |
4937 | g->blcg_enabled); | 4937 | g->blcg_enabled); |
4938 | if (g->ops.clock_gating.blcg_ce_load_gating_prod) | ||
4939 | g->ops.clock_gating.blcg_ce_load_gating_prod(g, | ||
4940 | g->blcg_enabled); | ||
4941 | if (g->ops.clock_gating.blcg_gr_load_gating_prod) | 4938 | if (g->ops.clock_gating.blcg_gr_load_gating_prod) |
4942 | g->ops.clock_gating.blcg_gr_load_gating_prod(g, | 4939 | g->ops.clock_gating.blcg_gr_load_gating_prod(g, |
4943 | g->blcg_enabled); | 4940 | g->blcg_enabled); |
@@ -4957,9 +4954,6 @@ static int gk20a_init_gr_prepare(struct gk20a *g) | |||
4957 | { | 4954 | { |
4958 | u32 gpfifo_ctrl, pmc_en; | 4955 | u32 gpfifo_ctrl, pmc_en; |
4959 | u32 err = 0; | 4956 | u32 err = 0; |
4960 | u32 ce_reset_mask; | ||
4961 | |||
4962 | ce_reset_mask = gk20a_fifo_get_all_ce_engine_reset_mask(g); | ||
4963 | 4957 | ||
4964 | /* disable fifo access */ | 4958 | /* disable fifo access */ |
4965 | pmc_en = gk20a_readl(g, mc_enable_r()); | 4959 | pmc_en = gk20a_readl(g, mc_enable_r()); |
@@ -4972,8 +4966,7 @@ static int gk20a_init_gr_prepare(struct gk20a *g) | |||
4972 | /* reset gr engine */ | 4966 | /* reset gr engine */ |
4973 | g->ops.mc.reset(g, mc_enable_pgraph_enabled_f() | | 4967 | g->ops.mc.reset(g, mc_enable_pgraph_enabled_f() | |
4974 | mc_enable_blg_enabled_f() | | 4968 | mc_enable_blg_enabled_f() | |
4975 | mc_enable_perfmon_enabled_f() | | 4969 | mc_enable_perfmon_enabled_f()); |
4976 | ce_reset_mask); | ||
4977 | 4970 | ||
4978 | gr_gk20a_load_gating_prod(g); | 4971 | gr_gk20a_load_gating_prod(g); |
4979 | 4972 | ||