diff options
author | Alex Frid <afrid@nvidia.com> | 2010-06-08 20:49:07 -0700 |
---|---|---|
committer | Gary King <gking@nvidia.com> | 2010-06-10 08:59:30 -0700 |
commit | 9135f4cd777f6bf20e9b3e90139aa47334e26e0b (patch) | |
tree | 89990e73b0319c71ba5a32ebf57e8764bc478f71 /arch/arm/mach-tegra/nvrm | |
parent | 3f056ef87f5256910945e4907ca52ec040be7fe5 (diff) |
[ARM/tegra] RM: expanded CPU power off (LP2) policies.
Expanded CPU power off (LP2 state) policies as follows:
(a) "Enter in Low Corner" - LP2 is entered and DVFS tick interrupt is
masked only when DVFS is in low corner.
(b) "Mask in Low Corner" - LP2 is entered independently of DVFS, but DVFS
tick interrupt is masked only when low corner is hit
(c) "Ignore Low Corner" - LP2 is entered and DVFS tick interrupt is masked
independently of DVFS low corner.
Ported from android-tegra-2.6.29, but set default policy to (c), which is
the same as current android-tegra-2.6.32 kernel behavior (on 2.6.29 kernel
(a) was default).
Added sysfs node to change and evaluate policies.
Change-Id: I22e89f4d58dfa2e2fb668154c1ae2cd301fbe1ca
Reviewed-on: http://git-master/r/2359
Tested-by: Aleksandr Frid <afrid@nvidia.com>
Reviewed-by: Gary King <gking@nvidia.com>
Diffstat (limited to 'arch/arm/mach-tegra/nvrm')
-rw-r--r-- | arch/arm/mach-tegra/nvrm/core/common/nvrm_power_dfs.c | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/arch/arm/mach-tegra/nvrm/core/common/nvrm_power_dfs.c b/arch/arm/mach-tegra/nvrm/core/common/nvrm_power_dfs.c index 0723ea860fb0..a0bac50637cd 100644 --- a/arch/arm/mach-tegra/nvrm/core/common/nvrm_power_dfs.c +++ b/arch/arm/mach-tegra/nvrm/core/common/nvrm_power_dfs.c @@ -288,6 +288,9 @@ do\ /*****************************************************************************/ +// LP2 entry policy +NvRmLp2Policy g_Lp2Policy = NVRM_DEFAULT_LP2POLICY; + // DFS object static NvRmDfs s_Dfs; @@ -1210,19 +1213,23 @@ DfsGetTargetFrequencies( /* * Determine if low corner is hit in this domain - clear hit indicator - * if new target domain frequency is above low limit (with hysteresis) - * For platform with dedicated CPU partition do not include activity - * margin when there is no busy or starvation requirements + * if new target domain frequency is above low limit (with hysteresis). + * For platform with dedicated CPU partition adjust low corner threshold + * when no starvation is detected: if target frequency is limited by + * activity, include activity margin in the threshold; otherwise set + * low corner at busy hint level per LP2 policy */ if (NvRmPrivIsCpuRailDedicated(pDfs->hRm) && - (DomainBusyKHz <= LowCornerDomainKHz) && - ((*pDomainKHz) == pDomainSampler->BumpedAverageKHz)) + (!pDomainSampler->RtStarveBoostKHz) && + (!pDomainSampler->NrtStarveBoostKHz)) { - // Multiplying threshold has the same effect as dividing target - // to reduce margin - LowCornerDomainKHz += - (LowCornerDomainKHz >> pDomainParam->RelAdjustBits); + if ((*pDomainKHz) == pDomainSampler->BumpedAverageKHz) + LowCornerDomainKHz += + (LowCornerDomainKHz >> pDomainParam->RelAdjustBits); + else if (g_Lp2Policy != NvRmLp2Policy_EnterInLowCorner) + LowCornerDomainKHz = NV_MAX(DomainBusyKHz, LowCornerDomainKHz); } + if ( ((*pDomainKHz) > (LowCornerDomainKHz + pDomainParam->NrtStarveParam.BoostStepKHz)) || (((*pDomainKHz) > LowCornerDomainKHz) && (!pDfs->LowCornerHit)) |