GPU: Rogue_M: update to 1.31_2 version & support gpu pd.
[firefly-linux-kernel-4.4.55.git] / drivers / gpu / rogue_m / system / rk3368 / rk_init.h
1 #if !defined(__RK_INIT__)
2 #define __RK_INIT__
3
4 #include <linux/hrtimer.h>
5 #include <linux/kthread.h>
6 #include "rgxdevice.h"
7 #include "device.h"
8
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/
14
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
18
19 #define RK33_USE_CL_COUNT_UTILS             0
20 #define OPEN_GPU_PD                         1
21
22 //USE_KTHREAD and USE_HRTIMER are mutually exclusive
23 #define USE_KTHREAD                         0
24 #define USE_HRTIMER                         1
25
26 #define RK_TF_VERSION                       1
27
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
33
34 #define FPS_DEFAULT_GAP                 300
35 #define FPS_MAX_GAP                     5000
36 #define LIMIT_FPS                       60
37 #define LIMIT_FPS_POWER_SAVE            50
38 #define ONE_KHZ                         1000
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
45
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
50
51 #define RK_EXPORT_API(func)  EXPORT_SYMBOL(func);
52
53 typedef struct _rgx_dvfs_info {
54         IMG_UINT voltage;
55         IMG_UINT clock;
56         IMG_INT min_threshold;
57         IMG_INT max_threshold;
58         IMG_UINT64 time;
59         IMG_UINT coef;
60 } rgx_dvfs_info;
61
62 typedef struct _rgx_dvfs_status_type {
63         IMG_INT step;
64         IMG_INT utilisation;
65         IMG_UINT32 temperature;
66         IMG_UINT32 temperature_time;
67 #if 0
68         IMG_INT upper_lock;
69         IMG_INT under_lock;
70 #endif
71
72 } rgx_dvfs_status;
73
74 enum {
75         DBG_OFF = 0,
76         DBG_LOW,
77         DBG_HIGH,
78 };
79
80 struct rk_utilis {
81         IMG_INT utilis[RK33_MAX_UTILIS];
82         IMG_INT time_busys[RK33_MAX_UTILIS];
83         IMG_INT time_idles[RK33_MAX_UTILIS];
84 };
85
86 struct rk_context {
87         /** Indicator if system clock to mail-t604 is active */
88         IMG_INT cmu_pmu_status;
89         /** cmd & pmu lock */
90         spinlock_t cmu_pmu_lock;
91         /*Timer */
92         spinlock_t timer_lock;
93
94 #if OPEN_GPU_PD
95         IMG_BOOL bEnablePd;
96         struct clk *pd_gpu_0;
97         struct clk *pd_gpu_1;
98 #endif
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;
104
105         PVRSRV_DEVICE_NODE *psDeviceNode;
106         RGXFWIF_GPU_UTIL_STATS sUtilStats;
107         IMG_BOOL gpu_active;
108         IMG_BOOL dvfs_enabled;
109
110 #if RK33_DVFS_SUPPORT
111 #if RK33_USE_CUSTOMER_GET_GPU_UTIL
112         ktime_t time_period_start;
113 #endif
114
115         /*Temperature */
116         IMG_UINT32 temperature;
117         IMG_UINT32 temperature_time;
118
119 #if USE_HRTIMER
120         struct hrtimer timer;
121 #endif
122         IMG_BOOL timer_active;
123
124 #if USE_KTHREAD
125         /*dvfs kthread */
126         struct task_struct *dvfs_task;
127         wait_queue_head_t dvfs_wait;
128 #endif
129
130         /*To calculate utilization for x sec */
131         IMG_INT freq_level;
132         IMG_INT freq;
133         IMG_INT time_tick;
134         struct rk_utilis stUtilis;
135         IMG_INT utilisation;
136         IMG_UINT32 time_busy;
137         IMG_UINT32 time_idle;
138
139 #if RK33_USE_CL_COUNT_UTILS
140         IMG_UINT32 abs_load[4];
141 #endif
142
143 #if RK33_SYSFS_FILE_SUPPORT
144 #if RK33_DVFS_FREQ_LIMIT
145         IMG_INT up_level;
146         IMG_INT down_level;
147 #endif                          //end of RK33_DVFS_FREQ_LIMIT
148         IMG_INT debug_level;
149         IMG_UINT fps_gap;
150         IMG_INT fix_freq;
151 #endif                          //end of RK33_SYSFS_FILE_SUPPORT
152
153 #endif                          //end of RK33_DVFS_SUPPORT
154 };
155
156 IMG_VOID RgxRkInit(IMG_VOID);
157 IMG_VOID RgxRkUnInit(IMG_VOID);
158 IMG_VOID RgxResume(IMG_VOID);
159 IMG_VOID RgxSuspend(IMG_VOID);
160
161 IMG_BOOL rk33_dvfs_init(IMG_VOID);
162 IMG_VOID rk33_dvfs_term(IMG_VOID);
163
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);
167 #endif
168
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,
173                              IMG_BOOL bForced);
174 PVRSRV_ERROR RkPostPowerState(PVRSRV_DEV_POWER_STATE eNewPowerState,
175                               PVRSRV_DEV_POWER_STATE eCurrentPowerState,
176                               IMG_BOOL bForced);
177 #endif /* __SUNXI_INIT__ */