Index: arch/arm/mach-tegra/nv/nvrm/core/common/nvrm_clocks.h |
diff --git a/arch/arm/mach-tegra/nv/nvrm/core/common/nvrm_clocks.h b/arch/arm/mach-tegra/nv/nvrm/core/common/nvrm_clocks.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..bef73d86bd9d34973ea24aa192cec85d847c9a82 |
--- /dev/null |
+++ b/arch/arm/mach-tegra/nv/nvrm/core/common/nvrm_clocks.h |
@@ -0,0 +1,1387 @@ |
+/* |
+ * 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_NVRM_CLOCKS_H |
+#define INCLUDED_NVRM_CLOCKS_H |
+ |
+#include "nvrm_clocks_limits_private.h" |
+#include "nvrm_module.h" |
+#include "nvrm_diag.h" |
+ |
+#ifdef __cplusplus |
+extern "C" |
+{ |
+#endif /* __cplusplus */ |
+ |
+#define NVRM_RESET_DELAY (10) |
+#define NVRM_CLOCK_CHANGE_DELAY (2) |
+#define NVRM_VARIABLE_DIVIDER ((NvU32)-1) |
+ |
+// Fixed HDMI frequencies |
+#define NVRM_HDMI_480p_FIXED_FREQ_KHZ (27000) |
+#define NVRM_HDMI_720p_FIXED_FREQ_KHZ (74250) |
+#define NVRM_HDMI_1080p_FIXED_FREQ_KHZ (148500) |
+ |
+#define NvRmIsFixedHdmiKHz(KHz) \ |
+ (((KHz) == NVRM_HDMI_480p_FIXED_FREQ_KHZ) || \ |
+ ((KHz) == NVRM_HDMI_720p_FIXED_FREQ_KHZ) || \ |
+ ((KHz) == NVRM_HDMI_1080p_FIXED_FREQ_KHZ)) |
+ |
+// BR-fixed PLLP output frequency in kHz (override disabled) |
+#define NV_BOOT_PLLP_FIXED_FREQ_KHZ (432000) |
+ |
+// RM-fixed PLLP output frequency in kHz (override enabled) |
+#define NVRM_PLLP_FIXED_FREQ_KHZ (216000) |
+ |
+// PLLP1-PLLP4 configurations set by RM during initialization and resume |
+// from LP0 state. PLLP1 and PLLP3 settings are never changed. PLLP2 and |
+// PLLP4 settings are overwritten according to SoC-specific DVFS policy. |
+// PLLPx output frequency = NVRM_PLLP_FIXED_FREQ_KHZ / (1 + setting/2) |
+#define NVRM_FIXED_PLLP1_SETTING (13) |
+#define NVRM_FIXED_PLLP2_SETTING (7) |
+#define NVRM_FIXED_PLLP3_SETTING (4) |
+#define NVRM_FIXED_PLLP4_SETTING (2) |
+ |
+/// Guaranteed MIPI PLL Stabilization Delay |
+#define NVRM_PLL_MIPI_STABLE_DELAY_US (1000) |
+ |
+/** |
+ * MIPI PLL feedback divider N threshold for loop filter control setting: |
+ * LFCON = 1 if N is above threshold, and LFCON = 0, otherwise |
+ */ |
+#define NVRM_PLL_MIPI_LFCON_SELECT_N_DIVIDER (600) |
+ |
+/** |
+ * MIPI PLL feedback divider N thresholds for charge pump control setting |
+ * selection. |
+ */ |
+#define NVRM_PLL_MIPI_CPCON_SELECT_STEPS_N_DIVIDER \ |
+ 0, /* CPCON = 1 if feedback divider N = 0 (invalid setting)*/ \ |
+ 50, /* CPCON = 2 if feedback divider N <= 50 */ \ |
+ 175, /* CPCON = 3 if feedback divider N = ( 50 - 175] */ \ |
+ 300, /* CPCON = 4 if feedback divider N = (175 - 300] */ \ |
+ 375, /* CPCON = 5 if feedback divider N = (300 - 375] */ \ |
+ 450, /* CPCON = 6 if feedback divider N = (375 - 450] */ \ |
+ 525, /* CPCON = 7 if feedback divider N = (450 - 525] */ \ |
+ 600, /* CPCON = 8 if feedback divider N = (525 - 600] */ \ |
+ 700, /* CPCON = 9 if feedback divider N = (600 - 700] */ \ |
+ 800, /* CPCON = 10 if feedback divider N = (700 - 800] */ \ |
+ 900, /* CPCON = 11 if feedback divider N = (800 - 900] */ \ |
+ 1000 /* CPCON = 12 if feedback divider N = (900 - 1000] */ |
+ /* CPCON = 13 if feedback divider N > 1000 (invalid setting) */ |
+ |
+/// Guaranteed Low power PLL Stabilization Delay |
+#define NVRM_PLL_LP_STABLE_DELAY_US (300) |
+ |
+/** |
+ * Low power PLL feedback divider N threshold for charge pump control. For N |
+ * values below threshold charge pump control is always set to 1. For N values |
+ * above threshold charge pump control setting depends on comparison frequency |
+ * as specified in the table below. |
+ */ |
+#define NVRM_PLL_LP_MIN_N_FOR_CPCON_SELECTION (200) |
+ |
+/** |
+ * Low power PLL comparison frequency Fcomp = Din/M thresholds for charge pump |
+ * control setting selection. |
+ */ |
+#define NVRM_PLL_LP_CPCON_SELECT_STEPS_KHZ \ |
+ 6000, /* CPCON = 1 if Fin/M >= 6000 kHz (outside valid range)*/ \ |
+ 4000, /* CPCON = 2 if Fin/M = [4000 - 6000) kHz */ \ |
+ 3000, /* CPCON = 3 if Fin/M = [3000 - 4000) kHz */ \ |
+ 2000, /* CPCON = 4 if Fin/M = [2000 - 3000) kHz */ \ |
+ 1750, /* CPCON = 5 if Fin/M = [1750 - 2000) kHz */ \ |
+ 1500, /* CPCON = 6 if Fin/M = [1500 - 1750) kHz */ \ |
+ 1250, /* CPCON = 7 if Fin/M = [1250 - 1500) kHz */ \ |
+ 1000 /* CPCON = 8 if Fin/M = [1000 - 1250) kHz */ |
+ /* CPCON = 9 if Fin/M < 1000 kHz (outside valid range) */ |
+ |
+/// Combines PLL and PLL output divider settings for fixed pre-defined frequency |
+typedef struct NvRmPllFixedConfigRec |
+{ |
+ // Output pre-defined frequency |
+ NvRmFreqKHz OutputKHz; |
+ |
+ // Interanl PLL dividers settings |
+ NvU32 M; |
+ NvU32 N; |
+ NvU32 P; |
+ |
+ // Exteranl output divider settings |
+ // (ignored if there is no output divider) |
+ NvU32 D; |
+} NvRmPllFixedConfig; |
+ |
+/** |
+ * Defines list of supported PLLA configurations (2 entries for 12.2896 |
+ * frequency that can be either truncated or rounded to KHz). The reference |
+ * frequency for PLLA is fixed at 28.8MHz, therefore there is no dependency on |
+ * oscillator frequency. Output frequency is divided by PLLA_OUT0 fractional |
+ * divider. |
+ */ |
+#define NVRM_PLLA_CONFIGURATIONS \ |
+ { 11289, 25, 49, 0, 8}, \ |
+ { 11290, 25, 49, 0, 8}, \ |
+ { 12000, 24, 50, 0, 8}, \ |
+ { 12288, 25, 64, 0, 10}, \ |
+ { 56448, 25, 49, 0, 0}, \ |
+ { 73728, 25, 64, 0, 0} |
+ |
+// Default audio sync frequency |
+#define NVRM_AUDIO_SYNC_KHZ (11289) |
+ |
+/** |
+ * Defines PLLU configurations for different oscillator frequencies. Output |
+ * frequency is 12MHz for USB with no ULPI support, or 60MHz if null ULPI is |
+ * supported, or 480MHz for HS PLL. PLLU_OUT0 does not have output divider. |
+ * |
+ */ |
+#define NVRM_PLLU_AT_12MHZ { 12000, 12, 384, 5, 0} |
+#define NVRM_PLLU_AT_13MHZ { 12000, 13, 384, 5, 0} |
+#define NVRM_PLLU_AT_19MHZ { 12000, 4, 80, 5, 0} |
+#define NVRM_PLLU_AT_26MHZ { 12000, 26, 384, 5, 0} |
+ |
+#define NVRM_PLLU_ULPI_AT_12MHZ { 60000, 12, 240, 2, 0} |
+#define NVRM_PLLU_ULPI_AT_13MHZ { 60000, 13, 240, 2, 0} |
+#define NVRM_PLLU_ULPI_AT_19MHZ { 60000, 4, 50, 2, 0} |
+#define NVRM_PLLU_ULPI_AT_26MHZ { 60000, 26, 240, 2, 0} |
+ |
+#define NVRM_PLLU_HS_AT_12MHZ { 480000, 12, 960, 1, 0} |
+#define NVRM_PLLU_HS_AT_13MHZ { 480000, 13, 960, 1, 0} |
+#define NVRM_PLLU_HS_AT_19MHZ { 480000, 4, 200, 1, 0} |
+#define NVRM_PLLU_HS_AT_26MHZ { 480000, 26, 960, 1, 0} |
+ |
+/** |
+ * Defines PLLP configurations for different oscillator frequencies. Output |
+ * frequency is always the same. PLLP_OUT0 does not have output divider |
+ * |
+ */ |
+#define NVRM_PLLP_AT_12MHZ { NVRM_PLLP_FIXED_FREQ_KHZ, 12, 432, 1, 0} |
+#define NVRM_PLLP_AT_13MHZ { NVRM_PLLP_FIXED_FREQ_KHZ, 13, 432, 1, 0} |
+#define NVRM_PLLP_AT_19MHZ { NVRM_PLLP_FIXED_FREQ_KHZ, 4, 90, 1, 0} |
+#define NVRM_PLLP_AT_26MHZ { NVRM_PLLP_FIXED_FREQ_KHZ, 26, 432, 1, 0} |
+ |
+/** |
+ * Defines PLLD/PLLC 720p/1080i HDMI configurations for different oscillator |
+ * frequencies. For both PLLC and PLLD output frequency is fixed as 4 * 74250 |
+ * = 594000. However, PLLC_OUT0 will be running at this frequency exactly, while |
+ * PLLD_OUT0 will be runnig at half frequency 297000 (h/w divide by 2 always). |
+ * This difference in source frequency is will be taken care by Display and |
+ * HDMI clock dividers. |
+ */ |
+#define NVRM_PLLHD_AT_12MHZ { 594000, 12, 594, 0, 0} |
+#define NVRM_PLLHD_AT_13MHZ { 594000, 13, 594, 0, 0} |
+#define NVRM_PLLHD_AT_19MHZ { 594000, 16, 495, 0, 0} |
+#define NVRM_PLLHD_AT_26MHZ { 594000, 26, 594, 0, 0} |
+ |
+// Display divider is part of the display module and it is not described |
+// in central module clock information table. Hence, need this define. |
+#define NVRM_DISPLAY_DIVIDER_MAX (128) |
+ |
+/*****************************************************************************/ |
+/*****************************************************************************/ |
+ |
+/* |
+ * Defines module clock state |
+ */ |
+typedef enum |
+{ |
+ // Module clock disable |
+ ModuleClockState_Disable = 0, |
+ |
+ // Module clock enable |
+ ModuleClockState_Enable = 1, |
+ |
+ ModuleClockState_Force32 = 0x7FFFFFFF |
+} ModuleClockState; |
+ |
+ |
+typedef enum |
+{ |
+ NvRmClockSource_Invalid = 0, |
+#define NVRM_CLOCK_SOURCE(A, B, C, D, E, F, G, H, x) NvRmClockSource_##x, |
+#include "nvrm_clockids.h" |
+#undef NVRM_CLOCK_SOURCE |
+ NvRmClockSource_Num, |
+ NvRmClockSource_Force32 = 0x7FFFFFFF |
+} NvRmClockSource; |
+ |
+ |
+typedef enum |
+{ |
+ // Clock source with fixed frequency (e.g., oscillator, not configurable |
+ // PLL, external clock, etc.) |
+ NvRmClockSourceType_Fixed = 1, |
+ |
+ // Clock source from configurable PLL |
+ NvRmClockSourceType_Pll, |
+ |
+ // Secondary clock source derived from oscillator, PLL or other secondary |
+ // source via clock divider |
+ NvRmClockSourceType_Divider, |
+ |
+ // Core clock source derived from several input sources via 2-stage selector |
+ // and rational super-clock divider |
+ NvRmClockSourceType_Core, |
+ |
+ // Selector clock source derived from several input sources via 1-stage selector |
+ // and optional clock frequency doubler |
+ NvRmClockSourceType_Selector, |
+ |
+ NvRmClockSourceType_Num, |
+ NvRmClockSourceType_Force32 = 0x7FFFFFFF |
+} NvRmClockSourceType; |
+ |
+typedef enum |
+{ |
+ // No divider |
+ NvRmClockDivider_None = 1, |
+ |
+ // Integer divider by N |
+ NvRmClockDivider_Integer, |
+ |
+ // Integer divider by (N + 1) |
+ NvRmClockDivider_Integer_1, |
+ |
+ // Fractional divider by (N/2 + 1) |
+ NvRmClockDivider_Fractional_2, |
+ |
+ // Skipping N clocks out of every 16, i.e fout = fin * (16-N)/16 |
+ // (= to Keeper16 with 1-complemented settings N = 15 - M) |
+ NvRmClockDivider_Skipper16, |
+ |
+ // Keep M+1 clocks out of every 16, fout = fin * (M+1)/16 |
+ // (= to Skipper16 with 1-complemented setting M = 15 - N) |
+ NvRmClockDivider_Keeper16, |
+ |
+ // Integer divider by (N + 2) = cascade Fractional : Fixed 1/2 |
+ NvRmClockDivider_Integer_2, |
+ |
+ NvRmClockDivider_Num, |
+ NvRmClockDivider_Force32 = 0x7FFFFFFF |
+} NvRmClockDivider; |
+ |
+typedef enum |
+{ |
+ // AP10 PLLs (PLLC and PLLA) |
+ NvRmPllType_AP10 = 1, |
+ |
+ // MIPI PLLs (PLLD and PLLU on AP15) |
+ NvRmPllType_MIPI, |
+ |
+ // Low Power PLLs (PLLA, PLLC, PLLM, PLLP, PLLX, PLLS) |
+ NvRmPllType_LP, |
+ |
+ // AP20 USB HS PLL (PLLU on AP20) |
+ NvRmPllType_UHS, |
+ |
+ NvRmPllType_Num, |
+ NvRmPllType_Force32 = 0x7FFFFFFF |
+} NvRmPllType; |
+ |
+/** |
+ * Defines PLL configuration flags which are applicable for some PLLs. |
+ * Multiple flags can be OR'ed and passed to the NvRmPrivAp15PllSet() API. |
+ */ |
+typedef enum |
+{ |
+ /// Use Slow Mode output for MIPI PLL |
+ NvRmPllConfigFlags_SlowMode = 0x1, |
+ |
+ /// Use Fast Mode output for MIPI PLL |
+ NvRmPllConfigFlags_FastMode = 0x2, |
+ |
+ /// Enable differential outputs for MIPI PLL |
+ NvRmPllConfigFlags_DiffClkEnable = 0x4, |
+ |
+ /// Disable differential outputs for MIPI PLL |
+ NvRmPllConfigFlags_DiffClkDisable = 0x8, |
+ |
+ /// Override fixed configuration for PLLP |
+ NvRmPllConfigFlags_Override = 0x10, |
+ |
+ /// Enable duty cycle correction for LP PLL |
+ NvRmPllConfigFlags_DccEnable = 0x20, |
+ |
+ /// Disable duty cycle correction for LP PLL |
+ NvRmPllConfigFlags_DccDisable = 0x40, |
+ |
+ NvRmPllConfigFlags_Num, |
+ NvRmPllConfigFlags_Force32 = 0x7FFFFFFF |
+} NvRmPllConfigFlags; |
+ |
+/*****************************************************************************/ |
+ |
+// Holds source selection and divider configuration for module clock as well |
+// as module reset information. |
+typedef struct NvRmModuleClockInfoRec |
+{ |
+ NvRmModuleID Module; |
+ NvU32 Instance; |
+ NvU32 SubClockId; |
+ |
+ NvRmClockSource Sources[NvRmClockSource_Num]; |
+ NvRmClockDivider Divider; |
+ |
+ NvU32 ClkSourceOffset; |
+ |
+ NvU32 SourceFieldMask; |
+ NvU32 SourceFieldShift; |
+ |
+ NvU32 DivisorFieldMask; |
+ NvU32 DivisorFieldShift; |
+ |
+ NvU32 ClkEnableOffset; |
+ NvU32 ClkEnableField; |
+ NvU32 ClkResetOffset; |
+ NvU32 ClkResetField; |
+ |
+ NvRmDiagModuleID DiagModuleID; |
+}NvRmModuleClockInfo; |
+ |
+typedef struct NvRmModuleClockStateRec |
+{ |
+ NvU32 Divider; |
+ NvU32 SourceClock; |
+ NvRmFreqKHz actual_freq; |
+ NvU32 refCount; |
+ NvU32 Vstep; |
+ NvBool Vscale; |
+ NvBool FirstReference; |
+#if NVRM_DIAG_LOCK_SUPPORTED |
+ NvBool DiagLock; // once locked, can not be changed |
+#endif |
+} NvRmModuleClockState; |
+ |
+/*****************************************************************************/ |
+ |
+// Holds configuration information about the fixed clock source that can be |
+// only enabled/disabled (e.g, oscillator, external clock, fixed frequency PLL). |
+typedef struct NvRmFixedClockInfoRec |
+{ |
+ // Source ID |
+ NvRmClockSource SourceId; |
+ |
+ // Fixed source input (must be fixed source as well). For primary sources |
+ // this field is set to NvRmClockSource_Invalid |
+ NvRmClockSource InputId; |
+ |
+ // Enable register offset and field |
+ NvU32 ClkEnableOffset; |
+ NvU32 ClkEnableField; |
+} NvRmFixedClockInfo; |
+ |
+ |
+// Holds configuration information about configurable PLL |
+typedef struct NvRmPllClockInfoRec |
+{ |
+ // PLL output ID |
+ NvRmClockSource SourceId; |
+ |
+ // PLL reference clock ID |
+ NvRmClockSource InputId; |
+ |
+ // PLL type |
+ NvRmPllType PllType; |
+ |
+ // Ofsets of PLL registers |
+ NvU32 PllBaseOffset; |
+ NvU32 PllMiscOffset; |
+ |
+ // PLL VCO range |
+ NvRmFreqKHz PllVcoMin; |
+ NvRmFreqKHz PllVcoMax; |
+} NvRmPllClockInfo; |
+ |
+ |
+// Holds configuration information about secondary clock source derived |
+// from one input source via clock divider |
+typedef struct NvRmDividerClockInfoRec |
+{ |
+ // Divider output clock ID |
+ NvRmClockSource SourceId; |
+ |
+ // Divider input clock ID |
+ NvRmClockSource InputId; |
+ |
+ // Type of the divider |
+ NvRmClockDivider Divider; |
+ |
+ // Divider control register offset |
+ NvU32 ClkControlOffset; |
+ |
+ // Clock rate parameter field; |
+ // ignored for divider with fixed setting |
+ NvU32 ClkRateFieldMask; |
+ NvU32 ClkRateFieldShift; |
+ |
+ // Divider control field |
+ NvU32 ClkControlField; |
+ NvU32 ClkEnableSettings; |
+ NvU32 ClkDisableSettings; |
+ |
+ // Fixed divider rate parameter setting; |
+ // NVRM_VARIABLE_DIVIDER if divider is variable |
+ NvU32 FixedRateSetting; |
+} NvRmDividerClockInfo; |
+ |
+ |
+typedef enum |
+{ |
+ // The enumeartion values must not be changed for Mode(ModeField) formula |
+ // below to work properly |
+ NvRmCoreClockMode_Suspend = 0, |
+ NvRmCoreClockMode_Idle = 1, |
+ NvRmCoreClockMode_Run = 2, |
+ NvRmCoreClockMode_Irq = 3, |
+ NvRmCoreClockMode_Fiq = 4, |
+ |
+ NvRmCoreClockMode_Num, |
+ NvRmCoreClockMode_Force32 = 0x7FFFFFFF |
+} NvRmCoreClockMode; |
+ |
+// Holds configuration information about core clock source derived from several |
+// input sources via 2-stage selector and rational super-clock divider |
+typedef struct NvRmCoreClockInfoRec |
+{ |
+ // Core clock ID |
+ NvRmClockSource SourceId; |
+ |
+ // Super clock input sources, same in each mode |
+ NvRmClockSource Sources[NvRmClockSource_Num]; |
+ |
+ // Offset of the core clock input source selector register |
+ NvU32 SelectorOffset; |
+ |
+ // Clock mode field: |
+ // 0 => NvRmCoreClockMode_Suspend (0) |
+ // 1 => NvRmCoreClockMode_Idle (1) |
+ // 2-3 => NvRmCoreClockMode_Run (2) |
+ // 4-7 => NvRmCoreClockMode_Irq (3) |
+ // 8-15 => NvRmCoreClockMode_Fiq (4) |
+ // Mode = (ModeField == 0) ? NvRmCoreClockMode_Suspend : (1 + LOG2(ModeField)) |
+ NvU32 ModeFieldMask; |
+ NvU32 ModeFieldShift; |
+ |
+ // Sorce selection fileds for each mode |
+ NvU32 SourceFieldMasks[NvRmCoreClockMode_Num]; |
+ NvU32 SourceFieldShifts[NvRmCoreClockMode_Num]; |
+ |
+ // Offset of the divider register |
+ NvU32 DividerOffset; |
+ |
+ // Divider enable field (divider is by-passed if disabled) |
+ // Fout = Fin * (Dividend + 1) / (Divisor + 1) |
+ NvU32 DividerEnableFiledMask; |
+ NvU32 DividerEnableFiledShift; |
+ |
+ // Dividend field |
+ NvU32 DividendFieldMask; |
+ NvU32 DividendFieldShift; |
+ NvU32 DividendFieldSize; |
+ |
+ // Divisor field |
+ NvU32 DivisorFieldMask; |
+ NvU32 DivisorFieldShift; |
+ NvU32 DivisorFieldSize; |
+} NvRmCoreClockInfo; |
+ |
+// Holds configuration information about secondary clock source derived from |
+// several input sources via 1-stage selector and clock frequency doubler |
+typedef struct NvRmSelectorClockInfoRec |
+{ |
+ // Selector output clock ID |
+ NvRmClockSource SourceId; |
+ |
+ // Selector input sources |
+ NvRmClockSource Sources[NvRmClockSource_Num]; |
+ |
+ // Offset of the input source selector register |
+ NvU32 SelectorOffset; |
+ |
+ // Source selection field |
+ NvU32 SourceFieldMask; |
+ NvU32 SourceFieldShift; |
+ |
+ // Doubler control (optional - set field to 0, if no doubler) |
+ NvU32 DoublerEnableOffset; |
+ NvU32 DoublerEnableField; |
+} NvRmSelectorClockInfo; |
+ |
+// Holds information on system bus clock dividers |
+typedef struct NvRmSystemBusComplexInfoRec |
+{ |
+ // Offset of the Bus Rates control register |
+ NvU32 BusRateOffset; |
+ |
+ // Combined bus clocks disable fields (1 = disable) |
+ NvU32 BusClockDisableFields; |
+ |
+ // V-pipe vclk divider field: vclk rate = system core rate * (n+1) /16 |
+ // All fields are 0, if VDE (V-pipe) clock is decoupled from the System bus |
+ NvU32 VclkDividendFieldMask; |
+ NvU32 VclkDividendFieldShift; |
+ NvU32 VclkDividendFieldSize; |
+ |
+ // AHB hclk divider field: hclk rate = system core rate / (n+1) |
+ NvU32 HclkDivisorFieldMask; |
+ NvU32 HclkDivisorFieldShift; |
+ NvU32 HclkDivisorFieldSize; |
+ |
+ // APB pclk divider field: pclk rate = hclk rate / (n+1) |
+ NvU32 PclkDivisorFieldMask; |
+ NvU32 PclkDivisorFieldShift; |
+ NvU32 PclkDivisorFieldSize; |
+} NvRmSystemBusComplexInfo; |
+ |
+/*****************************************************************************/ |
+ |
+typedef union |
+{ |
+ NvRmFixedClockInfo* pFixed; |
+ NvRmPllClockInfo* pPll; |
+ NvRmDividerClockInfo* pDivider; |
+ NvRmCoreClockInfo* pCore; |
+ NvRmSelectorClockInfo* pSelector; |
+} NvRmClockSourceInfoPtr; |
+ |
+// Abstarcts clock source information for different source types. |
+typedef struct NvRmClockSourceInfoRec |
+{ |
+ // Clock source ID |
+ NvRmClockSource SourceId; |
+ |
+ // Clock source type |
+ NvRmClockSourceType SourceType; |
+ |
+ // Pointer to clock source information |
+ NvRmClockSourceInfoPtr pInfo; |
+} NvRmClockSourceInfo; |
+ |
+/*****************************************************************************/ |
+ |
+// Holds PLL references |
+typedef struct NvRmPllReferenceRec |
+{ |
+ // PLL ID |
+ NvRmClockSource SourceId; |
+ |
+ // Stop PLL during low power state flag (reported by DFS to kernel) |
+ NvRmDfsStatusFlags StopFlag; |
+ |
+ // Reference counter |
+ NvU32 ReferenceCnt; |
+ |
+ // Module clocks reference array |
+ NvBool* AttachedModules; |
+ |
+ // External clock attachment reference count (debugging only) |
+ NvU32 ExternalClockRefCnt; |
+} NvRmPllReference; |
+ |
+/** |
+ * Holds DFS clock source configuration record |
+ */ |
+typedef struct NvRmDfsSourceRec |
+{ |
+ // DFS Clock Source Id |
+ NvRmClockSource SourceId; |
+ |
+ // DFS Clock Source frequency |
+ // CPU and System/AVP clock domains: this field holds input frequency |
+ // of core super-divider (from base PLL output or secondary PLL divider) |
+ // V-pipe domain (if it is decoupled from System bus): this field holds |
+ // output frequency of VDE module divider = VDE domain frequency |
+ // EMC domain: this field holds EMC2x frequency specified in selected |
+ // entry in EMC configuration table |
+ NvRmFreqKHz SourceKHz; |
+ |
+ // DFS Clock Source divider setting |
+ // CPU and System/AVP clock domains: this field holds settings for |
+ // secondary PLL divider between base PLL output and super-divider |
+ // V-pipe domain (if it is decoupled from System bus): this field holds |
+ // settings for VDE module clock divider |
+ // EMC domain: this field holds index into EMC configuration table |
+ NvU32 DividerSetting; |
+ |
+ // Minimum Voltage required to run DFS domain from this source |
+ NvRmMilliVolts MinMv; |
+} NvRmDfsSource; |
+ |
+/** |
+ * Combines frequencies for DFS controlled clock domains |
+ */ |
+typedef struct NvRmDfsFrequenciesRec |
+{ |
+ NvRmFreqKHz Domains[NvRmDfsClockId_Num]; |
+} NvRmDfsFrequencies; |
+ |
+/*****************************************************************************/ |
+ |
+/* |
+ * Defines execution platforms |
+ */ |
+typedef enum |
+{ |
+ // SoC Chip |
+ ExecPlatform_Soc = 0x1, |
+ |
+ // FPGA |
+ ExecPlatform_Fpga, |
+ |
+ // QuickTurn |
+ ExecPlatform_Qt, |
+ |
+ // Simulation |
+ ExecPlatform_Sim, |
+ |
+ ExecPlatform_Force32 = 0x7FFFFFFF |
+} ExecPlatform; |
+ |
+/*****************************************************************************/ |
+/*****************************************************************************/ |
+ |
+/** |
+ * Determines execution platform. |
+ * |
+ * @param hRmDeviceHandle The RM device handle. |
+ * |
+ * @return Execution platform ID. |
+ */ |
+ExecPlatform NvRmPrivGetExecPlatform(NvRmDeviceHandle hRmDeviceHandle); |
+ |
+/** |
+ * Initializes clock sources frequencies. |
+ * |
+ * @param hRmDevice The RM device handle. |
+ * @param pClockSourceFreq A pointer to the source frequencies table to be |
+ * filled in by this function. |
+ */ |
+void |
+NvRmPrivClockSourceFreqInit( |
+ NvRmDeviceHandle hRmDevice, |
+ NvU32* pClockSourceFreq); |
+ |
+/** |
+ * Initializes bus clocks. |
+ * |
+ * @param hRmDevice The RM device handle. |
+ * @param SystemFreq The system bus frequency |
+ */ |
+void |
+NvRmPrivBusClockInit(NvRmDeviceHandle hRmDevice, NvRmFreqKHz SystemFreq); |
+ |
+/** |
+ * Initializes PLL power rails and synchronizes PMU ref count |
+ * |
+ * @param hRmDevice The RM device handle. |
+ */ |
+void |
+NvRmPrivPllRailsInit(NvRmDeviceHandle hRmDevice); |
+ |
+/** |
+ * Set nominal core and DDR I/O voltages and boosts core and memory |
+ * clocks to maximum. |
+ * |
+ * @param hRmDevice The RM device handle. |
+ */ |
+void |
+NvRmPrivBoostClocks(NvRmDeviceHandle hRmDevice); |
+ |
+/** |
+ * Enables/disables module clock (private utility directly accessing h/w, |
+ * no ref counting). |
+ * |
+ * @param hDevice The RM device handle. |
+ * @param ModuleId Combined module ID and instance of the target module. |
+ * @param ClockState Target clock state. |
+ */ |
+void |
+NvRmPrivEnableModuleClock( |
+ NvRmDeviceHandle hRmDevice, |
+ NvRmModuleID ModuleId, |
+ ModuleClockState ClockState); |
+ |
+/** |
+ * Gets currently selected clock source for the specified core clock. |
+ * |
+ * @param hRmDevice The RM device handle. |
+ * @param pCinfo Pointer to the core clock description structure. |
+ * |
+ * @return Core clock source ID. |
+ */ |
+NvRmClockSource |
+NvRmPrivCoreClockSourceGet( |
+ NvRmDeviceHandle hRmDevice, |
+ const NvRmCoreClockInfo* pCinfo); |
+ |
+/** |
+ * Gets core clock frequency. |
+ * |
+ * @param hRmDevice The RM device handle. |
+ * @param pCinfo Pointer to the core clock description structure. |
+ * |
+ * @return Core clock frequency in kHz. |
+ */ |
+NvRmFreqKHz |
+NvRmPrivCoreClockFreqGet( |
+ NvRmDeviceHandle hRmDevice, |
+ const NvRmCoreClockInfo* pCinfo); |
+ |
+/** |
+ * Finds the slection index of the specified core clock source. |
+ * |
+ * @param pCinfo Pointer to the core clock description structure. |
+ * @param SourceId Id of the clock source to find index of |
+ * @param pSourceIndex Output storage pointer for the clock source index; |
+ * returns NvRmClockSource_Num if specified source Id can not be found |
+ * in the core clock descriptor. |
+ */ |
+void |
+NvRmPrivCoreClockSourceIndexFind( |
+ const NvRmCoreClockInfo* pCinfo, |
+ NvRmClockSource SourceId, |
+ NvU32* pSourceIndex); |
+ |
+/** |
+ * Finds the best source for the target core clock frequency. |
+ * The best source is a valid source with frequency above and closest |
+ * to the target; if such source does not exist, the best source is a |
+ * valid source below and closest to the target. If no valid source |
+ * exists (i.e., all available find source are above maximum domain |
+ * frequency) |
+ * |
+ * @param pCinfo Pointer to the core clock description structure. |
+ * @param MaxFreq Upper limit for source frequency in kHz |
+ * @param Target frequency in kHz |
+ * @param pSourceFreq Output storage pointer for the best source frequency; |
+ * returns 0 if no valid source below upper limit was found |
+ * @param pSourceIndex Output storage pointer for the best source index in |
+ * core clock descriptor; returns NvRmClockSource_Num if no valid source |
+ * was found |
+ */ |
+void |
+NvRmPrivCoreClockBestSourceFind( |
+ const NvRmCoreClockInfo* pCinfo, |
+ NvRmFreqKHz MaxFreq, |
+ NvRmFreqKHz TargetFreq, |
+ NvRmFreqKHz* pSourceFreq, |
+ NvU32* pSourceIndex); |
+ |
+/** |
+ * Sets "as is" specified core clock configuration. |
+ * |
+ * @param hRmDevice The RM device handle. |
+ * @param pCinfo Pointer to the core clock description structure. |
+ * @param SourceId The ID of the clock source to drive core clock. |
+ * @param m Superdivider dividend value. |
+ * @param n Superdivider divisor value. |
+ * |
+ * There is no error return status for this API call. |
+ * If specified source can not be selected(not present |
+ * in core clock descriptor), asserts are encountered. |
+ */ |
+void |
+NvRmPrivCoreClockSet( |
+ NvRmDeviceHandle hRmDevice, |
+ const NvRmCoreClockInfo* pCinfo, |
+ NvRmClockSource SourceId, |
+ NvU32 m, |
+ NvU32 n); |
+ |
+/** |
+ * Configures core clock frequency. |
+ * |
+ * @param hRmDevice The RM device handle. |
+ * @param pCinfo Pointer to the core clock description structure. |
+ * @param MaxFreq Upper limit for clock source frequency in kHz. |
+ * @param pFreq Pointer to the target frequency in kHz on entry; updated |
+ * with actual clock frequencies on exit. |
+ * @param pSourceId Pointer to the target clock source ID on entry; if set |
+ * to NvRmClockSource_Num, no source target is specified, and the best source |
+ * for the target frequency is selected automatically. On exit, points to the |
+ * actually selected source ID. |
+ * |
+ * @retval NvSuccess if core clock was configured successfully. |
+ * @retval NvError_NotSupported if the specified target source is invalid or |
+ * no target source specified and no valid source was found. |
+ */ |
+NvError |
+NvRmPrivCoreClockConfigure( |
+ NvRmDeviceHandle hRmDevice, |
+ const NvRmCoreClockInfo* pCinfo, |
+ NvRmFreqKHz MaxFreq, |
+ NvRmFreqKHz* pFreq, |
+ NvRmClockSource* pSourceId); |
+ |
+/** |
+ * Gets bus clocks frequencies. |
+ * |
+ * @param hRmDevice The RM device handle. |
+ * @param SystemFreq System core clock frequency in kHz. |
+ * @param pVclkFreq Output storage pointer for V-bus clock frequency in kHz. |
+ * If VDE clock is decoupled from the System bus, 0kHz will be returned. |
+ * @param pHclkFreq Output storage pointer for AHB clock frequency in kHz. |
+ * @param pPclkFreq Output storage pointer for APB clock frequency in kHz. |
+ */ |
+void |
+NvRmPrivBusClockFreqGet( |
+ NvRmDeviceHandle hRmDevice, |
+ NvRmFreqKHz SystemFreq, |
+ NvRmFreqKHz* pVclkFreq, |
+ NvRmFreqKHz* pHclkFreq, |
+ NvRmFreqKHz* pPclkFreq); |
+ |
+/** |
+ * Configures bus clocks frequencies. |
+ * |
+ * @param hRmDevice The RM device handle. |
+ * @param SystemFreq System core clock frequency in kHz. |
+ * @param pVclkFreq Pointer to the target V-bus clock frequency in kHz |
+ * on entry, updated with actually set frequency on exit. If VDE clock |
+ * is decoupled from the System bus, 0kHz will be returned. |
+ * @param pHclkFreq Pointer to the target AHB clock frequency in kHz |
+ * on entry, updated with actually set frequency on exit. |
+ * @param pPclkFreq Pointer to the target APB clock frequency in kHz |
+ * on entry, updated with actually set frequency on exit. |
+ * @param PclkMaxFreq APB clock maximum frequency; APB is the only clock |
+ * in the system complex that may have different (lower) maximum limit. |
+ */ |
+void |
+NvRmPrivBusClockFreqSet( |
+ NvRmDeviceHandle hRmDevice, |
+ NvRmFreqKHz SystemFreq, |
+ NvRmFreqKHz* pVclkFreq, |
+ NvRmFreqKHz* pHclkFreq, |
+ NvRmFreqKHz* pPclkFreq, |
+ NvRmFreqKHz PclkMaxFreq); |
+ |
+/** |
+ * Reconfigures PLLX0 to specified frequency (and switches CPU to back-up |
+ * PLLP0 if PLLX0 is currently used as CPU source). |
+ * |
+ * @param hRmDevice The RM device handle. |
+ * @param TargetFreq New PLLX0 output frequency. |
+ */ |
+void |
+NvRmPrivReConfigurePllX( |
+ NvRmDeviceHandle hRmDevice, |
+ NvRmFreqKHz TargetFreq); |
+ |
+/** |
+ * Reconfigures PLLC0 to specified frequency (switches to PLLP0 all modules |
+ * that use PLLC0 as a source, and then restores source configuration back). |
+ * Should be called only when core voltage is set at nominal. |
+ * |
+ * @param hRmDevice The RM device handle. |
+ * @param TargetFreq New PLLC0 output frequency. |
+ */ |
+void |
+NvRmPrivReConfigurePllC( |
+ NvRmDeviceHandle hRmDevice, |
+ NvRmFreqKHz TargetFreq); |
+ |
+/** |
+ * Gets maximum PLLC0 frequency set as a default target, when there are no |
+ * fixed frequency requirements. |
+ * |
+ * @param hRmDevice The RM device handle. |
+ * |
+ * @return Maximum target for PLLC0 frequency. |
+ */ |
+NvRmFreqKHz NvRmPrivGetMaxFreqPllC(NvRmDeviceHandle hRmDevice); |
+ |
+/** |
+ * Configures PLLC0 at maximum frequency, when there are no fixed frequency |
+ * requirements. Should be called only when core voltage is set at nominal. |
+ * |
+ * @param hRmDevice The RM device handle. |
+ * |
+ * @return Maximum target for PLLC0 frequency. |
+ */ |
+void NvRmPrivBoostPllC(NvRmDeviceHandle hRmDevice); |
+ |
+/** |
+ * Updates PLL frequency entry in the clock source table. |
+ * |
+ * @param hRmDevice The RM device handle. |
+ * @param pCinfo Pointer to the PLL description structure. |
+ */ |
+void |
+NvRmPrivPllFreqUpdate( |
+ NvRmDeviceHandle hRmDevice, |
+ const NvRmPllClockInfo* pCinfo); |
+ |
+/** |
+ * Updates divider frequency entry in the clock source table. |
+ * |
+ * @param hRmDevice The RM device handle. |
+ * @param pCinfo Pointer to the divider clock description structure. |
+ */ |
+void |
+NvRmPrivDividerFreqUpdate( |
+ NvRmDeviceHandle hRmDevice, |
+ const NvRmDividerClockInfo* pCinfo); |
+ |
+/** |
+ * Sets "as is" specified divider parmeter. |
+ * |
+ * @param hRmDevice The RM device handle. |
+ * @param pCinfo Pointer to the divider clock description structure. |
+ * @param setting Divider setting |
+ */ |
+void |
+NvRmPrivDividerSet( |
+ NvRmDeviceHandle hRmDevice, |
+ const NvRmDividerClockInfo* pCinfo, |
+ NvU32 setting); |
+ |
+/** |
+ * Gets divider output frequency. |
+ * |
+ * @param hRmDevice The RM device handle. |
+ * @param pCinfo Pointer to the divider clock description structure. |
+ * |
+ * @return Divider output frequency in kHz; zero if divider itself or |
+ * divider's input clock is disabled. |
+ */ |
+NvRmFreqKHz |
+NvRmPrivDividerFreqGet( |
+ NvRmDeviceHandle hRmDevice, |
+ const NvRmDividerClockInfo* pCinfo); |
+ |
+/** |
+ * Finds minimum divider output frequency, which is above the specified |
+ * target frequency. |
+ * |
+ * @param DividerType Divider type (only fractional dividers for now). |
+ * @param pCinfo SourceKHz Divider source (input) frequency in kHz. |
+ * @param MaxKHz Output divider frequency upper limit. Target frequency must |
+ * be below this limit. If no frequency above the target but within the limit |
+ * can be found, then maximum frequency within the limit is returned. |
+ * @param pTargetKHz A pointer to the divider output frequency. On entry |
+ * specifies target; on exit - found frequency. |
+ * |
+ * @return Divider setting to get found frequency from the given source. |
+ */ |
+NvU32 |
+NvRmPrivFindFreqMinAbove( |
+ NvRmClockDivider DividerType, |
+ NvRmFreqKHz SourceKHz, |
+ NvRmFreqKHz MaxKHz, |
+ NvRmFreqKHz* pTargetKHz); |
+ |
+/** |
+ * Finds maximum divider output frequency, which is below the specified |
+ * target frequency. |
+ * |
+ * @param DividerType Divider type (only fractional dividers for now). |
+ * @param pCinfo SourceKHz Divider source (input) frequency in kHz. |
+ * @param MaxKHz Output divider frequency upper limit. Target frequency must |
+ * be below this limit. |
+ * @param pTargetKHz A pointer to the divider output frequency. On entry |
+ * specifies target; on exit - found frequency. |
+ * |
+ * @return Divider setting to get found frequency from the given source. |
+ */ |
+NvU32 |
+NvRmPrivFindFreqMaxBelow( |
+ NvRmClockDivider DividerType, |
+ NvRmFreqKHz SourceKHz, |
+ NvRmFreqKHz MaxKHz, |
+ NvRmFreqKHz* pTargetKHz); |
+ |
+/** |
+ * Sets "as is" specified slector clock configuration. |
+ * |
+ * @param hRmDevice The RM device handle. |
+ * @param pCinfo Pointer to the selector clock description structure. |
+ * @param SourceId The ID of the input clock source to select. |
+ * @param Double If true, enable output doubler. If false, disable |
+ * output doubler. |
+ * |
+ * There is no error return status for this API call. |
+ * If specified source can not be selected(not present |
+ * in core clock descriptor), asserts are encountered. |
+ */ |
+void |
+NvRmPrivSelectorClockSet( |
+ NvRmDeviceHandle hRmDevice, |
+ const NvRmSelectorClockInfo* pCinfo, |
+ NvRmClockSource SourceId, |
+ NvBool Double); |
+ |
+/** |
+ * Parses clock sources configuration table of the given type. |
+ * |
+ * @param pDst The pointer to the list of the clock source records the results |
+ * of parsing are to be stored in. The records in this list are arranged in |
+ * the order of source IDs. |
+ * @param DestinationTableSize Maximum number of sources that can be recorded. |
+ * @param The clock source configuration table to be parsed. |
+ * @param SourceTableSize Number of records to be parsed. |
+ * @param SourceType The type of source records to be parsed. |
+ */ |
+void |
+NvRmPrivParseClockSources( |
+ NvRmClockSourceInfo* pDst, |
+ NvU32 DestinationTableSize, |
+ NvRmClockSourceInfoPtr Src, |
+ NvU32 SourceTableSize, |
+ NvRmClockSourceType SourceType); |
+ |
+/** |
+ * Gets pointer to the given clock source descriptor. |
+ * |
+ * @param id The targeted clock source ID. |
+ * |
+ * @return A pointer to the specified clock source descriptor. |
+ * NULL is returned, if the target clock source is not valid. |
+ */ |
+NvRmClockSourceInfo* NvRmPrivGetClockSourceHandle(NvRmClockSource id); |
+ |
+/** |
+ * Gets given clock source frequency, |
+ * |
+ * @param id The targeted clock source ID. |
+ * |
+ * @return Clock source frequency in KHz. |
+ */ |
+NvRmFreqKHz NvRmPrivGetClockSourceFreq(NvRmClockSource id); |
+ |
+/** |
+ * Verifies if the specified clock source is currently selected |
+ * by the specified module. |
+ * |
+ * @param hRmDevice The RM device handle. |
+ * @param SourceId The clock source ID to be verified. |
+ * @param ModuleId The combined module id and instance of the module in question. |
+ * |
+ * @return True if specified clock source is selected by the module; |
+ * False returned, otherwise. |
+ */ |
+NvBool |
+NvRmPrivIsSourceSelectedByModule( |
+ NvRmDeviceHandle hRmDevice, |
+ NvRmClockSource SourceId, |
+ NvRmModuleID ModuleId); |
+ |
+/** |
+ * Verifies if specified frequency range is reachable from the given |
+ * clock source. |
+ * |
+ * @param SourceFreq Clock source frequency in KHz. |
+ * @param MinFreq Frequency range low boundary in KHz. |
+ * @param MaxFreq Frequency range high boundary in KHz. |
+ * @param MaxDivisor Maximum possible source clock divisor. |
+ * |
+ * @return True, if whole divisor can be found so that divided source |
+ * frequency is within the range boundaries; False, otherwise. |
+ */ |
+NvBool |
+NvRmIsFreqRangeReachable( |
+ NvRmFreqKHz SourceFreq, |
+ NvRmFreqKHz MinFreq, |
+ NvRmFreqKHz MaxFreq, |
+ NvU32 MaxDivisor); |
+ |
+/** |
+ * Reports if clock/voltage diagnostic is in progress for the specified module. |
+ * |
+ * @param ModuleId The combined module id and instance of the module in question. |
+ * If set to NvRmModuleID_Invalid reports if diagnostic is in progress for any |
+ * module. |
+ * |
+ * @return True, if clock/voltage diagnostic is in progress; False, otherwise. |
+ */ |
+NvBool NvRmPrivIsDiagMode(NvRmModuleID ModuleId); |
+ |
+/** |
+ * Gets clock frequency limits for the specified SoC module. |
+ * |
+ * @param ModuleId The targeted module ID. |
+ * |
+ * @return The pointer to the clock limts structure for the given module ID. |
+ */ |
+const NvRmModuleClockLimits* NvRmPrivGetSocClockLimits(NvRmModuleID Module); |
+ |
+/** |
+ * Locks/Unclocks acces to shared PLL |
+ */ |
+void NvRmPrivLockSharedPll(void); |
+void NvRmPrivUnlockSharedPll(void); |
+ |
+/** |
+ * Locks/Unclocks acces to module clock state |
+ */ |
+void NvRmPrivLockModuleClockState(void); |
+void NvRmPrivUnlockModuleClockState(void); |
+ |
+/** |
+ * Enable/Disable the clock source for the module. |
+ * |
+ * @param hRmDevice The RM device handle. |
+ * @param ModuleId Module ID and instace information. |
+ * @param enbale Should the clock source be enabled or disabled. |
+ */ |
+void |
+NvRmPrivConfigureClockSource( |
+ NvRmDeviceHandle hRmDevice, |
+ NvRmModuleID ModuleId, |
+ NvBool enable); |
+ |
+/** |
+ * Gets pointers to clock descriptor and clock state for the given module. |
+ * |
+ * @param hDevice The RM device handle. |
+ * @param ModuleId Module ID and instance information. |
+ * @param CinfoOut A pointer to a variable that this function sets to the |
+ * clock descriptor pointer. |
+ * @param StateOut A pointer to a variable that this function sets to the |
+ * clock state pointer. |
+ * |
+ * @retval NvSuccess if busy request completed successfully. |
+ * @retval NvError_NotSupported if no clock descriptor for the given module. |
+ * @retval NvError_ModuleNotPresent if the given module is not listed in |
+ * relocation table. |
+ */ |
+NvError |
+NvRmPrivGetClockState( |
+ NvRmDeviceHandle hDevice, |
+ NvRmModuleID ModuleId, |
+ NvRmModuleClockInfo** CinfoOut, |
+ NvRmModuleClockState** StateOut); |
+ |
+/** |
+ * Updates memory controller clock source reference counts. |
+ * |
+ * @param hDevice The RM device handle. |
+ * @param pCinfo Pointer to the memory controller clock descriptor. |
+ * @param pCstate Pointer to the memory controller clock state. |
+ */ |
+void |
+NvRmPrivMemoryClockReAttach( |
+ NvRmDeviceHandle hDevice, |
+ const NvRmModuleClockInfo* pCinfo, |
+ const NvRmModuleClockState* pCstate); |
+ |
+/** |
+ * Updates generic module clock source reference counts. |
+ * |
+ * @param hRmDevice The RM device handle. |
+ * @param pCinfo Pointer to the targeted module clock descriptor. |
+ * @param pCstate Pointer to the targeted module clock state. |
+ */ |
+void |
+NvRmPrivModuleClockReAttach( |
+ NvRmDeviceHandle hRmDevice, |
+ const NvRmModuleClockInfo* cinfo, |
+ const NvRmModuleClockState* state); |
+ |
+/** |
+ * Updates external clock source references. |
+ * |
+ * @param hDevice The RM device handle. |
+ * @param SourceId The external clock source ID. |
+ * @param Enable NV_TRUE if external clock is enabled; |
+ * NV_FALSE if external clock is disabled. |
+ */ |
+void |
+NvRmPrivExternalClockAttach( |
+ NvRmDeviceHandle hDevice, |
+ NvRmClockSource SourceId, |
+ NvBool Enable); |
+ |
+/** |
+ * Updates PLL attachment reference count and PLL stop flag in the storage |
+ * shared by RM and NV boot loader. |
+ * |
+ * @param hRmDeviceHandle The RM device handle. |
+ * @param pPllRef Pointer to the PLL references record. |
+ * @param Increment If NV_TRUE, increment PLL reference count, |
+ * if NV_FALSE, decrement PLL reference count. |
+ */ |
+void |
+NvRmPrivPllRefUpdate( |
+ NvRmDeviceHandle hRmDeviceHandle, |
+ NvRmPllReference* pPllRef, |
+ NvBool Increment); |
+ |
+/** |
+ * Verifies if the targeted module is prohibited to use the specified clock |
+ * source per clock manager policy. |
+ * |
+ * @param hRmDevice The RM device handle. |
+ * @param Module Target module ID. |
+ * @param SourceId Clock source ID. |
+ * |
+ * @return NV_TRUE if the targeted module is prohibited to use the specified |
+ * clock source; NV_FALSE if the targeted module can use the specified clock |
+ * source. |
+ */ |
+NvBool |
+NvRmPrivIsSourceProtected( |
+ NvRmDeviceHandle hRmDevice, |
+ NvRmModuleID Module, |
+ NvRmClockSource SourceId); |
+ |
+/** |
+ * Gets maximum avilable clock source frequency for the specified module |
+ * per clock manager policy. |
+ * |
+ * @param hRmDevice The RM device handle. |
+ * @param pCinfo Pointer to the targeted module clock descriptor. |
+ * |
+ * @return Source frequency in kHz. |
+ */ |
+NvRmFreqKHz |
+NvRmPrivModuleGetMaxSrcKHz( |
+ NvRmDeviceHandle hRmDevice, |
+ const NvRmModuleClockInfo* pCinfo); |
+ |
+/** |
+ * Similar to the Rm pulbic Module reset API, but have the option of either |
+ * pulsing or keeping the reset line active. |
+ * |
+ * @param hold if NV_TRUE keep the asserting the reset. If the value is |
+ * NV_FALSE pulse a reset to the hardware module. |
+ * |
+ */ |
+void |
+NvRmPrivModuleReset(NvRmDeviceHandle hDevice, NvRmModuleID ModuleId, NvBool hold); |
+ |
+/** |
+ * Updates voltage scaling references, when the specified module clock |
+ * is enabled, or disabled. |
+ * |
+ * @param hRmDeviceHandle The RM device handle. |
+ * @param pCinfo Pointer to the targeted module clock descriptor. |
+ * @param pCstate Pointer to the targeted module clock state. |
+ * @param Enable NV_TRUE if module clock is about to be enabled; |
+ * NV_FALSE if module clock has just been disabled. |
+ * @param Preview NV_TRUE if scaling references should be preserved when |
+ * voltage increase is required, NV_FALSE if scaling references should |
+ * be updated in any case. |
+ * |
+ * @return Core voltage level in mV required for the new module configuration. |
+ * NvRmVoltsUnspecified is returned if module clock can be enabled without |
+ * changing voltage requirements. NvRmVoltsOff is returned when module clock |
+ * is disabled. |
+ */ |
+NvRmMilliVolts |
+NvRmPrivModuleVscaleAttach( |
+ NvRmDeviceHandle hRmDevice, |
+ const NvRmModuleClockInfo* pCinfo, |
+ NvRmModuleClockState* pCstate, |
+ NvBool Enable, |
+ NvBool Preview); |
+ |
+/** |
+ * Updates voltage scaling references, when the clock frequency for the |
+ * specified module is re-configured. |
+ * |
+ * @param hRmDeviceHandle The RM device handle. |
+ * @param pCinfo Pointer to the targeted module clock descriptor. |
+ * @param pCstate Pointer to the targeted module clock state. |
+ * @param TargetModuleKHz Traget module frequency in kHz. |
+ * @param TargetSrcKHz Clock source frequency for the traget module in kHz. |
+ * @param Preview NV_TRUE if scaling references should be preserved when |
+ * voltage increase is required, NV_FALSE if scaling references should |
+ * be updated in any case. |
+ * |
+ * @return Core voltage level in mV required for new module configuration. |
+ * NvRmVoltsUnspecified is returned if all specified frequencies can be |
+ * configured without changing voltage requirements. NvRmVoltsOff is returned |
+ * if new configuration may lower voltage requirements. |
+ */ |
+NvRmMilliVolts |
+NvRmPrivModuleVscaleReAttach( |
+ NvRmDeviceHandle hRmDevice, |
+ const NvRmModuleClockInfo* pCinfo, |
+ NvRmModuleClockState* pCstate, |
+ NvRmFreqKHz TargetModuleKHz, |
+ NvRmFreqKHz TargetSrcKHz, |
+ NvBool Preview); |
+ |
+/** |
+ * Updates target level, and reference count for pending voltage scaling |
+ * transactions. |
+ * |
+ * @param hRmDevice The RM device handle. |
+ * @param Set PendingMv pending transaction target; NvRmVoltsOff is used |
+ * to indicate completed transaction. |
+ * |
+ */ |
+void NvRmPrivModuleVscaleSetPending( |
+ NvRmDeviceHandle hRmDevice, |
+ NvRmMilliVolts PendingMv); |
+ |
+/** |
+ * Sets voltage scaling attribute for the specified module clock. |
+ * |
+ * @param hRmDeviceHandle The RM device handle. |
+ * @param pCinfo Pointer to the targeted module clock descriptor. |
+ * @param pCstate Pointer to the targeted module clock state, which is updated |
+ * by this function. |
+ * |
+ * @note The scaling attribute in the clock state structure is set NV_FALSE for |
+ * all core clocks (CPU, AVP, system buses, memory). For modules designated |
+ * clocks it is set NV_FALSE if any frequency within module clock limits can |
+ * be selected at any core voltage level within SoC operational range. |
+ * Otherwise, the attribute is set NV_TRUE. |
+ */ |
+void |
+NvRmPrivModuleSetScalingAttribute( |
+ NvRmDeviceHandle hRmDevice, |
+ const NvRmModuleClockInfo* pCinfo, |
+ NvRmModuleClockState* pCstate); |
+ |
+/** |
+ * Sets "as is" module clock configuration as specified by the given |
+ * clock state structure. |
+ * |
+ * @param hRmDevice The RM device handle. |
+ * @param pCinfo Pointer to the targeted module clock descriptor. |
+ * @param pCstate Pointer to the targeted module clock state to be set |
+ * by this function. |
+ */ |
+void |
+NvRmPrivModuleClockSet( |
+ NvRmDeviceHandle hRmDevice, |
+ const NvRmModuleClockInfo* pCinfo, |
+ const NvRmModuleClockState* pCstate); |
+ |
+#ifdef __cplusplus |
+} |
+#endif /* __cplusplus */ |
+ |
+#endif // INCLUDED_NVRM_CLOCKS_H |