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
33 #define RGX_DVFS_CURRENT_FREQ 0
35 #define FPS_DEFAULT_GAP 300
36 #define FPS_MAX_GAP 5000
38 #define LIMIT_FPS_POWER_SAVE 50
40 #define ONE_MHZ 1000000
41 #define HZ_TO_MHZ(m) ((m) / ONE_MHZ)
42 /* Conversion helpers for setting up high resolution timers */
43 #define HR_TIMER_DELAY_MSEC(x) (ns_to_ktime((x)*1000000U))
44 #define HR_TIMER_DELAY_NSEC(x) (ns_to_ktime(x))
45 #define RGX_DVFS_LEVEL_INTERVAL 2
47 /* Shift used for kbasep_pm_metrics_data.time_busy/idle - units of (1 << 8) ns
48 This gives a maximum period between samples of 2^(32+8)/100 ns = slightly under 11s.
49 Exceeding this will cause overflow */
50 #define RK_PM_TIME_SHIFT 8
52 #define RK_EXPORT_API(func) EXPORT_SYMBOL(func);
54 typedef struct _rgx_dvfs_info
58 IMG_INT min_threshold;
59 IMG_INT max_threshold;
64 typedef struct _rgx_dvfs_status_type
68 IMG_UINT32 temperature;
69 IMG_UINT32 temperature_time;
86 IMG_INT utilis[RK33_MAX_UTILIS];
87 IMG_INT time_busys[RK33_MAX_UTILIS];
88 IMG_INT time_idles[RK33_MAX_UTILIS];
93 /** Indicator if system clock to mail-t604 is active */
94 IMG_INT cmu_pmu_status;
96 spinlock_t cmu_pmu_lock;
98 spinlock_t timer_lock;
102 struct clk *pd_gpu_0;
103 struct clk *pd_gpu_1;
105 //struct clk *aclk_gpu;
106 struct clk *aclk_gpu_mem;
107 struct clk *aclk_gpu_cfg;
109 struct dvfs_node *gpu_clk_node;
111 PVRSRV_DEVICE_NODE *psDeviceNode;
112 RGXFWIF_GPU_UTIL_STATS sUtilStats;
114 IMG_BOOL dvfs_enabled;
116 #if RK33_DVFS_SUPPORT
117 #if RK33_USE_CUSTOMER_GET_GPU_UTIL
118 ktime_t time_period_start;
122 IMG_UINT32 temperature;
123 IMG_UINT32 temperature_time;
126 struct hrtimer timer;
128 IMG_BOOL timer_active;
132 struct task_struct *dvfs_task;
133 wait_queue_head_t dvfs_wait;
136 /*To calculate utilization for x sec */
140 struct rk_utilis stUtilis;
142 IMG_UINT32 time_busy;
143 IMG_UINT32 time_idle;
145 #if RK33_USE_CL_COUNT_UTILS
146 IMG_UINT32 abs_load[4];
149 #if RK33_SYSFS_FILE_SUPPORT
150 #if RK33_DVFS_FREQ_LIMIT
153 #endif //end of RK33_DVFS_FREQ_LIMIT
157 #endif //end of RK33_SYSFS_FILE_SUPPORT
159 #endif //end of RK33_DVFS_SUPPORT
162 IMG_VOID RgxRkInit(IMG_VOID);
163 IMG_VOID RgxRkUnInit(IMG_VOID);
164 IMG_VOID RgxResume(IMG_VOID);
165 IMG_VOID RgxSuspend(IMG_VOID);
167 IMG_BOOL rk33_dvfs_init(IMG_VOID);
168 IMG_VOID rk33_dvfs_term(IMG_VOID);
170 #if RK33_DVFS_SUPPORT && RK33_USE_RGX_GET_GPU_UTIL
171 IMG_BOOL rk33_set_device_node(IMG_HANDLE hDevCookie);
172 IMG_BOOL rk33_clear_device_node(IMG_VOID);
175 PVRSRV_ERROR IonInit(void *pvPrivateData);
176 IMG_VOID IonDeinit(IMG_VOID);
177 PVRSRV_ERROR RkPrePowerState(PVRSRV_DEV_POWER_STATE eNewPowerState, PVRSRV_DEV_POWER_STATE eCurrentPowerState, IMG_BOOL bForced);
178 PVRSRV_ERROR RkPostPowerState(PVRSRV_DEV_POWER_STATE eNewPowerState, PVRSRV_DEV_POWER_STATE eCurrentPowerState, IMG_BOOL bForced);
179 #endif /* __SUNXI_INIT__ */