summaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorGary King <GKing@nvidia.com>2010-01-29 19:24:04 -0800
committerGerrit Code Review <gerrit2@git-master-01.nvidia.com>2010-01-29 19:24:04 -0800
commite1e9d2a0bb7dc6e638a6cbdcf1aa76cc99c04548 (patch)
treebe2e885263ae9208dfa008bbda6417be6eb3cf71 /arch
parent6ba97542572e9d9544e501525095a5381c290391 (diff)
parent115c9100be6bb6e8b284f403eed772c5d32490e7 (diff)
Merge "tegra RM: Clipped CPU voltage to PMU capabilities." into android-tegra-2.6.29
Diffstat (limited to 'arch')
-rw-r--r--arch/arm/mach-tegra/nvrm/core/ap15/ap15rm_power.c9
-rw-r--r--arch/arm/mach-tegra/nvrm/core/common/nvrm_clocks_limits.c2
-rw-r--r--arch/arm/mach-tegra/nvrm/core/common/nvrm_power_dfs.c3
3 files changed, 13 insertions, 1 deletions
diff --git a/arch/arm/mach-tegra/nvrm/core/ap15/ap15rm_power.c b/arch/arm/mach-tegra/nvrm/core/ap15/ap15rm_power.c
index e7781256b71e..04a6952442ff 100644
--- a/arch/arm/mach-tegra/nvrm/core/ap15/ap15rm_power.c
+++ b/arch/arm/mach-tegra/nvrm/core/ap15/ap15rm_power.c
@@ -542,6 +542,7 @@ void NvRmPrivCoreVoltageInit(NvRmDeviceHandle hRmDevice)
// nominal level as well (bump PMU ref count along the way).
if (NvRmPrivIsCpuRailDedicated(hRmDevice))
{
+ NvRmPmuVddRailCapabilities cap;
NvRmMilliVolts NominalCpuMv = NvRmPrivModuleVscaleGetMV(
hRmDevice, NvRmModuleID_Cpu,
NvRmPrivGetSocClockLimits(NvRmModuleID_Cpu)->MaxKHz);
@@ -550,6 +551,14 @@ void NvRmPrivCoreVoltageInit(NvRmDeviceHandle hRmDevice)
NV_ASSERT(pPmuRail);
NV_ASSERT(pPmuRail->NumAddress);
CpuRailAddress = pPmuRail->AddressList[0].Address;
+
+ // Clip nominal CPU voltage to minimal PMU capabilities, and set it.
+ // (note: PMU with CPU voltage range above nominal is temporary
+ // accepted exception; for other limit violations: PMU maximum level
+ // for CPU is not high enough, or PMU core range does not include
+ // nominal core voltage, assert is fired inside NvRmPmuSetVoltage())
+ NvRmPmuGetCapabilities(hRmDevice, CpuRailAddress, &cap);
+ NominalCpuMv = NV_MAX(NominalCpuMv, cap.MinMilliVolts);
NvRmPmuSetVoltage(hRmDevice, CpuRailAddress, NominalCpuMv, NULL);
}
diff --git a/arch/arm/mach-tegra/nvrm/core/common/nvrm_clocks_limits.c b/arch/arm/mach-tegra/nvrm/core/common/nvrm_clocks_limits.c
index 08e93fb28841..896159674634 100644
--- a/arch/arm/mach-tegra/nvrm/core/common/nvrm_clocks_limits.c
+++ b/arch/arm/mach-tegra/nvrm/core/common/nvrm_clocks_limits.c
@@ -128,6 +128,8 @@ NvRmPrivClockLimitsInit(NvRmDeviceHandle hRmDevice)
pShmoo = s_ChipFlavor.pSocShmoo;
pHwLimits = &pShmoo->ScaledLimitsList[0];
pSKUedLimits = pShmoo->pSKUedLimits;
+ NvOsDebugPrintf("NVRM corner (%d, %d)\n",
+ s_ChipFlavor.corner, s_ChipFlavor.CpuCorner);
NvOsMemset((void*)s_pClockScales, 0, sizeof(s_pClockScales));
NvOsMemset(s_ClockRangeLimits, 0, sizeof(s_ClockRangeLimits));
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 7cd0abeb9ce6..38b68621cd3f 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
@@ -2296,8 +2296,9 @@ void NvRmPrivDvsInit(void)
(cap.StepMilliVolts <= NVRM_CORE_RESOLUTION_MV));
#if NVRM_DVS_ACCEPT_PMU_HIGH_CPU_MIN
pDvs->MinCpuMv = NV_MAX(pDvs->MinCpuMv, cap.MinMilliVolts);
- NV_ASSERT(pDvs->MinCpuMv <= pDvs->NominalCpuMv);
+ pDvs->NominalCpuMv = NV_MAX(pDvs->NominalCpuMv, pDvs->MinCpuMv);
#else
+ NV_ASSERT(pDvs->MinCpuMv <= pDvs->NominalCpuMv);
NV_ASSERT(cap.MinMilliVolts <= pDvs->MinCpuMv);
#endif
NV_ASSERT(cap.MaxMilliVolts >= pDvs->NominalCpuMv);