1 #if !defined(__RK_INIT__)
4 #include <linux/hrtimer.h>
5 #include <linux/kthread.h>
9 /****************************************************************************
10 Add Rockchip modificatons here!
11 *****************************************************************************/
12 #define RK33_DVFS_SUPPORT 1 // 1:DVFS on 0:DVFS off
13 #define RK33_SYSFS_FILE_SUPPORT 1 // 1:add information nodes in /sys/devices/ffa30000.gpu/
15 //RK33_USE_RGX_GET_GPU_UTIL and RK33_USE_CUSTOMER_GET_GPU_UTIL are mutually exclusive
16 #define RK33_USE_RGX_GET_GPU_UTIL 1
17 #define RK33_USE_CUSTOMER_GET_GPU_UTIL 0
19 #define RK33_USE_CL_COUNT_UTILS 0
22 //USE_KTHREAD and USE_HRTIMER are mutually exclusive
26 #define RK_TF_VERSION 1
28 #define RK33_MAX_UTILIS 4
29 #define RK33_DVFS_FREQ 50
30 #define RK33_DEFAULT_CLOCK 400
31 #define RK33_DVFS_FREQ_LIMIT 1
32 #define RGX_DVFS_CURRENT_FREQ 0
34 #define FPS_DEFAULT_GAP 300
35 #define FPS_MAX_GAP 5000
37 #define LIMIT_FPS_POWER_SAVE 50
39 #define ONE_MHZ 1000000
40 #define HZ_TO_MHZ(m) ((m) / ONE_MHZ)
41 /* Conversion helpers for setting up high resolution timers */
42 #define HR_TIMER_DELAY_MSEC(x) (ns_to_ktime((x)*1000000U))
43 #define HR_TIMER_DELAY_NSEC(x) (ns_to_ktime(x))
44 #define RGX_DVFS_LEVEL_INTERVAL 2
46 /* Shift used for kbasep_pm_metrics_data.time_busy/idle - units of (1 << 8) ns
47 This gives a maximum period between samples of 2^(32+8)/100 ns = slightly under 11s.
48 Exceeding this will cause overflow */
49 #define RK_PM_TIME_SHIFT 8
51 #define RK_EXPORT_API(func) EXPORT_SYMBOL(func);
53 typedef struct _rgx_dvfs_info {
56 IMG_INT min_threshold;
57 IMG_INT max_threshold;
62 typedef struct _rgx_dvfs_status_type {
65 IMG_UINT32 temperature;
66 IMG_UINT32 temperature_time;
81 IMG_INT utilis[RK33_MAX_UTILIS];
82 IMG_INT time_busys[RK33_MAX_UTILIS];
83 IMG_INT time_idles[RK33_MAX_UTILIS];
87 /** Indicator if system clock to mail-t604 is active */
88 IMG_INT cmu_pmu_status;
90 spinlock_t cmu_pmu_lock;
92 spinlock_t timer_lock;
99 //struct clk *aclk_gpu;
100 struct clk *aclk_gpu_mem;
101 struct clk *aclk_gpu_cfg;
102 struct clk *sclk_gpu_core;
103 struct regulator *gpu_reg;
105 PVRSRV_DEVICE_NODE *psDeviceNode;
106 RGXFWIF_GPU_UTIL_STATS sUtilStats;
108 IMG_BOOL dvfs_enabled;
110 #if RK33_DVFS_SUPPORT
111 #if RK33_USE_CUSTOMER_GET_GPU_UTIL
112 ktime_t time_period_start;
116 IMG_UINT32 temperature;
117 IMG_UINT32 temperature_time;
120 struct hrtimer timer;
122 IMG_BOOL timer_active;
126 struct task_struct *dvfs_task;
127 wait_queue_head_t dvfs_wait;
130 /*To calculate utilization for x sec */
134 struct rk_utilis stUtilis;
136 IMG_UINT32 time_busy;
137 IMG_UINT32 time_idle;
139 #if RK33_USE_CL_COUNT_UTILS
140 IMG_UINT32 abs_load[4];
143 #if RK33_SYSFS_FILE_SUPPORT
144 #if RK33_DVFS_FREQ_LIMIT
147 #endif //end of RK33_DVFS_FREQ_LIMIT
151 #endif //end of RK33_SYSFS_FILE_SUPPORT
153 #endif //end of RK33_DVFS_SUPPORT
156 IMG_VOID RgxRkInit(IMG_VOID);
157 IMG_VOID RgxRkUnInit(IMG_VOID);
158 IMG_VOID RgxResume(IMG_VOID);
159 IMG_VOID RgxSuspend(IMG_VOID);
161 IMG_BOOL rk33_dvfs_init(IMG_VOID);
162 IMG_VOID rk33_dvfs_term(IMG_VOID);
164 #if RK33_DVFS_SUPPORT && RK33_USE_RGX_GET_GPU_UTIL
165 IMG_BOOL rk33_set_device_node(IMG_HANDLE hDevCookie);
166 IMG_BOOL rk33_clear_device_node(IMG_VOID);
169 PVRSRV_ERROR IonInit(void *pvPrivateData);
170 IMG_VOID IonDeinit(IMG_VOID);
171 PVRSRV_ERROR RkPrePowerState(PVRSRV_DEV_POWER_STATE eNewPowerState,
172 PVRSRV_DEV_POWER_STATE eCurrentPowerState,
174 PVRSRV_ERROR RkPostPowerState(PVRSRV_DEV_POWER_STATE eNewPowerState,
175 PVRSRV_DEV_POWER_STATE eCurrentPowerState,
177 #endif /* __SUNXI_INIT__ */