summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorSagar Kamble <skamble@nvidia.com>2021-08-11 05:24:22 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2021-08-12 08:39:59 -0400
commit5fb06d03ca25a207b9378a7155c0ac3e91b378ee (patch)
tree72787d85bfc78ce4f6255f0ff544c4351e625f6c /drivers
parentce8548ec056022c4feccacc9eb09a4e8619bdefa (diff)
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 <skamble@nvidia.com> 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 <svcmobile_promotions@nvidia.com> Reviewed-by: Konsta Holtta <kholtta@nvidia.com> Reviewed-by: Bibek Basu <bbasu@nvidia.com> Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/nvgpu/common/pmu/pmu.c12
-rw-r--r--drivers/gpu/nvgpu/common/pmu/pmu_fw.c2
2 files changed, 9 insertions, 5 deletions
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 @@
1/* 1/*
2 * Copyright (c) 2017-2020, NVIDIA CORPORATION. All rights reserved. 2 * Copyright (c) 2017-2021, NVIDIA CORPORATION. All rights reserved.
3 * 3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a 4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"), 5 * copy of this software and associated documentation files (the "Software"),
@@ -130,6 +130,10 @@ static int nvgpu_init_task_pg_init(struct gk20a *g)
130 130
131 nvgpu_log_fn(g, " "); 131 nvgpu_log_fn(g, " ");
132 132
133 if (nvgpu_thread_is_running(&pmu->pg_init.state_task)) {
134 return 0;
135 }
136
133 nvgpu_cond_init(&pmu->pg_init.wq); 137 nvgpu_cond_init(&pmu->pg_init.wq);
134 138
135 snprintf(thread_name, sizeof(thread_name), 139 snprintf(thread_name, sizeof(thread_name),
@@ -525,13 +529,13 @@ static int nvgpu_pg_init_task(void *arg)
525 case PMU_STATE_LOADING_ZBC: 529 case PMU_STATE_LOADING_ZBC:
526 nvgpu_pmu_dbg(g, "loaded zbc"); 530 nvgpu_pmu_dbg(g, "loaded zbc");
527 pmu_setup_hw_enable_elpg(g); 531 pmu_setup_hw_enable_elpg(g);
528 nvgpu_pmu_dbg(g, "PMU booted, thread exiting"); 532 nvgpu_pmu_dbg(g, "PMU booted");
529 533
530 gk20a_gr_wait_initialized(g); 534 gk20a_gr_wait_initialized(g);
531 535
532 nvgpu_cg_elcg_enable_no_wait(g); 536 nvgpu_cg_elcg_enable_no_wait(g);
533 537
534 return 0; 538 break;
535 default: 539 default:
536 nvgpu_pmu_dbg(g, "invalid state"); 540 nvgpu_pmu_dbg(g, "invalid state");
537 break; 541 break;
@@ -560,8 +564,6 @@ int nvgpu_pmu_destroy(struct gk20a *g)
560 return 0; 564 return 0;
561 } 565 }
562 566
563 nvgpu_kill_task_pg_init(g);
564
565 nvgpu_pmu_get_pg_stats(g, 567 nvgpu_pmu_get_pg_stats(g,
566 PMU_PG_ELPG_ENGINE_ID_GRAPHICS, &pg_stat_data); 568 PMU_PG_ELPG_ENGINE_ID_GRAPHICS, &pg_stat_data);
567 569
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)
1651 1651
1652 nvgpu_dma_unmap_free(vm, &pmu->super_surface_buf); 1652 nvgpu_dma_unmap_free(vm, &pmu->super_surface_buf);
1653 1653
1654 nvgpu_kill_task_pg_init(g);
1655
1654 nvgpu_mutex_destroy(&pmu->elpg_mutex); 1656 nvgpu_mutex_destroy(&pmu->elpg_mutex);
1655 nvgpu_mutex_destroy(&pmu->pg_mutex); 1657 nvgpu_mutex_destroy(&pmu->pg_mutex);
1656 nvgpu_mutex_destroy(&pmu->isr_mutex); 1658 nvgpu_mutex_destroy(&pmu->isr_mutex);