Index: arch/arm/mach-tegra/nv/include/nvrm_power.h |
diff --git a/arch/arm/mach-tegra/nv/include/nvrm_power.h b/arch/arm/mach-tegra/nv/include/nvrm_power.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e8be8c9bf4cf7860e4b1e661a41ebab522bc44fd |
--- /dev/null |
+++ b/arch/arm/mach-tegra/nv/include/nvrm_power.h |
@@ -0,0 +1,1326 @@ |
+/* |
+ * Copyright (c) 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_power_H |
+#define INCLUDED_nvrm_power_H |
+ |
+ |
+#if defined(__cplusplus) |
+extern "C" |
+{ |
+#endif |
+ |
+#include "nvrm_module.h" |
+#include "nvrm_init.h" |
+ |
+#include "nvos.h" |
+ |
+/** |
+ * Frequency data type, expressed in KHz. |
+ */ |
+ |
+typedef NvU32 NvRmFreqKHz; |
+ |
+/** |
+ * Special value for an unspecified or default frequency. |
+ */ |
+static const NvRmFreqKHz NvRmFreqUnspecified = 0xFFFFFFFF; |
+ |
+/** |
+ * Special value for the maximum possible frequency. |
+ */ |
+static const NvRmFreqKHz NvRmFreqMaximum = 0xFFFFFFFD; |
+ |
+/** |
+ * Voltage data type, expressed in millivolts. |
+ */ |
+ |
+typedef NvU32 NvRmMilliVolts; |
+ |
+/** |
+ * Special value for an unspecified or default voltage. |
+ */ |
+static const NvRmMilliVolts NvRmVoltsUnspecified = 0xFFFFFFFF; |
+ |
+/** |
+ * Special value for the maximum possible voltage. |
+ */ |
+static const NvRmMilliVolts NvRmVoltsMaximum = 0xFFFFFFFD; |
+ |
+/** |
+ * Special value for voltage / power disable. |
+ */ |
+static const NvRmMilliVolts NvRmVoltsCycled = 0xFFFFFFFC; |
+ |
+/** |
+ * Special value for voltage / power disable. |
+ */ |
+static const NvRmMilliVolts NvRmVoltsOff = 0; |
+ |
+/** |
+ * Defines possible power management events |
+ */ |
+ |
+typedef enum |
+{ |
+ |
+ /// Specifies no outstanding events |
+ NvRmPowerEvent_NoEvent = 1, |
+ |
+ /// Specifies wake from LP0 |
+ NvRmPowerEvent_WakeLP0, |
+ |
+ /// Specifies wake from LP1 |
+ NvRmPowerEvent_WakeLP1, |
+ NvRmPowerEvent_Num, |
+ NvRmPowerEvent_Force32 = 0x7FFFFFFF |
+} NvRmPowerEvent; |
+ |
+/** |
+ * Defines combined RM clients power state |
+ */ |
+ |
+typedef enum |
+{ |
+ |
+ /// Specifies boot state ("RM is not open, yet") |
+ NvRmPowerState_Boot = 1, |
+ |
+ /// Specifies active state ("not ready-to-suspend") |
+ /// This state is entered if any client enables power to any module, other |
+ /// than NvRmPrivModuleID_System, via NvRmPowerVoltageControl() API |
+ NvRmPowerState_Active, |
+ |
+ /// Specifies h/w autonomous state ("ready-to-core-power-on-suspend") |
+ /// This state is entered if all RM clients enable power only for |
+ /// NvRmPrivModuleID_System, via NvRmPowerVoltageControl() API |
+ NvRmPowerState_AutoHw, |
+ |
+ /// Specifies idle state ("ready-to-core-power-off-suspend") |
+ /// This state is entered if none of the RM clients enables power |
+ /// to any module. |
+ NvRmPowerState_Idle, |
+ |
+ /// Specifies LP0 state ("main power-off suspend") |
+ NvRmPowerState_LP0, |
+ |
+ /// Specifies LP1 state ("main power-on suspend") |
+ NvRmPowerState_LP1, |
+ |
+ /// Specifies Skipped LP0 state (set when LP0 entry error is |
+ /// detected, SoC resumes operations without entering LP0 state) |
+ NvRmPowerState_SkippedLP0, |
+ NvRmPowerState_Num, |
+ NvRmPowerState_Force32 = 0x7FFFFFFF |
+} NvRmPowerState; |
+ |
+/** Defines the clock configuration flags which are applicable for some modules. |
+ * Multiple flags can be OR'ed and passed to the NvRmPowerModuleClockConfig API. |
+*/ |
+ |
+typedef enum |
+{ |
+ |
+ /// Use external clock for the pads of the module. |
+ NvRmClockConfig_ExternalClockForPads = 0x1, |
+ |
+ /// Use internal clock for the pads of the module |
+ NvRmClockConfig_InternalClockForPads = 0x2, |
+ |
+ /// Use external clock for the core of the module, or |
+ /// module is in slave mode |
+ NvRmClockConfig_ExternalClockForCore = 0x4, |
+ |
+ /// Use Internal clock for the core of the module, or |
+ /// module is in master mode. |
+ NvRmClockConfig_InternalClockForCore = 0x8, |
+ |
+ /// Use inverted clock for the module. i.e the polarity of the clock used is |
+ /// inverted with respect to the source clock. |
+ NvRmClockConfig_InvertedClock = 0x10, |
+ |
+ /// Configure target module sub-clock |
+ /// - Target Display: configure Display and TVDAC |
+ /// - Target TVO: configure CVE and TVDAC only |
+ /// - Target VI: configure VI_SENSOR only |
+ /// - Target SPDIF: configure SPDIFIN only |
+ NvRmClockConfig_SubConfig = 0x20, |
+ |
+ /// Use MIPI PLL as Display clock source |
+ NvRmClockConfig_MipiSync = 0x40, |
+ |
+ /// Adjust Audio PLL to match requested I2S or SPDIF frequency |
+ NvRmClockConfig_AudioAdjust = 0x80, |
+ |
+ /// Disable TVDAC along with Display configuration |
+ NvRmClockConfig_DisableTvDAC = 0x100, |
+ |
+ /// Do not fail clock configuration request with specific target frequency |
+ /// above Hw limit - just configure clock at Hw limit. (Note that caller |
+ /// can request NvRmFreqMaximum to configure clock at Hw limit, regardless |
+ /// of this flag presence). |
+ NvRmClockConfig_QuietOverClock = 0x200, |
+ NvRmClockConfigFlags_Num, |
+ NvRmClockConfigFlags_Force32 = 0x7FFFFFFF |
+} NvRmClockConfigFlags; |
+ |
+/** |
+ * Defines SOC-wide clocks controlled by Dynamic Frequency Scaling (DFS) |
+ * that can be targeted by Starvation and Busy hints |
+ */ |
+ |
+typedef enum |
+{ |
+ |
+ /// Specifies CPU clock |
+ NvRmDfsClockId_Cpu = 1, |
+ |
+ /// Specifies AVP clock |
+ NvRmDfsClockId_Avp, |
+ |
+ /// Specifies System bus clock |
+ NvRmDfsClockId_System, |
+ |
+ /// Specifies AHB bus clock |
+ NvRmDfsClockId_Ahb, |
+ |
+ /// Specifies APB bus clock |
+ NvRmDfsClockId_Apb, |
+ |
+ /// Specifies video pipe clock |
+ NvRmDfsClockId_Vpipe, |
+ |
+ /// Specifies external memory controller clock |
+ NvRmDfsClockId_Emc, |
+ NvRmDfsClockId_Num, |
+ NvRmDfsClockId_Force32 = 0x7FFFFFFF |
+} NvRmDfsClockId; |
+ |
+/** |
+ * Defines DFS manager run states |
+ */ |
+ |
+typedef enum |
+{ |
+ |
+ /// DFS is in invalid, not initialized state |
+ NvRmDfsRunState_Invalid = 0, |
+ |
+ /// DFS is disabled / not supported (terminal state) |
+ NvRmDfsRunState_Disabled = 1, |
+ |
+ /// DFS is stopped - no automatic clock control. Starvation and Busy hints |
+ /// are recorded but have no affect. |
+ NvRmDfsRunState_Stopped, |
+ |
+ /// DFS is running in closed loop - full automatic control of SoC-wide |
+ /// clocks based on clock activity measuremnets. Starvation and Busy hints |
+ /// are functional as well. |
+ NvRmDfsRunState_ClosedLoop, |
+ |
+ /// DFS is running in closed loop with profiling (can not be set on non |
+ /// profiling build). |
+ NvRmDfsRunState_ProfiledLoop, |
+ NvRmDfsRunState_Num, |
+ NvRmDfsRunState_Force32 = 0x7FFFFFFF |
+} NvRmDfsRunState; |
+ |
+/** |
+ * Defines DFS profile targets |
+ */ |
+ |
+typedef enum |
+{ |
+ |
+ /// DFS algorithm within ISR |
+ NvRmDfsProfileId_Algorithm = 1, |
+ |
+ /// DFS Interrupt service - includes algorithm plus OS locking and |
+ /// signaling calls; hence, includes blocking time (if any) as well |
+ NvRmDfsProfileId_Isr, |
+ |
+ /// DFS clock control time - includes PLL stabilazation time, OS locking |
+ /// and signalling calls; hence, includes blocking time (if any) as well |
+ NvRmDfsProfileId_Control, |
+ NvRmDfsProfileId_Num, |
+ NvRmDfsProfileId_Force32 = 0x7FFFFFFF |
+} NvRmDfsProfileId; |
+ |
+/** |
+ * Defines voltage rails that are controlled in conjunction with dynamic |
+ * frequency scaling. |
+ */ |
+ |
+typedef enum |
+{ |
+ |
+ /// SoC core rail |
+ NvRmDfsVoltageRailId_Core = 1, |
+ |
+ /// Dedicated CPU rail |
+ NvRmDfsVoltageRailId_Cpu, |
+ NvRmDfsVoltageRailId_Num, |
+ NvRmDfsVoltageRailId_Force32 = 0x7FFFFFFF |
+} NvRmDfsVoltageRailId; |
+ |
+/** |
+ * Defines busy hint API synchronization modes. |
+ */ |
+ |
+typedef enum |
+{ |
+ |
+ /// Asynchronous mode (non-blocking API) |
+ NvRmDfsBusyHintSyncMode_Async = 1, |
+ |
+ /// Synchronous mode (blocking API) |
+ NvRmDfsBusyHintSyncMode_Sync, |
+ NvRmDfsBusyHintSyncMode_Num, |
+ NvRmDfsBusyHintSyncMode_Force32 = 0x7FFFFFFF |
+} NvRmDfsBusyHintSyncMode; |
+ |
+/** |
+ * Holds information on DFS clock domain utilization |
+ */ |
+ |
+typedef struct NvRmDfsClockUsageRec |
+{ |
+ |
+ /// Minimum clock domain frequency |
+ NvRmFreqKHz MinKHz; |
+ |
+ /// Maximum clock domain frequency |
+ NvRmFreqKHz MaxKHz; |
+ |
+ /// Low corner frequency - current low boundary for DFS control algorithm. |
+ /// Can be dynamically adjusted via APIs: NvRmDfsSetLowCorner() for all DFS |
+ /// domains, NvRmDfsSetCpuEnvelope() for CPU, and NvRmDfsSetEmcEnvelope() |
+ /// for EMC. When all DFS domains hit low corner, DFS stops waking up CPU |
+ /// from low power state. |
+ NvRmFreqKHz LowCornerKHz; |
+ |
+ /// High corner frequency - current high boundary for DFS control algorithm. |
+ /// Can be dynamically adjusted via APIs: NvRmDfsSetCpuEnvelope() for Cpu, |
+ /// NvRmDfsSetEmcEnvelope() for Emc, and NvRmDfsSetAvHighCorner() for other |
+ // DFS domains. |
+ NvRmFreqKHz HighCornerKHz; |
+ |
+ /// Current clock domain frequency |
+ NvRmFreqKHz CurrentKHz; |
+ |
+ /// Average frequency of domain *activity* (not average frequency). For |
+ /// domains that do not have activity monitors reported as unspecified. |
+ NvRmFreqKHz AverageKHz; |
+} NvRmDfsClockUsage; |
+ |
+/** |
+ * Holds information on DFS busy hint |
+ */ |
+ |
+typedef struct NvRmDfsBusyHintRec |
+{ |
+ |
+ /// Target clock domain ID |
+ NvRmDfsClockId ClockId; |
+ |
+ /// Requested boost duration in milliseconds |
+ NvU32 BoostDurationMs; |
+ |
+ /// Requested clock frequency level in kHz |
+ NvRmFreqKHz BoostKHz; |
+ |
+ /// Busy pulse mode indicator - if true, busy boost is completely removed |
+ /// after busy time has expired; if false, DFS will gradually lower domain |
+ /// frequency after busy boost. |
+ NvBool BusyAttribute; |
+} NvRmDfsBusyHint; |
+ |
+/** |
+ * Holds information on DFS starvation hint |
+ */ |
+ |
+typedef struct NvRmDfsStarvationHintRec |
+{ |
+ |
+ /// Target clock domain ID |
+ NvRmDfsClockId ClockId; |
+ |
+ /// The starvation indicator for the target domain |
+ NvBool Starving; |
+} NvRmDfsStarvationHint; |
+ |
+/** |
+ * The NVRM_POWER_CLIENT_TAG macro is used to convert ASCII 4-character codes |
+ * into the 32-bit tag that can be used to identify power manager clients for |
+ * logging purposes. |
+ */ |
+#define NVRM_POWER_CLIENT_TAG(a,b,c,d) \ |
+ ((NvU32) ((((a)&0xffUL)<<24UL) | \ |
+ (((b)&0xffUL)<<16UL) | \ |
+ (((c)&0xffUL)<< 8UL) | \ |
+ (((d)&0xffUL)))) |
+ |
+/** |
+ * Registers RM power client. |
+ * |
+ * @param hRmDeviceHandle The RM device handle. |
+ * @param hEventSemaphore The client semaphore for power management event |
+ * signaling. If null, no events will be signaled to the particular client. |
+ * @param pClientId A pointer to the storage that on entry contains client |
+ * tag (optional), and on exit returns client ID, assigned by power manager. |
+ * |
+ * @retval NvSuccess if registration was successful. |
+ * @retval NvError_InsufficientMemory if failed to allocate memory for client |
+ * registration. |
+ */ |
+ |
+ NvError NvRmPowerRegister( |
+ NvRmDeviceHandle hRmDeviceHandle, |
+ NvOsSemaphoreHandle hEventSemaphore, |
+ NvU32 * pClientId ); |
+ |
+/** |
+ * Unregisters RM power client. Power and clock for the modules enabled by this |
+ * client are disabled and any starvation or busy requests are cancelled during |
+ * the unregistration. |
+ * |
+ * @param hRmDeviceHandle The RM device handle. |
+ * @param ClientId The client ID obtained during registration. |
+ */ |
+ |
+ void NvRmPowerUnRegister( |
+ NvRmDeviceHandle hRmDeviceHandle, |
+ NvU32 ClientId ); |
+ |
+/** |
+ * Gets last detected and not yet retrieved power management event. |
+ * Returns no outstanding event if no events has been detected since the |
+ * client registration or the last call to this function. |
+ * |
+ * @param hRmDeviceHandle The RM device handle. |
+ * @param ClientId The client ID obtained during registration. |
+ * @param pEvent Output storage pointer for power event identifier. |
+ * |
+ * @retval NvSuccess if event identifier was retrieved successfully. |
+ * @retval NvError_BadValue if specified client ID is not registered. |
+ */ |
+ |
+ NvError NvRmPowerGetEvent( |
+ NvRmDeviceHandle hRmDeviceHandle, |
+ NvU32 ClientId, |
+ NvRmPowerEvent * pEvent ); |
+ |
+/** |
+ * Notifies RM about power management event. Provides an interface for |
+ * OS power manager to report system power events to RM. |
+ * |
+ * @param hRmDeviceHandle The RM device handle. |
+ * @param Event The event RM power manager is to be aware of. |
+ */ |
+ |
+ void NvRmPowerEventNotify( |
+ NvRmDeviceHandle hRmDeviceHandle, |
+ NvRmPowerEvent Event ); |
+ |
+/** |
+ * Gets combined RM clients power state. |
+ * |
+ * @param hRmDeviceHandle The RM device handle. |
+ * @param pState Output storage pointer for combined RM clients power state. |
+ * |
+ * @retval NvSuccess if power state was retrieved successfully. |
+ */ |
+ |
+ NvError NvRmPowerGetState( |
+ NvRmDeviceHandle hRmDeviceHandle, |
+ NvRmPowerState * pState ); |
+ |
+/** |
+ * Gets SoC primary oscillator/input frequency. |
+ * |
+ * @param hRmDeviceHandle The RM device handle. |
+ * |
+ * @retval Primary frequency in KHz. |
+ */ |
+ |
+ NvRmFreqKHz NvRmPowerGetPrimaryFrequency( |
+ NvRmDeviceHandle hRmDeviceHandle ); |
+ |
+/** |
+ * Gets maximum frequency limit for the module clock. |
+ * |
+ * @param hRmDeviceHandle The RM device handle. |
+ * @param ModuleId The combined module ID and instance of the target module. |
+ * |
+ * @retval Module clock maximum frequency in KHz. |
+ */ |
+ |
+ NvRmFreqKHz NvRmPowerModuleGetMaxFrequency( |
+ NvRmDeviceHandle hRmDeviceHandle, |
+ NvRmModuleID ModuleId ); |
+ |
+/** |
+ * This API is used to set the clock configuration of the module clock. |
+ * This API can also be used to query the existing configuration. |
+ * |
+ * Usage example: |
+ * |
+ * NvError Error; |
+ * NvRmFreqKHz MyFreqKHz = 0; |
+ * ModuleId = NVRM_MODULE_ID(NvRmModuleID_Uart, 0); |
+ * |
+ * // Get current frequency settings |
+ * Error = NvRmPowerModuleClockConfig(RmHandle, ModuleId, ClientId, |
+ * 0, 0, NULL, 0, &MyFreqKHz, 0); |
+ * |
+ * // Set target frequency within HW defined limits |
+ * MyFreqKHz = TARGET_FREQ; |
+ * Error = NvRmPowerModuleClockConfig(RmHandle, ModuleId, ClientId, |
+ * NvRmFreqUnspecified, NvRmFreqUnspecified, |
+ * &MyFreqKHz, 1, &MyFreqKHz); |
+ * |
+ * @param hRmDeviceHandle The RM device handle. |
+ * @param ModuleId The combined module ID and instance of the target module. |
+ * @param ClientId The client ID obtained during registration. |
+ * @param MinFreq Requested minimum frequency for hardware module operation. |
+ * If the value is NvRmFreqUnspecified, RM uses the the min freq that this |
+ * module can operate. |
+ * If the value specified is more than the Hw minimum, passed value is used. |
+ * If the value specified is less than the Hw minimum, it will be clipped to |
+ * the HW minimum value. |
+ * @param MaxFreq Requested maximum frequency for hardware module operation. |
+ * If the value is NvRmFreqUnspecified, RM uses the the max freq that this |
+ * module can run. |
+ * If the value specified is less than the Hw maximum, that value is used. |
+ * If the value specified is more than the Hw limit, it will be clipped to |
+ * the HW maximum. |
+ * @param PrefFreqList Pointer to a list of preferred frequencies, sorted in the |
+ * decresing order of priority. Use NvRmFreqMaximum to request Hw maximum. |
+ * @param PrefFreqListCount Number of entries in the PrefFreqList array. |
+ * @param CurrentFreq Returns the current clock frequency of that module. NULL |
+ * is a valid value for this parameter. |
+ * @param flags Module specific flags. Thse flags are valid only for some |
+ * modules. See @NvRmClockConfigFlags |
+ * |
+ * @retval NvSuccess if clock control request completed successfully. |
+ * @retval NvError_ModuleNotPresent if the module ID or instance is invalid. |
+ * @retval NvError_NotSupported if failed to configure requested frequency (e.g., |
+ * output frequency for possible divider settings is outside specified range). |
+ */ |
+ |
+ NvError NvRmPowerModuleClockConfig( |
+ NvRmDeviceHandle hRmDeviceHandle, |
+ NvRmModuleID ModuleId, |
+ NvU32 ClientId, |
+ NvRmFreqKHz MinFreq, |
+ NvRmFreqKHz MaxFreq, |
+ const NvRmFreqKHz * PrefFreqList, |
+ NvU32 PrefFreqListCount, |
+ NvRmFreqKHz * CurrentFreq, |
+ NvU32 flags ); |
+ |
+/** |
+ * This API is used to enable and disable the module clock. |
+ * |
+ * @param hRmDeviceHandle The RM device handle. |
+ * @param ModuleId The combined module ID and instance of the target module. |
+ * @param ClientId The client ID obtained during registration. |
+ * @param Enable Enables/diables the module clock. |
+ * |
+ * @retval NvSuccess if the module is enabled. |
+ * @retval NvError_ModuleNotPresent if the module ID or instance is invalid. |
+ */ |
+ |
+ NvError NvRmPowerModuleClockControl( |
+ NvRmDeviceHandle hRmDeviceHandle, |
+ NvRmModuleID ModuleId, |
+ NvU32 ClientId, |
+ NvBool Enable ); |
+ |
+/** |
+ * Request the voltage range for a hardware module. As power planes are shared |
+ * between different modules, in the majority of cases the RM will choose the |
+ * appropriate voltage, and module owners only need to enable or disable power |
+ * for a module. Enable request is always completed (i.e., voltage is applied |
+ * to the module) before this function returns. Disable request just means that |
+ * the client is ready for module power down. Actually the power may be removed |
+ * within the call or any time later, depending on other client needs and power |
+ * plane dependencies with other modules. |
+ * |
+ * Assert encountered in debug mode if the module ID or instance is invalid. |
+ * |
+ * Usage example: |
+ * |
+ * NvError Error; |
+ * ModuleId = NVRM_MODULE_ID(NvRmModuleID_Uart, 0); |
+ * |
+ * // Enable module power |
+ * Error = NvRmPowerVoltageControl(RmHandle, ModuleId, ClientId, |
+ * NvRmVoltsUnspecified, NvRmVoltsUnspecified, |
+ * NULL, 0, NULL); |
+ * |
+ * // Disable module power |
+ * Error = NvRmPowerVoltageControl(RmHandle, ModuleId, ClientId, |
+ * NvRmVoltsOff, NvRmVoltsOff, |
+ * NULL, 0, NULL); |
+ * |
+ * @param hRmDeviceHandle The RM device handle |
+ * @param ModuleId The combined module ID and instance of the target module |
+ * @param ClientId The client ID obtained during registration |
+ * @param MinVolts Requested minimum voltage for hardware module operation |
+ * @param MaxVolts Requested maximum voltage for hardware module operation |
+ * Set to NvRmVoltsUnspecified when enabling power for a module, or to |
+ * NvRmVoltsOff when disabling. |
+ * @param PrefVoltageList Pointer to a list of preferred voltages, ordered from |
+ * lowest to highest, and terminated with a voltage of NvRmVoltsUnspecified. |
+ * This parameter is optional - ignored if null. |
+ * @param PrefVoltageListCount Number of entries in the PrefVoltageList array. |
+ * @param CurrentVolts Output storage pointer for resulting module voltage. |
+ * NvRmVoltsUnspecified is returned if module power is On and was not cycled, |
+ * since the last voltage request with the same ClientId and ModuleId; |
+ * NvRmVoltsCycled is returned if module power is On but was powered down, |
+ * since the last voltage request with the same ClientId and ModuleId; |
+ * NvRmVoltsOff is returned if module power is Off. |
+ * This parameter is optional - ignored if null. |
+ * |
+ * @retval NvSuccess if voltage control request completed successfully. |
+ * @retval NvError_BadValue if specified client ID is not registered. |
+ * @retval NvError_InsufficientMemory if failed to allocate memory for |
+ * voltage request. |
+ */ |
+ |
+ NvError NvRmPowerVoltageControl( |
+ NvRmDeviceHandle hRmDeviceHandle, |
+ NvRmModuleID ModuleId, |
+ NvU32 ClientId, |
+ NvRmMilliVolts MinVolts, |
+ NvRmMilliVolts MaxVolts, |
+ const NvRmMilliVolts * PrefVoltageList, |
+ NvU32 PrefVoltageListCount, |
+ NvRmMilliVolts * CurrentVolts ); |
+ |
+/** |
+ * Lists modules registered by power clients for voltage control. |
+ * |
+ * @param pListSize Pointer to the list size. On entry specifies list size |
+ * allocated by the caller, on exit - actual number of Ids returned. If |
+ * entry size is 0, maximum list size is returned. |
+ * @param pIdList Pointer to the list of combined module Id/Instance values |
+ * to be filled in by this function. Ignored if input list size is 0. |
+ * @param pActiveList Pointer to the list of modules Active attributes |
+ * to be filled in by this function. Ignored if input list size is 0. |
+ */ |
+ |
+ void NvRmListPowerAwareModules( |
+ NvRmDeviceHandle hRmDeviceHandle, |
+ NvU32 * pListSize, |
+ NvRmModuleID * pIdList, |
+ NvBool * pActiveList ); |
+ |
+/** |
+ * Requests immediate frequency boost for SOC-wide clocks. In general, the RM |
+ * DFS manages SOC-wide clocks by measuring the average use of clock cycles, |
+ * and adjusting clock rates to minimize wasted clocks. It is preferable and |
+ * expected that modules consume clock cycles at a more-or-less constant rate. |
+ * Under some circumstances this will not be the case. For example, many cycles |
+ * may be consumed to prime a new media processing activity. If power client |
+ * anticipates such circumstances, it may sparingly use this API to alert the RM |
+ * that a temporary spike in clock usage is about to occur. |
+ * |
+ * Usage example: |
+ * |
+ * // Busy hint for CPU clock |
+ * NvError Error; |
+ * Error = NvRmPowerBusyHint(RmHandle, NvRmDfsClockId_Cpu, ClientId, |
+ * BoostDurationMs, BoostFreqKHz); |
+ * |
+ * Clients should not call this API in an attempt to micro-manage a particular |
+ * clock frequency as that is the responsibility of the RM. |
+ * |
+ * @param hRmDeviceHandle The RM device handle. |
+ * @param ClockId The DFS ID of the clock targeted by this hint. |
+ * @param ClientId The client ID obtained during registration. |
+ * @param BoostDurationMs The estimate of the boost duration in milliseconds. |
+ * Use NV_WAIT_INFINITE to specify busy until canceled. Use 0 to request |
+ * instantaneous spike in frequency and let DFS to scale down. |
+ * @param BoostKHz The requirements for the boosted clock frequency in kHz. |
+ * Use NvRmFreqMaximum to request maximum domain frequency. Use 0 to cancel |
+ * all busy hints reported by the specified client for the specified domain. |
+ * |
+ * @retval NvSuccess if busy request completed successfully. |
+ * @retval NvError_BadValue if specified client ID is not registered. |
+ * @retval NvError_InsufficientMemory if failed to allocate memory for |
+ * busy hint. |
+ */ |
+ |
+ NvError NvRmPowerBusyHint( |
+ NvRmDeviceHandle hRmDeviceHandle, |
+ NvRmDfsClockId ClockId, |
+ NvU32 ClientId, |
+ NvU32 BoostDurationMs, |
+ NvRmFreqKHz BoostKHz ); |
+ |
+/** |
+ * Requests immediate frequency boost for multiple SOC-wide clock domains. |
+ * @sa NvRmPowerBusyHint() for detailed explanation of busy hint effects. |
+ * |
+ * @param hRmDeviceHandle The RM device handle. |
+ * @param ClientId The client ID obtained during registration. |
+ * @param pMultiHint Pointer to a list of busy hint records for |
+ * targeted clocks. |
+ * @param NumHints Number of entries in pMultiHint array. |
+ * @param Mode Synchronization mode. In asynchronous mode this API returns to |
+ * the caller after request is signaled to power manager (non-blocking call). |
+ * In synchronous mode the API returns after busy hints are processed by power |
+ * manager (blocking call). |
+ * |
+ * @note It is recommended to use synchronous mode only when low frequency |
+ * may result in functional failure. Otherwise, use asynchronous mode or |
+ * NvRmPowerBusyHint API, which is always executed as non-blocking request. |
+ * Synchronous mode must not be used by PMU transport. |
+ * |
+ * |
+ * @retval NvSuccess if busy hint request completed successfully. |
+ * @retval NvError_BadValue if specified client ID is not registered. |
+ * @retval NvError_InsufficientMemory if failed to allocate memory for |
+ * busy hints. |
+ */ |
+ |
+ NvError NvRmPowerBusyHintMulti( |
+ NvRmDeviceHandle hRmDeviceHandle, |
+ NvU32 ClientId, |
+ const NvRmDfsBusyHint * pMultiHint, |
+ NvU32 NumHints, |
+ NvRmDfsBusyHintSyncMode Mode ); |
+ |
+/** |
+ * Request frequency increase for SOC-wide clock to avoid real-time starvation |
+ * conditions. Allows modules to contribute to the detection and avoidance of |
+ * clock starvation for DFS controlled clocks. |
+ * |
+ * This API should be called to indicate starvation threat and also to cancel |
+ * request when a starvation condition has eased. |
+ * |
+ * @note Although the RM DFS does its best to manage clocks without starving |
+ * the system for clock cycles, bursty clock usage can occasionally cause |
+ * short-term clock starvation. One solution is to leave a large enough clock |
+ * rate guard band such that any possible burst in clock usage will be absorbed. |
+ * This approach tends to waste clock cycles, and worsen power management. |
+ * |
+ * By allowing power clients to participate in the avoidance of system clock |
+ * starvation situations, detection responsibility can be moved closer to the |
+ * hardware buffers and processors where starvation occurs, while leaving the |
+ * overall dynamic clocking policy to the RM. A typical client would be a module |
+ * that manages media processing and is able to determine when it is falling |
+ * behind by watching buffer levels or some other module-specific indicator. In |
+ * response to the starvation request the RM increases gradually the respective |
+ * clock frequency until the request vis cancelled by the client. |
+ * |
+ * Usage example: |
+ * |
+ * NvError Error; |
+ * |
+ * // Request CPU clock frequency increase to avoid starvation |
+ * Error = NvRmPowerStarvationHint( |
+ * RmHandle, NvRmDfsClockId_Cpu, ClientId, NV_TRUE); |
+ * |
+ * // Cancel starvation request for CPU clock frequency |
+ * Error = NvRmPowerStarvationHint( |
+ * RmHandle, NvRmDfsClockId_Cpu, ClientId, NV_FALSE); |
+ * |
+ * @param hRmDeviceHandle The RM device handle. |
+ * @param ClockId The DFS ID of the clock targeted by this hint. |
+ * @param ClientId The client ID obtained during registration. |
+ * @param Starving The starvation indicator for the target module. If true, |
+ * the client is requesting target frequency increase to avoid starvation |
+ * If false, the indication is that the imminent starvation is no longer a |
+ * concern for this particular client. |
+ * |
+ * @retval NvSuccess if starvation request completed successfully. |
+ * @retval NvError_BadValue if specified client ID is not registered. |
+ * @retval NvError_InsufficientMemory if failed to allocate memory for |
+ * starvation hint. |
+ */ |
+ |
+ NvError NvRmPowerStarvationHint( |
+ NvRmDeviceHandle hRmDeviceHandle, |
+ NvRmDfsClockId ClockId, |
+ NvU32 ClientId, |
+ NvBool Starving ); |
+ |
+/** |
+ * Request frequency increase for multiple SOC-wide clock domains to avoid |
+ * real-time starvation conditions. |
+ * @sa NvRmPowerStarvationHint() for detailed explanation of starvation hint |
+ * effects. |
+ * |
+ * @param hRmDeviceHandle The RM device handle. |
+ * @param ClientId The client ID obtained during registration. |
+ * @param pMultiHint Pointer to a list of starvation hint records for |
+ * targeted clocks. |
+ * @param NumHints Number of entries in pMultiHint array. |
+ * |
+ * @retval NvSuccess if starvation hint request completed successfully. |
+ * @retval NvError_BadValue if specified client ID is not registered. |
+ * @retval NvError_InsufficientMemory if failed to allocate memory for |
+ * starvation hints. |
+ */ |
+ |
+ NvError NvRmPowerStarvationHintMulti( |
+ NvRmDeviceHandle hRmDeviceHandle, |
+ NvU32 ClientId, |
+ const NvRmDfsStarvationHint * pMultiHint, |
+ NvU32 NumHints ); |
+ |
+/** |
+ * Notifies the RM about DDK module activity. |
+ * |
+ * @note This function lets DDK modules notify the RM about interesting system |
+ * activities. Not all modules will need to make this indication, typically only |
+ * modules involved in user input or output activities. However, with current |
+ * SOC power management architecture such activities will be detected by the OS |
+ * adaptation layer, not RM. This API is not removed, just in case, we will find |
+ * out that RM still need to participate in user activity detection. In general, |
+ * modules should call this interface sparingly, no more than once every few |
+ * seconds. |
+ * |
+ * In current power management architecture user activity is handled by OS |
+ * (nor RM) power manager, and activity API is not used at all. |
+ * |
+ * Assert encountered in debug mode if the module ID or instance is invalid. |
+ * |
+ * TODO: Remove this API? |
+ * |
+ * @param hRmDeviceHandle The RM device handle. |
+ * @param ModuleId The combined module ID and instance of the target module. |
+ * @param ClientId The client ID obtained during registration. |
+ * @param ActivityDurationMs The duration of the module activity. |
+ * |
+ * For cases when activity is a series of discontinuous events (keypresses, for |
+ * example), this parameter should simply be set to 1. |
+ * |
+ * For lengthy, continuous activities, this parameter is set to the estimated |
+ * length of the activity in milliseconds. This can reduce the number of calls |
+ * made to this API. |
+ * |
+ * A value of 0 in this parameter indicates that the module is not active and |
+ * can be used to signal the end of a previously estimated continuous activity. |
+ * |
+ * @retval NvSuccess if clock control request completed successfully. |
+ */ |
+ |
+ NvError NvRmPowerActivityHint( |
+ NvRmDeviceHandle hRmDeviceHandle, |
+ NvRmModuleID ModuleId, |
+ NvU32 ClientId, |
+ NvU32 ActivityDurationMs ); |
+ |
+/** |
+ * Gets DFS run sate. |
+ * |
+ * @param hRmDeviceHandle The RM device handle. |
+ * |
+ * @return Current DFS run state. |
+ */ |
+ |
+ NvRmDfsRunState NvRmDfsGetState( |
+ NvRmDeviceHandle hRmDeviceHandle ); |
+ |
+/** |
+ * Gets information on DFS controlled clock utilization. If DFS is stopped |
+ * or disabled the average frequency is always equal to current frequency. |
+ * |
+ * @param hRmDeviceHandle The RM device handle. |
+ * @param ClockId The DFS ID of the clock targeted by this request. |
+ * @param pClockInfo Output storage pointer for clock utilization information. |
+ * |
+ * @return NvSuccess if clock usage information is returned successfully. |
+ */ |
+ |
+ NvError NvRmDfsGetClockUtilization( |
+ NvRmDeviceHandle hRmDeviceHandle, |
+ NvRmDfsClockId ClockId, |
+ NvRmDfsClockUsage * pClockUsage ); |
+ |
+/** |
+ * Sets DFS run state. Allows to stop or re-start DFS as well as switch |
+ * between open and closed loop operations. |
+ * |
+ * On transition to the DFS stopped state, the DFS clocks are just kept at |
+ * current frequencies. On transition to DFS run states, DFS sampling data |
+ * is re-initialized only if originally DFS was stopped. Transition between |
+ * running states has no additional effects, besides operation mode changes. |
+ * |
+ * @param hRmDeviceHandle The RM device handle. |
+ * @param NewDfsRunState The DFS run state to be set. |
+ * |
+ * @retval NvSuccess if DFS state was set successfully. |
+ * @retval NvError_NotSupported if DFS was disabled initially, in attempt |
+ * to disable initially enabled DFS, or in attempt to run profiled loop |
+ * on non profiling build. |
+ */ |
+ |
+ NvError NvRmDfsSetState( |
+ NvRmDeviceHandle hRmDeviceHandle, |
+ NvRmDfsRunState NewDfsRunState ); |
+ |
+/** |
+ * Sets DFS low corner frequencies - low boundaries for DFS clocks when DFS. |
+ * is running. If all DFS domains hit low corner, DFS will no longer wake |
+ * CPU from low power state. |
+ * |
+ * @note When CPU envelope is set via NvRmDfsSetCpuEnvelope() API the CPU |
+ * low corner boundary can not be changed by this function. |
+ * @note When EMC envelope is set via NvRmDfsSetEmcEnvelope() API the EMC |
+ * low corner boundary can not be changed by this function. |
+ * |
+ * Usage example: |
+ * |
+ * NvError Error; |
+ * NvRmFreqKHz LowCorner[NvRmDfsClockId_Num]; |
+ * |
+ * // Fill in low corner array |
+ * LowCorner[NvRmDfsClockId_Cpu] = NvRmFreqUnspecified; |
+ * LowCorner[NvRmDfsClockId_Avp] = ... ; |
+ * LowCorner[NvRmDfsClockId_System] = ...; |
+ * LowCorner[NvRmDfsClockId_Ahb] = ...; |
+ * LowCorner[NvRmDfsClockId_Apb] = ...; |
+ * LowCorner[NvRmDfsClockId_Vpipe] = ...; |
+ * LowCorner[NvRmDfsClockId_Emc] = ...; |
+ * |
+ * // Set new low corner for domains other than CPU, and preserve CPU boundary |
+ * Error = NvRmDfsSetLowCorner(RmHandle, NvRmDfsClockId_Num, LowCorner); |
+ * |
+ * @param hRmDeviceHandle The RM device handle. |
+ * @param DfsFreqListCount Number of entries in the pDfsLowFreqList array. |
+ * Must be always equal to NvRmDfsClockId_Num. |
+ * @param pDfsLowFreqList Pointer to a list of low corner frequencies, ordered |
+ * according to NvRmDfsClockId enumeration. If the list entry is set to |
+ * NvRmFreqUnspecified, the respective low corner boundary is not modified. |
+ * |
+ * @retval NvSuccess if low corner frequencies were updated successfully. |
+ * @retval NvError_NotSupported if DFS is disabled. |
+ */ |
+ |
+ NvError NvRmDfsSetLowCorner( |
+ NvRmDeviceHandle hRmDeviceHandle, |
+ NvU32 DfsFreqListCount, |
+ const NvRmFreqKHz * pDfsLowFreqList ); |
+ |
+/** |
+ * Sets DFS target frequencies. If DFS is stopped clocks for the DFS domains |
+ * will be targeted with the specified frequencies. In any other DFS state |
+ * this function has no effect. |
+ * |
+ * Usage example: |
+ * |
+ * NvError Error; |
+ * NvRmFreqKHz Target[NvRmDfsClockId_Num]; |
+ * |
+ * // Fill in target frequencies array |
+ * Target[NvRmDfsClockId_Cpu] = ... ; |
+ * Target[NvRmDfsClockId_Avp] = ... ; |
+ * Target[NvRmDfsClockId_System] = ...; |
+ * Target[NvRmDfsClockId_Ahb] = ...; |
+ * Target[NvRmDfsClockId_Apb] = ...; |
+ * Target[NvRmDfsClockId_Vpipe] = ...; |
+ * Target[NvRmDfsClockId_Emc] = ...; |
+ * |
+ * // Set new target |
+ * Error = NvRmDfsSetTarget(RmHandle, NvRmDfsClockId_Num, Target); |
+ * |
+ * @param hRmDeviceHandle The RM device handle. |
+ * @param DfsFreqListCount Number of entries in the pDfsTargetFreqList array. |
+ * Must be always equal to NvRmDfsClockId_Num. |
+ * @param pDfsTargetFreqList Pointer to a list of target frequencies, ordered |
+ * according to NvRmDfsClockId enumeration. If the list entry is set to |
+ * NvRmFreqUnspecified, the current domain frequency is used as a target. |
+ * |
+ * @retval NvSuccess if target frequencies were updated successfully. |
+ * @retval NvError_NotSupported if DFS is not stopped (disabled, or running). |
+ */ |
+ |
+ NvError NvRmDfsSetTarget( |
+ NvRmDeviceHandle hRmDeviceHandle, |
+ NvU32 DfsFreqListCount, |
+ const NvRmFreqKHz * pDfsTargetFreqList ); |
+ |
+/** |
+ * Sets DFS high and low boundaries for CPU domain clock frequency. |
+ * |
+ * Usage example: |
+ * |
+ * NvError Error; |
+ * |
+ * // Set CPU envelope boundaries to LowKHz : HighKHz |
+ * Error = NvRmDfsSetCpuEnvelope(RmHandle, LowKHz, HighKHz); |
+ * |
+ * // Change CPU envelope high boundary to HighKHz |
+ * Error = NvRmDfsSetCpuEnvelope(RmHandle, NvRmFreqUnspecified, HighKHz); |
+ * |
+ * // Release CPU envelope back to HW limits |
+ * Error = NvRmDfsSetCpuEnvelope(RmHandle, 0, NvRmFreqMaximum); |
+ * |
+ * @param hRmDeviceHandle The RM device handle. |
+ * @param DfsCpuEnvelopeLowKHz Requested low boundary in kHz. |
+ * @param DfsCpuEnvelopeHighKHz Requested high limit in kHz. |
+ * |
+ * Envelope parameters are clipped to the HW defined CPU domain range. |
+ * If envelope parameter is set to NvRmFreqUnspecified, the respective |
+ * CPU boundary is not modified, unless it violates the new setting for |
+ * the other boundary; in the latter case both boundaries are set to the |
+ * new specified value. |
+ * |
+ * @retval NvSuccess if DFS envelope for for CPU domain was updated |
+ * successfully. |
+ * @retval NvError_BadValue if reversed boundaries are specified. |
+ * @retval NvError_NotSupported if DFS is disabled. |
+ */ |
+ |
+ NvError NvRmDfsSetCpuEnvelope( |
+ NvRmDeviceHandle hRmDeviceHandle, |
+ NvRmFreqKHz DfsCpuLowCornerKHz, |
+ NvRmFreqKHz DfsCpuHighCornerKHz ); |
+ |
+/** |
+ * Sets DFS high and low boundaries for EMC domain clock frequency. |
+ * |
+ * Usage example: |
+ * |
+ * NvError Error; |
+ * |
+ * // Set EMC envelope boundaries to LowKHz : HighKHz |
+ * Error = NvRmDfsSetEmcEnvelope(RmHandle, LowKHz, HighKHz); |
+ * |
+ * // Change EMC envelope high boundary to HighKHz |
+ * Error = NvRmDfsSetEmcEnvelope(RmHandle, NvRmFreqUnspecified, HighKHz); |
+ * |
+ * // Release EMC envelope back to HW limits |
+ * Error = NvRmDfsSetEmcEnvelope(RmHandle, 0, NvRmFreqMaximum); |
+ * |
+ * @param hRmDeviceHandle The RM device handle. |
+ * @param DfsEmcEnvelopeLowKHz Requested low boundary in kHz. |
+ * @param DfsEmcEnvelopeHighKHz Requested high limit in kHz. |
+ * |
+ * Envelope parameters are clipped to the ODM defined EMC configurations |
+ * within HW defined EMC domain range. If envelope parameter is set to |
+ * NvRmFreqUnspecified, the respective EMC boundary is not modified, unless |
+ * it violates the new setting for the other boundary; in the latter case |
+ * both boundaries are set to the new specified value. |
+ * |
+ * @retval NvSuccess if DFS envelope for for EMC domain was updated |
+ * successfully. |
+ * @retval NvError_BadValue if reversed boundaries are specified. |
+ * @retval NvError_NotSupported if DFS is disabled. |
+ */ |
+ |
+ NvError NvRmDfsSetEmcEnvelope( |
+ NvRmDeviceHandle hRmDeviceHandle, |
+ NvRmFreqKHz DfsEmcLowCornerKHz, |
+ NvRmFreqKHz DfsEmcHighCornerKHz ); |
+ |
+/** |
+ * Sets DFS high boundaries for CPU and EMC. |
+ * |
+ * @note When either CPU or EMC envelope is set via NvRmDfsSetXxxEnvelope() |
+ * API, neither CPU nor EMC boundary is changed by this function. |
+ * |
+ * Usage example: |
+ * |
+ * NvError Error; |
+ * |
+ * // Set CPU subsystem clock limit to CpuHighKHz and Emc clock limit |
+ * // to EmcHighKHz |
+ * Error = NvRmDfsSetCpuEmcHighCorner(RmHandle, CpuHighKHz, EmcHighKHz); |
+ * |
+ * @param hRmDeviceHandle The RM device handle. |
+ * @param DfsCpuHighKHz Requested high boundary in kHz for CPU. |
+ * @param DfsEmcHighKHz Requested high limit in kHz for EMC. |
+ * |
+ * Requested parameters are clipped to the respective HW defined domain |
+ * ranges, as well as to ODM defined EMC configurations. If any parameter |
+ * is set to NvRmFreqUnspecified, the respective boundary is not modified. |
+ * |
+ * @retval NvSuccess if high corner for AV subsystem was updated successfully. |
+ * @retval NvError_NotSupported if DFS is disabled. |
+ */ |
+ |
+ NvError NvRmDfsSetCpuEmcHighCorner( |
+ NvRmDeviceHandle hRmDeviceHandle, |
+ NvRmFreqKHz DfsCpuHighKHz, |
+ NvRmFreqKHz DfsEmcHighKHz ); |
+ |
+/** |
+ * Sets DFS high boundaries for AV subsystem clocks. |
+ * |
+ * Usage example: |
+ * |
+ * NvError Error; |
+ * |
+ * // Set AVP clock limit to AvpHighKHz, Vde clock limit to VpipeHighKHz, |
+ * // and preserve System bus clock limit provided it is above requested |
+ * // AVP and Vpipe levels. |
+ * Error = NvRmDfsSetAvHighCorner( |
+ * RmHandle, NvRmFreqUnspecified, AvpHighKHz, VpipeHighKHz); |
+ * |
+ *@note System bus clock limit must be always above AvpHighKHz, and above |
+ * VpipeHighKHz. Therefore it may be adjusted up, as a result of this call, |
+ * even though, it is marked unspecified. |
+ * |
+ * @param hRmDeviceHandle The RM device handle. |
+ * @param DfsSysHighKHz Requested high boundary in kHz for System bus. |
+ * @param DfsAvpHighKHz Requested high boundary in kHz for AVP. |
+ * @param DfsVdeHighCornerKHz Requested high limit in kHz for Vde pipe. |
+ * |
+ * Requested parameter is clipped to the respective HW defined domain |
+ * range. If parameter is set to NvRmFreqUnspecified, the respective |
+ * boundary is not modified. |
+ * |
+ * @retval NvSuccess if high corner for AV subsystem was updated successfully. |
+ * @retval NvError_NotSupported if DFS is disabled. |
+ */ |
+ |
+ NvError NvRmDfsSetAvHighCorner( |
+ NvRmDeviceHandle hRmDeviceHandle, |
+ NvRmFreqKHz DfsSystemHighKHz, |
+ NvRmFreqKHz DfsAvpHighKHz, |
+ NvRmFreqKHz DfsVpipeHighKHz ); |
+ |
+/** |
+ * Gets DFS profiling information. |
+ * |
+ * DFS profiling starts/re-starts every time NvRmDfsRunState_ProfiledLoop |
+ * state is set via NvRmDfsSetState(). DFS profiling stops when any other |
+ * sate is set. |
+ * |
+ * @param hRmDeviceHandle The RM device handle. |
+ * @param DfsProfileCount Number of DFS profiles. Must be always equal to |
+ * NvRmDfsProfileId_Num. |
+ * @param pSamplesNoList Output storage pointer to an array of sample counts |
+ * for each profile target ordered according to NvRmDfsProfileId enumeration. |
+ * @param pProfileTimeUsList Output storage pointer to an array of cummulative |
+ * execution time in microseconds for each profile target ordered according |
+ * to NvRmDfsProfileId enumeration. |
+ * @param pDfsPeriodUs Output storage pointer for average DFS sample |
+ * period in microseconds. |
+ * |
+ * @retval NvSuccess if profile information is returned successfully. |
+ * @retval NvError_NotSupported if DFS is not ruuning in profiled loop. |
+ */ |
+ |
+ NvError NvRmDfsGetProfileData( |
+ NvRmDeviceHandle hRmDeviceHandle, |
+ NvU32 DfsProfileCount, |
+ NvU32 * pSamplesNoList, |
+ NvU32 * pProfileTimeUsList, |
+ NvU32 * pDfsPeriodUs ); |
+ |
+/** |
+ * Starts/Re-starts NV DFS logging. |
+ * |
+ * @param hRmDeviceHandle The RM device handle. |
+ */ |
+ |
+ void NvRmDfsLogStart( |
+ NvRmDeviceHandle hRmDeviceHandle ); |
+ |
+/** |
+ * Stops DFS logging and gets cumulative mean values of DFS domains frequencies |
+ * over logging time. |
+ * |
+ * @param hRmDeviceHandle The RM device handle. |
+ * @param LogMeanFreqListCount Number of entries in the pLogMeanFreqList array. |
+ * Must be always equal to NvRmDfsClockId_Num. |
+ * @param pLogMeanFreqList Pointer to a list filled with mean values of DFS |
+ * frequencies, ordered according to NvRmDfsClockId enumeration. |
+ * @param pLogLp2TimeMs Pointer to a variable filled with cumulative time spent |
+ * in LP2 in milliseconds. |
+ * @param pLogLp2Entries Pointer to a variable filled with cumulative number of |
+ * LP2 mode entries. |
+ * |
+ * @retval NvSuccess if mean values are returned successfully. |
+ * @retval NvError_NotSupported if DFS is disabled. |
+ */ |
+ |
+ NvError NvRmDfsLogGetMeanFrequencies( |
+ NvRmDeviceHandle hRmDeviceHandle, |
+ NvU32 LogMeanFreqListCount, |
+ NvRmFreqKHz * pLogMeanFreqList, |
+ NvU32 * pLogLp2TimeMs, |
+ NvU32 * pLogLp2Entries ); |
+ |
+/** |
+ * Gets specified entry of the detailed DFS activity log. |
+ * |
+ * @param hRmDeviceHandle The RM device handle. |
+ * @param EntryIndex Log entrty index. |
+ * @param LogDomainsCount The size of activity arrays. |
+ * Must be always equal to NvRmDfsClockId_Num. |
+ * @param pIntervalMs Pointer to a variable filled with sample interval time |
+ * in milliseconds. |
+ * @param pLp2TimeMs Pointer to a variable filled with time spent in LP2 |
+ * in milliseconds. |
+ * @param pActiveCyclesList Pointer to a list filled with domain active cycles |
+ * within sample interval. |
+ * @param pAveragesList Pointer to a list filled with average domain activity |
+ * over DFS moving window. |
+ * @param pFrequenciesList Pointer to a list filled with instantaneous domains |
+ * frequencies. |
+ * All lists are ordered according to NvRmDfsClockId enumeration. |
+ * |
+ * @retval NvSuccess if log entry is retrieved successfully. |
+ * @retval NvError_InvalidAddress if requetsed entry is empty. |
+ * @retval NvError_NotSupported if DFS is disabled, or detailed logging |
+ * is not supported. |
+ */ |
+ |
+ NvError NvRmDfsLogActivityGetEntry( |
+ NvRmDeviceHandle hRmDeviceHandle, |
+ NvU32 EntryIndex, |
+ NvU32 LogDomainsCount, |
+ NvU32 * pIntervalMs, |
+ NvU32 * pLp2TimeMs, |
+ NvU32 * pActiveCyclesList, |
+ NvRmFreqKHz * pAveragesList, |
+ NvRmFreqKHz * pFrequenciesList ); |
+ |
+/** |
+ * Gets specified entry of the detailed DFS starvation hints log. |
+ * |
+ * @param hRmDeviceHandle The RM device handle. |
+ * @param EntryIndex Log entrty index. |
+ * @param pSampleIndex Pointer to a variable filled with sample interval |
+ * index in the activity log when this hint is associated with. |
+ * @param pStarvationHint Pointer to a variable filled with starvation |
+ * hint record. |
+ * |
+ * @retval NvSuccess if next entry is retrieved successfully. |
+ * @retval NvError_InvalidAddress if requetsed entry is empty. |
+ * @retval NvError_NotSupported if DFS is disabled, or detailed logging |
+ * is not supported. |
+ */ |
+ |
+ NvError NvRmDfsLogStarvationGetEntry( |
+ NvRmDeviceHandle hRmDeviceHandle, |
+ NvU32 EntryIndex, |
+ NvU32 * pSampleIndex, |
+ NvU32 * pClientId, |
+ NvU32 * pClientTag, |
+ NvRmDfsStarvationHint * pStarvationHint ); |
+ |
+/** |
+ * Gets specified entry of the detailed DFS busy hints log. |
+ * |
+ * @param hRmDeviceHandle The RM device handle. |
+ * @param EntryIndex Log entrty index. |
+ * @param pSampleIndex Pointer to a variable filled with sample interval |
+ * index in the activity log when this hint is associated with. |
+ * @param pBusyHint Pointer to a variable filled with busy |
+ * hint record. |
+ * |
+ * @retval NvSuccess if next entry is retrieved successfully. |
+ * @retval NvError_InvalidAddress if requetsed entry is empty. |
+ * @retval NvError_NotSupported if DFS is disabled, or detailed logging |
+ * is not supported. |
+ */ |
+ |
+ NvError NvRmDfsLogBusyGetEntry( |
+ NvRmDeviceHandle hRmDeviceHandle, |
+ NvU32 EntryIndex, |
+ NvU32 * pSampleIndex, |
+ NvU32 * pClientId, |
+ NvU32 * pClientTag, |
+ NvRmDfsBusyHint * pBusyHint ); |
+ |
+/** |
+ * Gets low threshold and present voltage on the given rail. |
+ * |
+ * @param hRmDeviceHandle The RM device handle. |
+ * @param RailId The targeted voltage rail ID. |
+ * @param pLowMv Output storage pointer for low voltage threshold (in |
+ * millivolt). NvRmVoltsUnspecified is returned if targeted rail does |
+ * not exist on SoC. |
+ * @param pPresentMv Output storage pointer for present rail voltage (in |
+ * millivolt). NvRmVoltsUnspecified is returned if targeted rail does |
+ * not exist on SoC. |
+ */ |
+ |
+ void NvRmDfsGetLowVoltageThreshold( |
+ NvRmDeviceHandle hRmDeviceHandle, |
+ NvRmDfsVoltageRailId RailId, |
+ NvRmMilliVolts * pLowMv, |
+ NvRmMilliVolts * pPresentMv ); |
+ |
+/** |
+ * Sets low threshold for the given rail. The actual rail voltage is scaled |
+ * to match SoC clock frequencies, but not below the specified threshold. |
+ * |
+ * @param hRmDeviceHandle The RM device handle. |
+ * @param RailId The targeted voltage rail ID. |
+ * @param LowMv Low voltage threshold (in millivolts) for the targeted rail. |
+ * Ignored if targeted rail does not exist on SoC. |
+ */ |
+ |
+ void NvRmDfsSetLowVoltageThreshold( |
+ NvRmDeviceHandle hRmDeviceHandle, |
+ NvRmDfsVoltageRailId RailId, |
+ NvRmMilliVolts LowMv ); |
+ |
+/** |
+ * Notifies RM Kernel about entering Suspend state. |
+ * |
+ * @param hRmDeviceHandle The RM device handle. |
+ * |
+ * @retval NvSuccess if notifying RM entering Suspend state successfully. |
+ */ |
+ |
+ NvError NvRmKernelPowerSuspend( |
+ NvRmDeviceHandle hRmDeviceHandle ); |
+ |
+/** |
+ * Notifies RM kernel about entering Resume state. |
+ * |
+ * @param hRmDeviceHandle The RM device handle. |
+ * |
+ * @retval NvSuccess if notifying RM entering Resume state successfully. |
+ */ |
+ |
+ NvError NvRmKernelPowerResume( |
+ NvRmDeviceHandle hRmDeviceHandle ); |
+ |
+/** @} */ |
+ |
+#if defined(__cplusplus) |
+} |
+#endif |
+ |
+#endif |