b71ad46ce0c49e1bf0a2f9557a6bbe8b14d2d464
[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 RK_RESERVED                     0
33 #define RGX_DVFS_CURRENT_FREQ           0
34
35 #define FPS_DEFAULT_GAP                 300
36 #define FPS_MAX_GAP                     5000
37 #define LIMIT_FPS                       60
38 #define LIMIT_FPS_POWER_SAVE            50
39 #define ONE_KHZ                         1000
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
46
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
51
52 #define RK_EXPORT_API(func)  EXPORT_SYMBOL(func);
53
54 typedef struct _rgx_dvfs_info
55 {
56     IMG_UINT    voltage;
57     IMG_UINT    clock;
58     IMG_INT     min_threshold;
59     IMG_INT     max_threshold;
60     IMG_UINT64  time;
61     IMG_UINT    coef;
62 } rgx_dvfs_info;
63
64 typedef struct _rgx_dvfs_status_type
65 {
66     IMG_INT step;
67     IMG_INT utilisation;
68     IMG_UINT32 temperature;
69     IMG_UINT32 temperature_time;
70 #if 0
71     IMG_INT upper_lock;
72     IMG_INT under_lock;
73 #endif
74
75 } rgx_dvfs_status;
76
77 enum
78 {
79     DBG_OFF = 0,
80     DBG_LOW,
81     DBG_HIGH,
82 };
83
84 struct rk_utilis
85 {
86     IMG_INT utilis[RK33_MAX_UTILIS];
87     IMG_INT time_busys[RK33_MAX_UTILIS];
88     IMG_INT time_idles[RK33_MAX_UTILIS];
89 };
90
91 struct rk_context
92 {
93     /** Indicator if system clock to mail-t604 is active */
94     IMG_INT                 cmu_pmu_status;
95     /** cmd & pmu lock */
96     spinlock_t              cmu_pmu_lock;
97     /*Timer*/
98     spinlock_t              timer_lock;
99
100 #if OPEN_GPU_PD
101     IMG_BOOL                bEnablePd;
102     struct clk              *pd_gpu_0;
103     struct clk              *pd_gpu_1;
104 #endif
105     //struct clk              *aclk_gpu;
106     struct clk              *aclk_gpu_mem;
107     struct clk              *aclk_gpu_cfg;
108     struct clk              *clk_gpu;
109     struct dvfs_node        *gpu_clk_node;
110
111     PVRSRV_DEVICE_NODE     *psDeviceNode;
112     RGXFWIF_GPU_UTIL_STATS  sUtilStats;
113     IMG_BOOL                gpu_active;
114     IMG_BOOL                dvfs_enabled;
115
116 #if RK33_DVFS_SUPPORT
117 #if RK33_USE_CUSTOMER_GET_GPU_UTIL
118     ktime_t                 time_period_start;
119 #endif
120
121     /*Temperature*/
122     IMG_UINT32              temperature;
123     IMG_UINT32              temperature_time;
124
125 #if USE_HRTIMER
126     struct hrtimer          timer;
127 #endif
128     IMG_BOOL                timer_active;
129
130 #if USE_KTHREAD
131     /*dvfs kthread*/
132     struct task_struct      *dvfs_task;
133     wait_queue_head_t       dvfs_wait;
134 #endif
135
136     /*To calculate utilization for x sec */
137     IMG_INT         freq_level;
138     IMG_INT         freq;
139     IMG_INT         time_tick;
140     struct rk_utilis stUtilis;
141     IMG_INT         utilisation;
142     IMG_UINT32      time_busy;
143     IMG_UINT32      time_idle;
144
145 #if RK33_USE_CL_COUNT_UTILS
146     IMG_UINT32      abs_load[4];
147 #endif
148
149 #if RK33_SYSFS_FILE_SUPPORT
150 #if RK33_DVFS_FREQ_LIMIT
151     IMG_INT         up_level;
152     IMG_INT         down_level;
153 #endif //end of RK33_DVFS_FREQ_LIMIT
154     IMG_INT         debug_level;
155     IMG_UINT        fps_gap;
156     IMG_INT         fix_freq;
157 #endif //end of RK33_SYSFS_FILE_SUPPORT
158
159 #endif  //end of RK33_DVFS_SUPPORT
160 };
161
162 IMG_VOID RgxRkInit(IMG_VOID);
163 IMG_VOID RgxRkUnInit(IMG_VOID);
164 IMG_VOID RgxResume(IMG_VOID);
165 IMG_VOID RgxSuspend(IMG_VOID);
166
167 IMG_BOOL rk33_dvfs_init(IMG_VOID);
168 IMG_VOID rk33_dvfs_term(IMG_VOID);
169
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);
173 #endif
174
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__ */