Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(9)

Unified Diff: arch/arm/mach-tegra/nv/nvrm/core/common/nvrm_power_dfs.h

Issue 3256004: [ARM] tegra: add nvos/nvrm/nvmap drivers (Closed) Base URL: ssh://git@gitrw.chromium.org/kernel.git
Patch Set: remove ap15 headers Created 10 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: arch/arm/mach-tegra/nv/nvrm/core/common/nvrm_power_dfs.h
diff --git a/arch/arm/mach-tegra/nv/nvrm/core/common/nvrm_power_dfs.h b/arch/arm/mach-tegra/nv/nvrm/core/common/nvrm_power_dfs.h
new file mode 100644
index 0000000000000000000000000000000000000000..65137c83a8ce2375886fa505b4ccf0e895a931fd
--- /dev/null
+++ b/arch/arm/mach-tegra/nv/nvrm/core/common/nvrm_power_dfs.h
@@ -0,0 +1,576 @@
+/*
+ * 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.
+ *
+ */
+
+/**
+ * @file
+ * @brief <b>nVIDIA Driver Development Kit:
+ * Power Resource manager </b>
+ *
+ * @b Description: NvRM DFS manager definitions.
+ *
+ */
+
+#ifndef INCLUDED_NVRM_POWER_DFS_H
+#define INCLUDED_NVRM_POWER_DFS_H
+
+#include "nvrm_power_private.h"
+#include "nvrm_clocks.h"
+#include "nvrm_interrupt.h"
+#include "nvodm_tmon.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+/**
+ * Sampling window definitions:
+ * - minimum and maximum sampling interval in ms
+ * - maximum number of intervals in the sampling window
+ * (always defined as power of 2 to simplify calculations)
+ */
+#define NVRM_DFS_MIN_SAMPLE_MS (10)
+#define NVRM_DFS_MAX_SAMPLE_MS (20)
+
+#define NVRM_DFS_MAX_SAMPLES_LOG2 (7)
+#define NVRM_DFS_MAX_SAMPLES (0x1 << NVRM_DFS_MAX_SAMPLES_LOG2)
+
+/// Specifies that CPU idle monitor readings should be explicitly offset
+/// by time spent in LP2
+#define NVRM_CPU_IDLE_LP2_OFFSET (1)
+
+/// Number of bits in the fractional part of boost koefficients
+#define BOOST_FRACTION_BITS (8)
+
+/*****************************************************************************/
+
+/// Enumerates synchronous busy hints states
+typedef enum
+{
+ NvRmDfsBusySyncState_Idle = 0,
+ NvRmDfsBusySyncState_Signal,
+ NvRmDfsBusySyncState_Execute,
+
+ NvRmDfsBusySyncState_Num,
+ NvRmDfsBusySyncState_Force32 = 0x7FFFFFFF
+} NvRmDfsBusySyncState;
+
+/// Enumerates DFS modules = modules, which include activity monitors for clock
+/// domains controlled by DFS
+typedef enum
+{
+ // Specifies system statistic module - includes activity monitors
+ // for CPU, AVP, AHB, and APB clock domains
+ NvRmDfsModuleId_Systat = 1,
+
+ // Specifies VDE module - includes activity monitor
+ // for video-pipe clock domain
+ NvRmDfsModuleId_Vde,
+
+ // Specifies EMC module - includes activity monitor
+ // for EMC 1x clock domain
+ NvRmDfsModuleId_Emc,
+
+ NvRmDfsModuleId_Num,
+ NvRmDfsModuleId_Force32 = 0x7FFFFFFF
+} NvRmDfsModuleId;
+
+/**
+ * Combines idle count readings from DFS activity monitors during current
+ * sample interval
+ */
+typedef struct NvRmDfsIdleDataRec
+{
+ // Current Sample interval in ms
+ NvU32 CurrentIntervalMs;
+
+ // Data readings from DFS activity monitors
+ NvU32 Readings[NvRmDfsClockId_Num];
+
+ // Time spent in LP2 in ms
+ NvU32 Lp2TimeMs;
+} NvRmDfsIdleData;
+
+/**
+ * DFS module access function pointers
+ */
+typedef struct NvRmDfsRec* NvRmDfsPtr;
+typedef const struct NvRmDfsRec* NvRmConstDfsPtr;
+typedef NvError (*FuncPtrModuleMonitorsInit)(NvRmDfsPtr pDfs);
+typedef void (*FuncPtrModuleMonitorsDeinit)(NvRmDfsPtr pDfs);
+
+typedef void
+(*FuncPtrModuleMonitorsStart)(
+ NvRmConstDfsPtr pDfs,
+ const NvRmDfsFrequencies* pDfsKHz,
+ const NvU32 IntevalMs);
+
+typedef void
+(*FuncPtrModuleMonitorsRead)(
+ NvRmConstDfsPtr pDfs,
+ const NvRmDfsFrequencies* pDfsKHz,
+ NvRmDfsIdleData* pIdleData);
+
+/**
+ * Combines capabilities, access function pointers, and base virtual
+ * addresses of the DFS module
+ */
+typedef struct NvRmDfsModuleRec
+{
+ // Clock domains monitored by this module
+ NvBool DomainMap[NvRmDfsClockId_Num];
+
+ // Pointer to the function that initializes module activity monitors
+ // (null if module is not present)
+ FuncPtrModuleMonitorsInit Init;
+
+ // Pointer to the function that de-initializes module activity monitors
+ // (null if module is not present)
+ FuncPtrModuleMonitorsDeinit Deinit;
+
+ // Pointer to the function that starts module activity monitors
+ // (null if module is not present)
+ FuncPtrModuleMonitorsStart Start;
+
+ // Pointer to the function that reads module activity monitors
+ // (null if module is not present)
+ FuncPtrModuleMonitorsRead Read;
+
+ // Monitor readouts scale and offset (usage and interpretation may differ
+ // for different monitors)
+ NvU32 Scale;
+ NvU32 Offset;
+
+ // Base virtual address for module registers
+ void* pBaseReg;
+} NvRmDfsModule;
+
+/*****************************************************************************/
+
+/**
+ * Combines DFS starvation control parameters
+ */
+typedef struct NvRmDfsStarveParamRec
+{
+ // Fixed increase in frequency boost for a sample interval the clock
+ // consumer is starving: new boost = old boost + BoostStepKHz
+ NvRmFreqKHz BoostStepKHz;
+
+ // Proportional increase in frequency boost for a sample interval the
+ // clock consumer is starving (scaled in 0-255 range):
+ // new boost = old boost + old boost * BoostIncKoef / 256
+ NvU8 BoostIncKoef;
+
+ // Proportional decrease in frequency boost for a sample interval the
+ // clock consumer is not starving (scaled in 0-255 range):
+ // new boost = old boost - old boost * BoostDecKoef / 256
+ NvU8 BoostDecKoef;
+} NvRmDfsStarveParam;
+
+
+/**
+ * Combines scaling algorithm parameters for DFS controlled clock domain
+ */
+typedef struct NvRmDfsParamRec
+{
+ // Maximum domain clock frequency
+ NvRmFreqKHz MaxKHz;
+ // Minimum domain clock frequency
+ NvRmFreqKHz MinKHz;
+
+ // Minimum average activity change in upward direction recognized by DFS
+ NvRmFreqKHz UpperBandKHz;
+ // Minimum average activity change in downward direction recognized by DFS
+ NvRmFreqKHz LowerBandKHz;
+
+ // Control parameters for real time starvation reported by the DFS client
+ NvRmDfsStarveParam RtStarveParam;
+
+ // Control parameters for non real time starvation detected by DFS itself
+ NvRmDfsStarveParam NrtStarveParam;
+
+ // Relative adjustment up of average activity applied by DFS:
+ // adjusted frequency = measured average activity * (1 + 2^(-RelAdjustBits))
+ NvU8 RelAdjustBits;
+
+ // Minimum number of sample intervals in a row with non-realtime starvation
+ // that triggers frequency boost (0 = boost trigger on the 1st NRT interval)
+ NvU8 MinNrtSamples;
+
+ // Minimum number of idle cycles in the sample interval required to avoid
+ // non-realtime starvation
+ NvU32 MinNrtIdleCycles;
+} NvRmDfsParam;
+
+/**
+ * Combines sampling statistic and starvation controls for DFS clock domain
+ */
+typedef struct NvRmDfsSamplerRec
+{
+ // Domain clock id
+ NvRmDfsClockId ClockId;
+
+ // Activity monitor present indicator (domain is still controlled by DFS
+ // even if no activity monitor present)
+ NvBool MonitorPresent;
+
+ // Circular buffer of active cycles per sample interval within the
+ // sampling window
+ NvU32 Cycles[NVRM_DFS_MAX_SAMPLES];
+
+ // Pointer to the last ("recent") sample in the sampling window
+ NvU32* pLastSample;
+
+ // Total number of active cycles in the sampling window
+ NvU64 TotalActiveCycles;
+
+ // Measured average clock activity frequency over the sampling window
+ NvRmFreqKHz AverageKHz;
+
+ // Average clock frequency adjusted up by DFS
+ NvRmFreqKHz BumpedAverageKHz;
+
+ // Non-real time starving sample counter
+ NvU32 NrtSampleCounter;
+
+ // Non-real time starvation boost
+ NvRmFreqKHz NrtStarveBoostKHz;
+
+ // Real time starvation boost
+ NvRmFreqKHz RtStarveBoostKHz;
+
+ // Busy pulse mode indicator - if true, busy boost is completely removed
+ // after busy time has expired; if false, DFS averaging mechanism is used
+ // to gradually lower frequency after busy boost
+ NvBool BusyPulseMode;
+
+ // Cumulative number of cycles since log start
+ NvU64 CumulativeLogCycles;
+} NvRmDfsSampler;
+
+/**
+ * Holds information for DFS moving sampling window
+ */
+typedef struct NvRmDfsSampleWindowRec
+{
+ // Minimum sampling interval
+ NvU32 MinIntervalMs;
+
+ // Maximum sampling interval
+ NvU32 MaxIntervalMs;
+
+ // Next sample interval
+ NvU32 NextIntervalMs;
+
+ // Circular buffer of sample intervals in the sampling window
+ NvU32 IntervalsMs[NVRM_DFS_MAX_SAMPLES];
+
+ // Pointer to the last ("recent") sample unterval in the sampling window
+ NvU32* pLastInterval;
+
+ // Cumulative width of the sampling window
+ NvU32 SampleWindowMs;
+
+ // Last busy hints check time stamp
+ NvU32 BusyCheckLastUs;
+
+ // Delay before busy hints next check
+ NvU32 BusyCheckDelayUs;
+
+ // Free running sample counter
+ NvU32 SampleCnt;
+
+ // Cumulative DFS time since log start
+ NvU32 CumulativeLogMs;
+
+ // Cumulative LP2 statistic since log start
+ NvU32 CumulativeLp2TimeMs;
+ NvU32 CumulativeLp2Entries;
+} NvRmDfsSampleWindow;
+
+/*****************************************************************************/
+
+/**
+ * Holds voltage corner for DFS domains and non-DFS modules. Each voltage
+ * corner field specifies minimum core voltage required to run the respective
+ * device(s) at current clock frequency.
+ */
+typedef struct NvRmDvsCornerRec
+{
+ // CPU voltage requirements
+ NvRmMilliVolts CpuMv;
+
+ // AVP/System voltage requirements
+ NvRmMilliVolts SystemMv;
+
+ // EMC / DDR voltage requirements
+ NvRmMilliVolts EmcMv;
+
+ // Cumulative voltage requirements for non-DFS modules
+ NvRmMilliVolts ModulesMv;
+} NvRmDvsCorner;
+
+/**
+ * Combines voltage threshold and core rail status and control information
+ */
+typedef struct NvRmDvsRec
+{
+ // Current DVS voltage thresholds
+ NvRmDvsCorner DvsCorner;
+
+ // RTC (AO) rail address (PMU voltage id)
+ NvU32 RtcRailAddress;
+
+ // Core rail address (PMU voltage id)
+ NvU32 CoreRailAddress;
+
+ // Current core rail voltage
+ NvRmMilliVolts CurrentCoreMv;
+
+ // Nominal core rail voltage
+ NvRmMilliVolts NominalCoreMv;
+
+ // Minimum core rail voltage
+ NvRmMilliVolts MinCoreMv;
+
+ // Low corner voltage for core rail loaded by DVS control API
+ NvRmMilliVolts LowCornerCoreMv;
+
+ // Dedicated Cpu rail address (PMU voltage id)
+ NvU32 CpuRailAddress;
+
+ // Current dedicated CPU rail voltage
+ NvRmMilliVolts CurrentCpuMv;
+
+ // Nominal dedicated CPU rail voltage
+ NvRmMilliVolts NominalCpuMv;
+
+ // Minimum dedicated CPU rail voltage
+ NvRmMilliVolts MinCpuMv;
+
+ // Low corner voltage for CPU rail loaded by DVS control API
+ NvRmMilliVolts LowCornerCpuMv;
+
+ // OTP (default) dedicated CPU rail voltage
+ NvRmMilliVolts CpuOTPMv;
+
+ // Specifies whether or not CPU voltage will switch back to OTP
+ // (default) value after CPU request On-Off-On transition
+ NvBool VCpuOTPOnWakeup;
+
+ // RAM timing SVOP controls low voltage threshold
+ NvRmMilliVolts LowSvopThresholdMv;
+
+ // RAM timing SVOP controls low voltage setting
+ NvU32 LowSvopSettings;
+
+ // RAM timing SVOP controls high voltage setting
+ NvU32 HighSvopSettings;
+
+ // Request core voltage update
+ volatile NvBool UpdateFlag;
+
+ // Stop voltage scaling flag
+ volatile NvBool StopFlag;
+
+ // CPU LP2 state indicator (used on platforms with dedicated CPU rail that
+ // returns to default setting by PMU underneath DVFS on every LP2 exit)
+ volatile NvBool Lp2SyncOTPFlag;
+} NvRmDvs;
+
+/**
+ * RM thermal zone policy
+ */
+typedef struct NvRmTzonePolicyRec
+{
+ // Request policy update
+ volatile NvBool UpdateFlag;
+
+ // Last policy update request time stamp
+ NvU32 TimeUs;
+
+ // Update period (NV_WAIT_INFINITE is allowed in interrupt mode)
+ NvU32 UpdateIntervalUs;
+
+ // Out of limit interrupt boundaries
+ NvS32 LowLimit;
+ NvS32 HighLimit;
+
+ // Policy range
+ NvU32 PolicyRange;
+} NvRmTzonePolicy;
+
+/**
+ * Combines status and control information for dynamic thermal throttling
+ */
+typedef struct NvRmDttRec
+{
+ // SoC core temperature monitor (TMON) handle
+ NvOdmTmonDeviceHandle hOdmTcore;
+
+ // Core TMON out-of-limit-interrupt handle
+ NvOdmTmonIntrHandle hOdmTcoreIntr;
+
+ // Core TMON capabilities
+ NvOdmTmonCapabilities TcoreCaps;
+
+ // Out of limit interrupt cpabilities for low limit
+ NvOdmTmonParameterCaps TcoreLowLimitCaps;
+
+ // Out-of-limit interrupt cpabilities for high limit
+ NvOdmTmonParameterCaps TcoreHighLimitCaps;
+
+ // Core zone policy
+ NvRmTzonePolicy TcorePolicy;
+
+ // Core temperature
+ NvS32 CoreTemperatureC;
+
+ // Specifies if out-of-limit interrupt is used for temperature update
+ volatile NvBool UseIntr;
+} NvRmDtt;
+
+/*****************************************************************************/
+
+/**
+ * Combines DFS status and control information
+ */
+typedef struct NvRmDfsRec
+{
+ // RM Device handle
+ NvRmDeviceHandle hRm;
+
+ // DFS state variable
+ NvRmDfsRunState DfsRunState;
+
+ // DFS state saved on system suspend entry
+ NvRmDfsRunState DfsLPxSavedState;
+
+ // ID assigned to DFS by RM Power Manager
+ NvU32 PowerClientId;
+
+ // DFS low power corner hit status - true, when all domains (with
+ // possible exception of CPU) are running at minimum frequency
+ NvBool LowCornerHit;
+
+ // Request to report low corner hit status to OS adaptation layer; DFS
+ // interrupt will not wake CPU if it is power gated and low corner is hit
+ NvBool LowCornerReport;
+
+ // PM thread request for CPU state control
+ NvRmPmRequest PmRequest;
+
+ // DFS IRQ number
+ NvU16 IrqNumber;
+
+ // DFS mutex for safe data access by DFS ISR,
+ // clock control thread, and API threads
+ NvOsIntrMutexHandle hIntrMutex;
+
+ // DFS mutex for synchronous busy hints
+ NvOsMutexHandle hSyncBusyMutex;
+
+ // DFS semaphore for synchronous busy hints
+ NvOsSemaphoreHandle hSyncBusySemaphore;
+
+ // Synchronous busy hints state
+ volatile NvRmDfsBusySyncState BusySyncState;
+
+ // Clock control execution thread init indicator
+ volatile NvBool InitializedThread;
+
+ // Clock control execution thread abort indicator
+ volatile NvBool AbortThread;
+
+ // DFS semaphore for sampling interrupt and wake event signaling
+ NvOsSemaphoreHandle hSemaphore;
+
+ // DFS Modules
+ NvRmDfsModule Modules[NvRmDfsModuleId_Num];
+
+ // DFS algorithm parameters
+ NvRmDfsParam DfsParameters[NvRmDfsClockId_Num];
+
+ // DFS Samplers
+ NvRmDfsSampler Samplers[NvRmDfsClockId_Num];
+
+ // DFS sampling window
+ NvRmDfsSampleWindow SamplingWindow;
+
+ // Maximum DFS domains frequencies (shortcut to the respective parameters)
+ NvRmDfsFrequencies MaxKHz;
+
+ // Target DFS doamins frequencies: output of the DFS algorithm,
+ // input to clock control
+ NvRmDfsFrequencies TargetKHz;
+
+ // Current DFS domains frequencies: output from clock control, input
+ // to DFS algorithm
+ NvRmDfsFrequencies CurrentKHz;
+
+ // DFS domains frequencies set on entry to suspend state
+ NvRmDfsFrequencies SuspendKHz;
+
+ // Busy boost frequencies requested by Busy load API
+ NvRmDfsFrequencies BusyKHz;
+
+ // Low corner frequencies loaded by DFS control API
+ NvRmDfsFrequencies LowCornerKHz;
+
+ // High corner frequencies loaded by DFS control API
+ NvRmDfsFrequencies HighCornerKHz;
+
+ // A shadow of CPU corners (updated by APIs that directly set CPU corners,
+ // preserved when CPU corners are indirectly throttled by EMC envelope)
+ NvRmModuleClockLimits CpuCornersShadow;
+
+ // CPU envelope API indicator (if set supercedes low/high corner APIs)
+ NvBool CpuEnvelopeSet;
+
+ // EMC envelope API indicator (if set supercedes low/high corner APIs)
+ NvBool EmcEnvelopeSet;
+
+ // Voltage Scaler
+ NvRmDvs VoltageScaler;
+
+ // Thermal throttler
+ NvRmDtt ThermalThrottler;
+
+ // nvos interrupt handle for DVS
+ NvOsInterruptHandle DfsInterruptHandle;
+} NvRmDfs;
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif // INCLUDED_NVRM_POWER_DFS_H

Powered by Google App Engine
This is Rietveld 408576698