diff options
author | Mahantesh Kumbar <mkumbar@nvidia.com> | 2016-11-14 00:57:38 -0500 |
---|---|---|
committer | mobile promotions <svcmobile_promotions@nvidia.com> | 2017-01-17 11:15:12 -0500 |
commit | efe0758081f25b39d5bb8b097fc0ae64d0e47c3f (patch) | |
tree | f99d333adfb8db97524508d2b81beec1164e9fde /drivers/gpu/nvgpu/lpwr/lpwr.c | |
parent | 157ff622f3156a68281a5d1c0eb97bc8ad3a5b3b (diff) |
gpu: nvgpu: fix pmu->mscg_stat optimization issue
- with help of WRITE_ONCE() & ACCESS_ONCE()
make sure variable pmu->mscg_stat read/write goes through
without optimization
- Added WRITE_ONCE() define for kernel-3.18 version & below
to support backward compatibility
issue: inconsistencies on getting MSCG to trigger consistently in P5
due to a lack of memory barrier around and volatile accesses to the
variable pmu->mscg_stat
JIRA DNVGPU-71
Change-Id: I04d30493d42c52710304dbdfb9cb4a1e9a76f2c0
Signed-off-by: Mahantesh Kumbar <mkumbar@nvidia.com>
Reviewed-on: http://git-master/r/1252524
(cherry picked from commit 8af7fc68e7ab06a856ba4ef4e44de7336682361b)
Reviewed-on: http://git-master/r/1271614
Reviewed-by: svccoveritychecker <svccoveritychecker@nvidia.com>
GVS: Gerrit_Virtual_Submit
Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/lpwr/lpwr.c')
-rw-r--r-- | drivers/gpu/nvgpu/lpwr/lpwr.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/drivers/gpu/nvgpu/lpwr/lpwr.c b/drivers/gpu/nvgpu/lpwr/lpwr.c index 4f8d2eec..e3483cca 100644 --- a/drivers/gpu/nvgpu/lpwr/lpwr.c +++ b/drivers/gpu/nvgpu/lpwr/lpwr.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved. | 2 | * Copyright (c) 2016-2017, NVIDIA CORPORATION. All rights reserved. |
3 | * | 3 | * |
4 | * This program is free software; you can redistribute it and/or modify it | 4 | * This program is free software; you can redistribute it and/or modify it |
5 | * under the terms and conditions of the GNU General Public License, | 5 | * under the terms and conditions of the GNU General Public License, |
@@ -362,8 +362,11 @@ int nvgpu_lpwr_enable_pg(struct gk20a *g, bool pstate_lock) | |||
362 | is_mscg_supported = nvgpu_lpwr_is_mscg_supported(g, | 362 | is_mscg_supported = nvgpu_lpwr_is_mscg_supported(g, |
363 | present_pstate); | 363 | present_pstate); |
364 | if (is_mscg_supported && g->mscg_enabled) { | 364 | if (is_mscg_supported && g->mscg_enabled) { |
365 | if (!pmu->mscg_stat) | 365 | if (!ACCESS_ONCE(pmu->mscg_stat)) { |
366 | pmu->mscg_stat = PMU_MSCG_ENABLED; | 366 | WRITE_ONCE(pmu->mscg_stat, PMU_MSCG_ENABLED); |
367 | /* make status visible */ | ||
368 | smp_mb(); | ||
369 | } | ||
367 | } | 370 | } |
368 | 371 | ||
369 | is_rppg_supported = nvgpu_lpwr_is_rppg_supported(g, | 372 | is_rppg_supported = nvgpu_lpwr_is_rppg_supported(g, |
@@ -409,8 +412,11 @@ int nvgpu_lpwr_disable_pg(struct gk20a *g, bool pstate_lock) | |||
409 | is_mscg_supported = nvgpu_lpwr_is_mscg_supported(g, | 412 | is_mscg_supported = nvgpu_lpwr_is_mscg_supported(g, |
410 | present_pstate); | 413 | present_pstate); |
411 | if (is_mscg_supported && g->mscg_enabled) { | 414 | if (is_mscg_supported && g->mscg_enabled) { |
412 | if (pmu->mscg_stat) | 415 | if (ACCESS_ONCE(pmu->mscg_stat)) { |
413 | pmu->mscg_stat = PMU_MSCG_DISABLED; | 416 | WRITE_ONCE(pmu->mscg_stat, PMU_MSCG_DISABLED); |
417 | /* make status visible */ | ||
418 | smp_mb(); | ||
419 | } | ||
414 | } | 420 | } |
415 | 421 | ||
416 | exit_unlock: | 422 | exit_unlock: |