diff --git a/drivers/gpu/nvgpu/common/init/nvgpu_init.c b/drivers/gpu/nvgpu/common/init/nvgpu_init.c index c0068571f..edc8af946 100644 --- a/drivers/gpu/nvgpu/common/init/nvgpu_init.c +++ b/drivers/gpu/nvgpu/common/init/nvgpu_init.c @@ -43,6 +43,9 @@ #include #include #include +#ifdef CONFIG_NVGPU_NON_FUSA +#include +#endif #ifdef CONFIG_NVGPU_LS_PMU #include @@ -614,6 +617,9 @@ static int nvgpu_early_init(struct gk20a *g) NVGPU_INIT_TABLE_ENTRY(g->ops.bus.init_hw, NO_FLAG), NVGPU_INIT_TABLE_ENTRY(g->ops.priv_ring.enable_priv_ring, NO_FLAG), +#ifdef CONFIG_NVGPU_NON_FUSA + NVGPU_INIT_TABLE_ENTRY(&nvgpu_ptimer_init, NO_FLAG), +#endif /* TBD: move this after graphics init in which blcg/slcg is * enabled. This function removes SlowdownOnBoot which applies * 32x divider on gpcpll bypass path. The purpose of slowdown is diff --git a/drivers/gpu/nvgpu/common/power_features/cg/cg.c b/drivers/gpu/nvgpu/common/power_features/cg/cg.c index 543957e5f..25a6210ac 100644 --- a/drivers/gpu/nvgpu/common/power_features/cg/cg.c +++ b/drivers/gpu/nvgpu/common/power_features/cg/cg.c @@ -290,6 +290,23 @@ done: nvgpu_mutex_release(&g->cg_pg_lock); } +#if defined(CONFIG_NVGPU_HAL_NON_FUSA) && defined(CONFIG_NVGPU_NEXT) +void nvgpu_cg_slcg_timer_load_enable(struct gk20a *g) +{ + nvgpu_log_fn(g, " "); + + nvgpu_mutex_acquire(&g->cg_pg_lock); + if (!g->slcg_enabled) { + goto done; + } + if (g->ops.cg.slcg_timer_load_gating_prod != NULL) { + g->ops.cg.slcg_timer_load_gating_prod(g, true); + } +done: + nvgpu_mutex_release(&g->cg_pg_lock); +} +#endif + #ifdef CONFIG_NVGPU_PROFILER void nvgpu_cg_slcg_perf_load_enable(struct gk20a *g, bool enable) { @@ -602,6 +619,9 @@ void nvgpu_cg_slcg_set_slcg_enabled(struct gk20a *g, bool enable) if (g->ops.cg.slcg_runlist_load_gating_prod != NULL) { g->ops.cg.slcg_runlist_load_gating_prod(g, enable); } + if (g->ops.cg.slcg_timer_load_gating_prod != NULL) { + g->ops.cg.slcg_timer_load_gating_prod(g, enable); + } #endif if (g->ops.cg.slcg_gr_load_gating_prod != NULL) { g->ops.cg.slcg_gr_load_gating_prod(g, enable); diff --git a/drivers/gpu/nvgpu/common/ptimer/ptimer.c b/drivers/gpu/nvgpu/common/ptimer/ptimer.c index fa0af217a..1d9bbf3a2 100644 --- a/drivers/gpu/nvgpu/common/ptimer/ptimer.c +++ b/drivers/gpu/nvgpu/common/ptimer/ptimer.c @@ -25,6 +25,16 @@ #include #include #include +#include + +int nvgpu_ptimer_init(struct gk20a *g) +{ +#if defined(CONFIG_NVGPU_NEXT) + nvgpu_cg_slcg_timer_load_enable(g); +#endif + + return 0; +} int nvgpu_get_timestamps_zipper(struct gk20a *g, u32 source_id, u32 count, diff --git a/drivers/gpu/nvgpu/include/nvgpu/power_features/cg.h b/drivers/gpu/nvgpu/include/nvgpu/power_features/cg.h index 41ddc4636..3a6cc11d9 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/power_features/cg.h +++ b/drivers/gpu/nvgpu/include/nvgpu/power_features/cg.h @@ -479,7 +479,9 @@ void nvgpu_cg_blcg_set_blcg_enabled(struct gk20a *g, bool enable); void nvgpu_cg_slcg_gr_perf_ltc_load_enable(struct gk20a *g); void nvgpu_cg_slcg_gr_perf_ltc_load_disable(struct gk20a *g); void nvgpu_cg_slcg_set_slcg_enabled(struct gk20a *g, bool enable); - +#if defined(CONFIG_NVGPU_NEXT) +void nvgpu_cg_slcg_timer_load_enable(struct gk20a *g); +#endif #endif #ifdef CONFIG_NVGPU_PROFILER diff --git a/drivers/gpu/nvgpu/include/nvgpu/ptimer.h b/drivers/gpu/nvgpu/include/nvgpu/ptimer.h index f1da779ca..4163f58a7 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/ptimer.h +++ b/drivers/gpu/nvgpu/include/nvgpu/ptimer.h @@ -120,5 +120,6 @@ static inline u32 scale_ptimer(u32 timeout , u32 scale10x) int nvgpu_get_timestamps_zipper(struct gk20a *g, u32 source_id, u32 count, struct nvgpu_cpu_time_correlation_sample *samples); +int nvgpu_ptimer_init(struct gk20a *g); #endif /* CONFIG_NVGPU_IOCTL_NON_FUSA */ #endif