Index: arch/arm/mach-tegra/nv/nvrm/core/ap15/ap15rm_clocks.h |
diff --git a/arch/arm/mach-tegra/nv/nvrm/core/ap15/ap15rm_clocks.h b/arch/arm/mach-tegra/nv/nvrm/core/ap15/ap15rm_clocks.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..9033261ba9ac75ba488fed164c96a013b9be826c |
--- /dev/null |
+++ b/arch/arm/mach-tegra/nv/nvrm/core/ap15/ap15rm_clocks.h |
@@ -0,0 +1,460 @@ |
+/* |
+ * Copyright (c) 2007-2009 NVIDIA Corporation. |
+ * All rights reserved. |
+ * |
+ * Redistribution and use in source and binary forms, with or without |
+ * modification, are permitted provided that the following conditions are met: |
+ * |
+ * Redistributions of source code must retain the above copyright notice, |
+ * this list of conditions and the following disclaimer. |
+ * |
+ * Redistributions in binary form must reproduce the above copyright notice, |
+ * this list of conditions and the following disclaimer in the documentation |
+ * and/or other materials provided with the distribution. |
+ * |
+ * Neither the name of the NVIDIA Corporation nor the names of its contributors |
+ * may be used to endorse or promote products derived from this software |
+ * without specific prior written permission. |
+ * |
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
+ * POSSIBILITY OF SUCH DAMAGE. |
+ * |
+ */ |
+ |
+#ifndef INCLUDED_AP15RM_CLOCKS_H |
+#define INCLUDED_AP15RM_CLOCKS_H |
+ |
+#include "nvrm_clocks.h" |
+ |
+#ifdef __cplusplus |
+extern "C" |
+{ |
+#endif /* __cplusplus */ |
+ |
+extern const NvRmModuleClockInfo g_Ap15ModuleClockTable[]; |
+extern const NvU32 g_Ap15ModuleClockTableSize; |
+ |
+// PLLM ratios for graphic clocks |
+#define NVRM_PLLM_HOST_SPEED_RATIO (4) |
+#define NVRM_PLLM_2D_LOW_SPEED_RATIO (3) |
+#define NVRM_PLLM_2D_HIGH_SPEED_RATIO (2) |
+ |
+/** |
+ * Defines frequency steps derived from PLLP0 fixed output to be used as System |
+ * clock source frequency. The frequency specified in kHz, and it will be rounded |
+ * up to the closest divider output. |
+ */ |
+#define NVRM_AP15_PLLP_POLICY_SYSTEM_CLOCK \ |
+ PLLP_POLICY_ENTRY(54000) /* PLLP divider 6, output frequency 54,000kHz */ \ |
+ PLLP_POLICY_ENTRY(72000) /* PLLP divider 4, output frequency 72,000kHz */ \ |
+ PLLP_POLICY_ENTRY(108000) /* PLLP divider 2, output frequency 108,000kHz */ \ |
+ PLLP_POLICY_ENTRY(144000) /* PLLP divider 1, output frequency 144,000kHz */ \ |
+ PLLP_POLICY_ENTRY(216000) /* PLLP divider 0, output frequency 216,000kHz */ |
+ |
+/** |
+ * Defines frequency steps derived from PLLP0 fixed output to be used as CPU |
+ * clock source frequency. The frequency specified in kHz, and it will be rounded |
+ * up to the closest divider output. |
+ */ |
+#define NVRM_AP15_PLLP_POLICY_CPU_CLOCK \ |
+ PLLP_POLICY_ENTRY(24000) /* PLLP divider 16, output frequency 24,000kHz */ \ |
+ PLLP_POLICY_ENTRY(54000) /* PLLP divider 6, output frequency 54,000kHz */ \ |
+ PLLP_POLICY_ENTRY(108000) /* PLLP divider 2, output frequency 108,000kHz */ \ |
+ PLLP_POLICY_ENTRY(216000) /* PLLP divider 0, output frequency 216,000kHz */ \ |
+ |
+/** |
+ * Combines EMC 2x frequency and the respective set of EMC timing parameters for |
+ * pre-defined EMC configurations (DDR clock is running at EMC 1x frequency) |
+ */ |
+typedef struct NvRmAp15EmcTimingConfigRec |
+{ |
+ NvRmFreqKHz Emc2xKHz; |
+ NvU32 Timing0Reg; |
+ NvU32 Timing1Reg; |
+ NvU32 Timing2Reg; |
+ NvU32 Timing3Reg; |
+ NvU32 Timing4Reg; |
+ NvU32 Timing5Reg; |
+ NvU32 FbioCfg6Reg; |
+ NvU32 FbioDqsibDly; |
+ NvU32 FbioQuseDly; |
+ NvU32 Emc2xDivisor; |
+ NvRmFreqKHz McKHz; |
+ NvU32 McDivisor; |
+ NvU32 McClockSource; |
+ NvRmFreqKHz CpuLimitKHz; |
+ NvRmMilliVolts CoreVoltageMv; |
+} NvRmAp15EmcTimingConfig; |
+ |
+// Defines number of EMC frequency steps for DFS |
+#define NVRM_AP15_DFS_EMC_FREQ_STEPS (5) |
+ |
+// Dfines CPU and EMC ratio policy as |
+// CpuKHz/CpuMax <= PolicyTabel[PLLM0/(2*EMC2xKHz)] / 256 |
+#define NVRM_AP15_CPU_EMC_RATIO_POLICY \ |
+ 256, 192, 144, 122, 108, 98, 91, 86, 81, 77 |
+ |
+/*****************************************************************************/ |
+ |
+/** |
+ * Enables/disables module clock. |
+ * |
+ * @param hDevice The RM device handle. |
+ * @param ModuleId Combined module ID and instance of the target module. |
+ * @param ClockState Target clock state. |
+ */ |
+void |
+Ap15EnableModuleClock( |
+ NvRmDeviceHandle hDevice, |
+ NvRmModuleID ModuleId, |
+ ModuleClockState ClockState); |
+ |
+// Separate API to control TVDAC clock independently of TVO |
+// (when TVDAC is used for CRT) |
+void |
+Ap15EnableTvDacClock( |
+ NvRmDeviceHandle hDevice, |
+ ModuleClockState ClockState); |
+ |
+/** |
+ * Resets module (assert/delay/deassert reset signal) if the hold paramter is |
+ * NV_FLASE. If the hols paramter is NV_TRUE, just assert the reset and return. |
+ * |
+ * @param hDevice The RM device handle. |
+ * @param Module Combined module ID and instance of the target module. |
+ * @param hold To hold or relese the reset. |
+ */ |
+void AP15ModuleReset(NvRmDeviceHandle hDevice, NvRmModuleID ModuleId, NvBool hold); |
+ |
+/*****************************************************************************/ |
+ |
+/** |
+ * Initializes PLL references table. |
+ * |
+ * @param pPllReferencesTable A pointer to a pointer which this function sets |
+ * to the PLL reference table base. |
+ * @param pPllReferencesTableSize A pointer to a variable which this function |
+ * sets to the PLL reference table size. |
+ */ |
+void |
+NvRmPrivAp15PllReferenceTableInit( |
+ NvRmPllReference** pPllReferencesTable, |
+ NvU32* pPllReferencesTableSize); |
+ |
+/** |
+ * Initializes EMC clocks configuration structures and tables. |
+ * |
+ * @param hRmDevice The RM device handle. |
+ */ |
+void |
+NvRmPrivAp15EmcConfigInit(NvRmDeviceHandle hRmDevice); |
+ |
+/** |
+ * Resets 2D module. |
+ * |
+ * @param hRmDevice The RM device handle. |
+ */ |
+void |
+NvRmPrivAp15Reset2D(NvRmDeviceHandle hRmDevice); |
+ |
+/** |
+ * Initializes clock source table. |
+ * |
+ * @return Pointer to the clock sources descriptor table. |
+ */ |
+NvRmClockSourceInfo* NvRmPrivAp15ClockSourceTableInit(void); |
+ |
+/** |
+ * Sets "as is" specified PLL configuration: switches PLL in bypass mode, |
+ * changes PLL settings, waits for PLL stabilization, and switches to PLL |
+ * output. |
+ * |
+ * @param hRmDevice The RM device handle. |
+ * @param pCinfo Pointer to the PLL description structure. |
+ * @param M PLL input divider setting. |
+ * @param N PLL feedback divider setting. |
+ * @param P PLL output divider setting. |
+ * PLL is left disabled (not bypassed) if either M or N setting is zero: |
+ * M = 0 or N = 0; otherwise, M, N, P validation is caller responsibility. |
+ * @param StableDelayUs PLL stabilization delay in microseconds. If specified |
+ * value is above guaranteed stabilization time, the latter one is used. |
+ * @param cpcon PLL charge pump control setting; ignored if TypicalControls |
+ * is true. |
+ * @param lfcon PLL loop filter control setting; ignored if TypicalControls |
+ * is true. |
+ * @param TypicalControls If true, both charge pump and loop filter parameters |
+ * are ignored and typical controls that corresponds to specified M, N, P |
+ * values will be set. If false, the cpcon and lfcon parameters are set; in |
+ * this case parameter validation is caller responsibility. |
+ * @param flags PLL specific flags. Thse flags are valid only for some PLLs, |
+ * see @NvRmPllConfigFlags. |
+ */ |
+void |
+NvRmPrivAp15PllSet( |
+ NvRmDeviceHandle hRmDevice, |
+ const NvRmPllClockInfo* pCinfo, |
+ NvU32 M, |
+ NvU32 N, |
+ NvU32 P, |
+ NvU32 StableDelayUs, |
+ NvU32 cpcon, |
+ NvU32 lfcon, |
+ NvBool TypicalControls, |
+ NvU32 flags); |
+ |
+/** |
+ * Configures output frequency for specified PLL. |
+ * |
+ * @param hRmDevice The RM device handle. |
+ * @param PllId Targeted PLL ID. |
+ * @param MaxOutKHz Upper limit for PLL output frequency. |
+ * @param pPllOutKHz A pointer to the requested PLL frequency on entry, |
+ * and to the actually configured frequency on exit. |
+ */ |
+void |
+NvRmPrivAp15PllConfigureSimple( |
+ NvRmDeviceHandle hRmDevice, |
+ NvRmClockSource PllId, |
+ NvRmFreqKHz MaxOutKHz, |
+ NvRmFreqKHz* pPllOutKHz); |
+ |
+/** |
+ * Configures specified PLL output to the CM of fixed HDMI frequencies. |
+ * |
+ * @param hRmDevice The RM device handle. |
+ * @param PllId Targeted PLL ID. |
+ * @param pPllOutKHz A pointer to the actually configured frequency on exit. |
+ */ |
+void |
+NvRmPrivAp15PllConfigureHdmi( |
+ NvRmDeviceHandle hRmDevice, |
+ NvRmClockSource PllId, |
+ NvRmFreqKHz* pPllOutKHz); |
+ |
+/** |
+ * Gets PLL output frequency. |
+ * |
+ * @param hRmDevice The RM device handle. |
+ * @param pCinfo Pointer to the PLL description structure. |
+ * |
+ * @return PLL output frequency in kHz (reference frequency if PLL |
+ * is by-passed; zero if PLL is disabled and not by-passed). |
+ */ |
+NvRmFreqKHz |
+NvRmPrivAp15PllFreqGet( |
+ NvRmDeviceHandle hRmDevice, |
+ const NvRmPllClockInfo* pCinfo); |
+ |
+/** |
+ * Gets frequencies of DFS controlled clocks |
+ * |
+ * @param hRmDevice The RM device handle. |
+ * @param pDfsKHz Output storage pointer for DFS clock frequencies structure |
+ * (all frequencies returned in kHz). |
+ */ |
+void |
+NvRmPrivAp15DfsClockFreqGet( |
+ NvRmDeviceHandle hRmDevice, |
+ NvRmDfsFrequencies* pDfsKHz); |
+ |
+/** |
+ * Configures DFS controlled clocks |
+ * |
+ * @param hRmDevice The RM device handle. |
+ * @param pMaxKHz Pointer to the DFS clock frequencies upper limits |
+ * @param pDfsKHz Pointer to the target DFS frequencies structure on entry; |
+ * updated with actual DFS clock frequencies on exit. |
+ * |
+ * @return NV_TRUE if clock configuration is completed; NV_FALSE if this |
+ * function has to be called again to complete configuration. |
+ */ |
+NvBool |
+NvRmPrivAp15DfsClockConfigure( |
+ NvRmDeviceHandle hRmDevice, |
+ const NvRmDfsFrequencies* pMaxKHz, |
+ NvRmDfsFrequencies* pDfsKHz); |
+ |
+/** |
+ * Gets maximum DFS domains frequencies that can be used at specified |
+ * core voltage. |
+ * |
+ * @param hRmDevice The RM device handle. |
+ * @param TargetMv Targeted core voltage in mV. |
+ * @param pDfsKHz Pointer to a structure filled in by this function with |
+ * output clock frequencies. |
+ */ |
+void |
+NvRmPrivAp15DfsVscaleFreqGet( |
+ NvRmDeviceHandle hRmDevice, |
+ NvRmMilliVolts TargetMv, |
+ NvRmDfsFrequencies* pDfsKHz); |
+ |
+/** |
+ * Determines if module clock configuration requires AP15-specific handling, |
+ * and configures the clock if yes. |
+ * |
+ * @param hRmDevice The RM device handle. |
+ * @param pCinfo Pointer to the module clock descriptor. |
+ * @param ClockSourceCount Number of module clock sources. |
+ * @param MinFreq Requested minimum module clock frequency. |
+ * @param MaxFreq Requested maximum module clock frequency. |
+ * @param PrefFreqList Pointer to a list of preferred frequencies sorted |
+ * in the decreasing order of priority. |
+ * @param PrefCount Number of entries in the PrefFreqList array. |
+ * @param pCstate Pointer to module state structure filled in if special |
+ * handling is completed. |
+ * @param flags Module specific flags |
+ * |
+ * @return True indicates that module clock is configured, and regular |
+ * configuration should be aborted; False indicates that regular clock |
+ * configuration should proceed. |
+ */ |
+NvBool |
+NvRmPrivAp15IsModuleClockException( |
+ NvRmDeviceHandle hRmDevice, |
+ NvRmModuleClockInfo *pCinfo, |
+ NvU32 ClockSourceCount, |
+ NvRmFreqKHz MinFreq, |
+ NvRmFreqKHz MaxFreq, |
+ const NvRmFreqKHz* PrefFreqList, |
+ NvU32 PrefCount, |
+ NvRmModuleClockState* pCstate, |
+ NvU32 flags); |
+ |
+/** |
+ * Configures EMC low-latency fifo for CPU clock source switch. |
+ * |
+ * @param hRmDevice The RM device handle. |
+ */ |
+void |
+NvRmPrivAp15SetEmcForCpuSrcSwitch(NvRmDeviceHandle hRmDevice); |
+ |
+/** |
+ * Configures EMC low-latency fifo for CPU clock divider switch. |
+ * |
+ * @param hRmDevice The RM device handle. |
+ * @param CpuFreq Resulting CPU frequency after divider switch |
+ * @param Before Specifies if this function is called before (True) |
+ * or after (False) divider changes. |
+ */ |
+void |
+NvRmPrivAp15SetEmcForCpuDivSwitch( |
+ NvRmDeviceHandle hRmDevice, |
+ NvRmFreqKHz CpuFreq, |
+ NvBool Before); |
+ |
+/** |
+ * Configures maximum core and memory clocks. |
+ * |
+ * @param hRmDevice The RM device handle. |
+ */ |
+void |
+NvRmPrivAp15FastClockConfig(NvRmDeviceHandle hRmDevice); |
+ |
+/** |
+ * Gets module frequency synchronized with EMC speed. |
+ * |
+ * @param hRmDevice The RM device handle. |
+ * @param Module The target module ID. |
+ * |
+ * @return Module frequency in kHz. |
+ */ |
+NvRmFreqKHz NvRmPrivAp15GetEmcSyncFreq( |
+ NvRmDeviceHandle hRmDevice, |
+ NvRmModuleID Module); |
+ |
+/** |
+ * Disables PLLs |
+ * |
+ * @param hRmDevice The RM device handle. |
+ * @param pCinfo Pointer to the last configured module clock descriptor. |
+ * @param pCstate Pointer to the last configured module state structure. |
+ */ |
+void |
+NvRmPrivAp15DisablePLLs( |
+ NvRmDeviceHandle hRmDevice, |
+ const NvRmModuleClockInfo* pCinfo, |
+ const NvRmModuleClockState* pCstate); |
+ |
+/** |
+ * Turns PLLD (MIPI PLL) power On/Off |
+ * |
+ * @param hRmDevice The RM device handle. |
+ * @param ConfigEntry NV_TRUE if this function is called before display |
+ * clock configuration; NV_FALSE otherwise. |
+ * @param Pointer to the current state of MIPI PLL power rail, updated |
+ * by this function. |
+ */ |
+void |
+NvRmPrivAp15PllDPowerControl( |
+ NvRmDeviceHandle hRmDevice, |
+ NvBool ConfigEntry, |
+ NvBool* pMipiPllVddOn); |
+ |
+/** |
+ * Clips EMC frequency high limit to one of the fixed DFS EMC configurations, |
+ * and if necessary adjust CPU high limit respectively. |
+ * |
+ * @param hRmDevice The RM device handle. |
+ * @param pCpuHighKHz A pointer to the variable, which contains CPU frequency |
+ * high limit in KHz (on entry - requested limit, on exit - clipped limit) |
+ * @param pEmcHighKHz A pointer to the variable, which contains EMC frequency |
+ * high limit in KHz (on entry - requested limit, on exit - clipped limit) |
+ */ |
+void |
+NvRmPrivAp15ClipCpuEmcHighLimits( |
+ NvRmDeviceHandle hRmDevice, |
+ NvRmFreqKHz* pCpuHighKHz, |
+ NvRmFreqKHz* pEmcHighKHz); |
+ |
+ |
+/** |
+ * Configures some special bits in the clock source register for given module. |
+ * |
+ * @param hRmDevice The RM device handle. |
+ * @param Module Target module ID. |
+ * @param ClkSourceOffset Clock source register offset. |
+ * @param flags Module specific clock configuration flags. |
+ */ |
+void |
+NvRmPrivAp15ClockConfigEx( |
+ NvRmDeviceHandle hRmDevice, |
+ NvRmModuleID Module, |
+ NvU32 ClkSourceOffset, |
+ NvU32 flags); |
+ |
+/** |
+ * Enables PLL in simulation. |
+ * |
+ * @param hRmDevice The RM device handle. |
+ */ |
+void NvRmPrivAp15SimPllInit(NvRmDeviceHandle hRmDevice); |
+ |
+/** |
+ * Configures oscillator (main) clock doubler. |
+ * |
+ * @param hRmDevice The RM device handle. |
+ * @param OscKHz Oscillator (main) clock frequency in kHz. |
+ * |
+ * @return NvSuccess if the specified oscillator frequency is supported, and |
+ * NvError_NotSupported, otherwise. |
+ */ |
+NvError |
+NvRmPrivAp15OscDoublerConfigure( |
+ NvRmDeviceHandle hRmDevice, |
+ NvRmFreqKHz OscKHz); |
+ |
+#ifdef __cplusplus |
+} |
+#endif /* __cplusplus */ |
+ |
+#endif // INCLUDED_AP15RM_CLOCKS_H |