diff --git a/drivers/gpu/nvgpu/common/pmu/pmu.c b/drivers/gpu/nvgpu/common/pmu/pmu.c index 413db0a6a..82f6a8d6d 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 da77f9849..d71238a31 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);