summaryrefslogtreecommitdiff
path: root/arch/arm/mach-tegra/nvrm
diff options
context:
space:
mode:
authorAlex Frid <afrid@nvidia.com>2010-06-08 20:49:07 -0700
committerGary King <gking@nvidia.com>2010-06-10 08:59:30 -0700
commit9135f4cd777f6bf20e9b3e90139aa47334e26e0b (patch)
tree89990e73b0319c71ba5a32ebf57e8764bc478f71 /arch/arm/mach-tegra/nvrm
parent3f056ef87f5256910945e4907ca52ec040be7fe5 (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.c25
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))