From 115c9100be6bb6e8b284f403eed772c5d32490e7 Mon Sep 17 00:00:00 2001 From: Alex Frid Date: Thu, 28 Jan 2010 14:45:56 -0800 Subject: tegra RM: Clipped CPU voltage to PMU capabilities. Clipped CPU voltage to PMU voltage range (maybe necessary for really fast parts with very low nominal voltage). Change-Id: I2483699cca0f0f5ba3001e75655dcb66d65275c7 --- arch/arm/mach-tegra/nvrm/core/ap15/ap15rm_power.c | 9 +++++++++ arch/arm/mach-tegra/nvrm/core/common/nvrm_clocks_limits.c | 2 ++ arch/arm/mach-tegra/nvrm/core/common/nvrm_power_dfs.c | 3 ++- 3 files changed, 13 insertions(+), 1 deletion(-) (limited to 'arch') 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); -- cgit v1.2.3