From c81cc032c48a1b25e095b17b77399166c9091ff3 Mon Sep 17 00:00:00 2001 From: Debarshi Dutta Date: Tue, 30 Apr 2019 13:54:08 +0530 Subject: gpu: nvgpu: add cg and pg function Add new power/clock gating functions that can be called by other units. New clock_gating functions will reside in cg.c under common/power_features/cg unit. New power gating functions will reside in pg.c under common/power_features/pg unit. Use nvgpu_pg_elpg_disable and nvgpu_pg_elpg_enable to disable/enable elpg and also in gr_gk20a_elpg_protected macro to access gr registers. Add cg_pg_lock to make elpg_enabled, elcg_enabled, blcg_enabled and slcg_enabled thread safe. JIRA NVGPU-2014 Change-Id: I00d124c2ee16242c9a3ef82e7620fbb7f1297aff Signed-off-by: Seema Khowala Reviewed-on: https://git-master.nvidia.com/r/2025493 Signed-off-by: Debarshi Dutta (cherry-picked from c90585856567a547173a8b207365b3a4a3ccdd57 in dev-kernel) Reviewed-on: https://git-master.nvidia.com/r/2108406 GVS: Gerrit_Virtual_Submit Reviewed-by: Bibek Basu Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/common/power_features/pg/pg.c | 106 ++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 drivers/gpu/nvgpu/common/power_features/pg/pg.c (limited to 'drivers/gpu/nvgpu/common/power_features/pg') diff --git a/drivers/gpu/nvgpu/common/power_features/pg/pg.c b/drivers/gpu/nvgpu/common/power_features/pg/pg.c new file mode 100644 index 00000000..fa31f4e3 --- /dev/null +++ b/drivers/gpu/nvgpu/common/power_features/pg/pg.c @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2019, NVIDIA CORPORATION. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include +#include +#include + +bool nvgpu_pg_elpg_is_enabled(struct gk20a *g) +{ + bool elpg_enabled; + + nvgpu_log_fn(g, " "); + + nvgpu_mutex_acquire(&g->cg_pg_lock); + elpg_enabled = g->elpg_enabled; + nvgpu_mutex_release(&g->cg_pg_lock); + return elpg_enabled; +} + +int nvgpu_pg_elpg_enable(struct gk20a *g) +{ + int err = 0; + + nvgpu_log_fn(g, " "); + + if (!g->can_elpg) { + return 0; + } + + nvgpu_mutex_acquire(&g->cg_pg_lock); + if (g->elpg_enabled) { + err = nvgpu_pmu_pg_global_enable(g, true); + } + nvgpu_mutex_release(&g->cg_pg_lock); + return err; +} + +int nvgpu_pg_elpg_disable(struct gk20a *g) +{ + int err = 0; + + nvgpu_log_fn(g, " "); + + if (!g->can_elpg) { + return 0; + } + + nvgpu_mutex_acquire(&g->cg_pg_lock); + if (g->elpg_enabled) { + err = nvgpu_pmu_pg_global_enable(g, false); + } + nvgpu_mutex_release(&g->cg_pg_lock); + return err; +} + +int nvgpu_pg_elpg_set_elpg_enabled(struct gk20a *g, bool enable) +{ + int err = 0; + bool change_mode = false; + + nvgpu_log_fn(g, " "); + + if (!g->can_elpg) { + return 0; + } + + nvgpu_mutex_acquire(&g->cg_pg_lock); + if (enable) { + if (!g->elpg_enabled) { + change_mode = true; + g->elpg_enabled = true; + } + } else { + if (g->elpg_enabled) { + change_mode = true; + g->elpg_enabled = false; + } + } + if (!change_mode) { + goto done; + } + + err = nvgpu_pmu_pg_global_enable(g, enable); +done: + nvgpu_mutex_release(&g->cg_pg_lock); + return err; +} -- cgit v1.2.2