From 5fb06d03ca25a207b9378a7155c0ac3e91b378ee Mon Sep 17 00:00:00 2001 From: Sagar Kamble Date: Wed, 11 Aug 2021 14:54:22 +0530 Subject: gpu: nvgpu: stop ELPG init thread during unload ELPG initialization thread creation can fail when the process is killed. That leads to driver resume failure. That thread was stopped on suspend and re-created on resume. To avoid the issue above, don't stop the ELPG thread in suspend and let the first created thread handle the ELPG state transitions always. And stop the ELPG thread during unload. bug 3345977 bug 200685277 Change-Id: I8952edf8d1664ed258f238e265002e716d1bf5c2 Signed-off-by: Sagar Kamble Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvgpu/+/2573763 (cherry picked from commit f4571194b02094c7d447052bf0b411a44582ef09) Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvgpu/+/2574436 Tested-by: mobile promotions Reviewed-by: Konsta Holtta Reviewed-by: Bibek Basu Reviewed-by: mobile promotions --- drivers/gpu/nvgpu/common/pmu/pmu.c | 12 +++++++----- drivers/gpu/nvgpu/common/pmu/pmu_fw.c | 2 ++ 2 files changed, 9 insertions(+), 5 deletions(-) (limited to 'drivers/gpu') diff --git a/drivers/gpu/nvgpu/common/pmu/pmu.c b/drivers/gpu/nvgpu/common/pmu/pmu.c index 413db0a6..82f6a8d6 100644 --- a/drivers/gpu/nvgpu/common/pmu/pmu.c +++ b/drivers/gpu/nvgpu/common/pmu/pmu.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2020, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) 2017-2021, 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"), @@ -130,6 +130,10 @@ static int nvgpu_init_task_pg_init(struct gk20a *g) nvgpu_log_fn(g, " "); + if (nvgpu_thread_is_running(&pmu->pg_init.state_task)) { + return 0; + } + nvgpu_cond_init(&pmu->pg_init.wq); snprintf(thread_name, sizeof(thread_name), @@ -525,13 +529,13 @@ static int nvgpu_pg_init_task(void *arg) case PMU_STATE_LOADING_ZBC: nvgpu_pmu_dbg(g, "loaded zbc"); pmu_setup_hw_enable_elpg(g); - nvgpu_pmu_dbg(g, "PMU booted, thread exiting"); + nvgpu_pmu_dbg(g, "PMU booted"); gk20a_gr_wait_initialized(g); nvgpu_cg_elcg_enable_no_wait(g); - return 0; + break; default: nvgpu_pmu_dbg(g, "invalid state"); break; @@ -560,8 +564,6 @@ int nvgpu_pmu_destroy(struct gk20a *g) return 0; } - nvgpu_kill_task_pg_init(g); - nvgpu_pmu_get_pg_stats(g, PMU_PG_ELPG_ENGINE_ID_GRAPHICS, &pg_stat_data); diff --git a/drivers/gpu/nvgpu/common/pmu/pmu_fw.c b/drivers/gpu/nvgpu/common/pmu/pmu_fw.c index da77f984..d71238a3 100644 --- a/drivers/gpu/nvgpu/common/pmu/pmu_fw.c +++ b/drivers/gpu/nvgpu/common/pmu/pmu_fw.c @@ -1651,6 +1651,8 @@ static void nvgpu_remove_pmu_support(struct nvgpu_pmu *pmu) nvgpu_dma_unmap_free(vm, &pmu->super_surface_buf); + nvgpu_kill_task_pg_init(g); + nvgpu_mutex_destroy(&pmu->elpg_mutex); nvgpu_mutex_destroy(&pmu->pg_mutex); nvgpu_mutex_destroy(&pmu->isr_mutex); -- cgit v1.2.2