ARM: tegra12: set CPU rate to 2.2GHz for sku 0x87
[linux-3.10.git] / arch / arm / mach-tegra / la_priv.h
1 /*
2  * arch/arm/mach-tegra/la_priv.h
3  *
4  * Copyright (C) 2012-2013, NVIDIA CORPORATION.  All rights reserved.
5  *
6  * This software is licensed under the terms of the GNU General Public
7  * License version 2, as published by the Free Software Foundation, and
8  * may be copied, distributed, and modified under those terms.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  */
16
17 #ifndef _MACH_TEGRA_LA_PRIV_H_
18 #define _MACH_TEGRA_LA_PRIV_H_
19
20 #define ENABLE_LA_DEBUG         0
21
22 #define la_debug(fmt, ...) \
23 do { \
24         if (ENABLE_LA_DEBUG) { \
25                 printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__); \
26         } \
27 } while (0)
28
29 #define MASK(x) \
30         ((0xFFFFFFFFUL >> (31 - (1 ? x) + (0 ? x))) << (0 ? x))
31 #define SHIFT(x) \
32         (0 ? x)
33 #define ID(id) \
34         TEGRA_LA_##id
35
36 #define VALIDATE_ID(id, p) \
37 do { \
38         if (id >= TEGRA_LA_MAX_ID || (p)->id_to_index[(id)] == 0xFFFF) { \
39                 WARN_ONCE(1, "%s: invalid Id=%d", __func__, (id)); \
40                 return -EINVAL; \
41         } \
42         BUG_ON((p)->la_info_array[(p)->id_to_index[(id)]].id != (id)); \
43 } while (0)
44
45 #define VALIDATE_BW(bw_in_mbps) \
46 do { \
47         if (bw_in_mbps >= 4096) \
48                 return -EINVAL; \
49 } while (0)
50
51 #define VALIDATE_THRESHOLDS(tl, tm, th) \
52 do { \
53         if ((tl) > 100 || (tm) > 100 || (th) > 100) \
54                 return -EINVAL; \
55 } while (0)
56
57 #define LAST_DISP_CLIENT_ID     ID(DISPLAYD)
58 #define NUM_DISP_CLIENTS        (LAST_DISP_CLIENT_ID - FIRST_DISP_CLIENT_ID + 1)
59 #define DISP_CLIENT_ID(id)      (ID(id) - FIRST_DISP_CLIENT_ID)
60
61 #define FIRST_CAMERA_CLIENT_ID  ID(VI_W)
62 #define LAST_CAMERA_CLIENT_ID   ID(ISP_WBB)
63 #define NUM_CAMERA_CLIENTS      (LAST_CAMERA_CLIENT_ID - \
64                                 FIRST_CAMERA_CLIENT_ID + \
65                                 1)
66 #define CAMERA_IDX(id)          (ID(id) - FIRST_CAMERA_CLIENT_ID)
67 #define CAMERA_LA_IDX(id)       (id - FIRST_CAMERA_CLIENT_ID)
68 #define AGG_CAMERA_ID(id)       TEGRA_LA_AGG_CAMERA_##id
69
70 #define T12X_MC_LA_MAX_VALUE    255
71
72
73 /* The following enum defines IDs for aggregated camera clients. In some cases
74    we have to deal with groups of camera clients rather than individual
75    clients. */
76 enum agg_camera_client_id {
77         TEGRA_LA_AGG_CAMERA_VE = 0,
78         TEGRA_LA_AGG_CAMERA_VE2,
79         TEGRA_LA_AGG_CAMERA_ISP,
80         TEGRA_LA_AGG_CAMERA_NUM_CLIENTS
81 };
82
83 struct la_client_info {
84         unsigned int fifo_size_in_atoms;
85         unsigned int expiration_in_ns;  /* worst case expiration value */
86         void *reg_addr;
87         unsigned long mask;
88         unsigned long shift;
89         enum tegra_la_id id;
90         char *name;
91         bool scaling_supported;
92         unsigned int init_la;           /* initial la to set for client */
93         unsigned int la_set;
94         unsigned int la_ref_clk_mhz;
95 };
96
97 struct agg_camera_client_info {
98         unsigned int bw_fp;
99         unsigned int frac_fp;
100         unsigned int ptsa_min;
101         unsigned int ptsa_max;
102         bool is_hiso;
103 };
104
105 struct la_scaling_info {
106         unsigned int threshold_low;
107         unsigned int threshold_mid;
108         unsigned int threshold_high;
109         int scaling_ref_count;
110         int actual_la_to_set;
111         int la_set;
112 };
113
114 struct la_scaling_reg_info {
115         enum tegra_la_id id;
116         void *tl_reg_addr;
117         unsigned int tl_mask;
118         unsigned int tl_shift;
119         void *tm_reg_addr;
120         unsigned int tm_mask;
121         unsigned int tm_shift;
122         void *th_reg_addr;
123         unsigned int th_mask;
124         unsigned int th_shift;
125 };
126
127 struct ptsa_info {
128         unsigned int dis_ptsa_rate;
129         unsigned int dis_ptsa_min;
130         unsigned int dis_ptsa_max;
131         unsigned int disb_ptsa_rate;
132         unsigned int disb_ptsa_min;
133         unsigned int disb_ptsa_max;
134         unsigned int ve_ptsa_rate;
135         unsigned int ve_ptsa_min;
136         unsigned int ve_ptsa_max;
137         unsigned int ve2_ptsa_rate;
138         unsigned int ve2_ptsa_min;
139         unsigned int ve2_ptsa_max;
140         unsigned int ring2_ptsa_rate;
141         unsigned int ring2_ptsa_min;
142         unsigned int ring2_ptsa_max;
143         unsigned int bbc_ptsa_rate;
144         unsigned int bbc_ptsa_min;
145         unsigned int bbc_ptsa_max;
146         unsigned int mpcorer_ptsa_rate;
147         unsigned int mpcorer_ptsa_min;
148         unsigned int mpcorer_ptsa_max;
149         unsigned int smmu_ptsa_rate;
150         unsigned int smmu_ptsa_min;
151         unsigned int smmu_ptsa_max;
152         unsigned int ring1_ptsa_rate;
153         unsigned int ring1_ptsa_min;
154         unsigned int ring1_ptsa_max;
155
156         unsigned int dis_extra_snap_level;
157         unsigned int heg_extra_snap_level;
158         unsigned int ptsa_grant_dec;
159         unsigned int bbcll_earb_cfg;
160
161         unsigned int isp_ptsa_rate;
162         unsigned int isp_ptsa_min;
163         unsigned int isp_ptsa_max;
164         unsigned int a9avppc_ptsa_min;
165         unsigned int a9avppc_ptsa_max;
166         unsigned int avp_ptsa_min;
167         unsigned int avp_ptsa_max;
168         unsigned int r0_dis_ptsa_min;
169         unsigned int r0_dis_ptsa_max;
170         unsigned int r0_disb_ptsa_min;
171         unsigned int r0_disb_ptsa_max;
172         unsigned int vd_ptsa_min;
173         unsigned int vd_ptsa_max;
174         unsigned int mse_ptsa_min;
175         unsigned int mse_ptsa_max;
176         unsigned int gk_ptsa_min;
177         unsigned int gk_ptsa_max;
178         unsigned int vicpc_ptsa_min;
179         unsigned int vicpc_ptsa_max;
180         unsigned int apb_ptsa_min;
181         unsigned int apb_ptsa_max;
182         unsigned int pcx_ptsa_min;
183         unsigned int pcx_ptsa_max;
184         unsigned int host_ptsa_min;
185         unsigned int host_ptsa_max;
186         unsigned int ahb_ptsa_min;
187         unsigned int ahb_ptsa_max;
188         unsigned int sax_ptsa_min;
189         unsigned int sax_ptsa_max;
190         unsigned int aud_ptsa_min;
191         unsigned int aud_ptsa_max;
192         unsigned int sd_ptsa_min;
193         unsigned int sd_ptsa_max;
194         unsigned int usbx_ptsa_min;
195         unsigned int usbx_ptsa_max;
196         unsigned int usbd_ptsa_min;
197         unsigned int usbd_ptsa_max;
198         unsigned int ftop_ptsa_min;
199         unsigned int ftop_ptsa_max;
200 };
201
202
203 struct la_chip_specific {
204         int ns_per_tick;
205         int atom_size;
206         int la_max_value;
207         spinlock_t lock;
208         int la_info_array_size;
209         struct la_client_info *la_info_array;
210         unsigned short id_to_index[ID(MAX_ID) + 1];
211         unsigned int disp_bw_array[NUM_DISP_CLIENTS];
212         struct disp_client disp_clients[NUM_DISP_CLIENTS];
213         unsigned int bbc_bw_array[ID(BBCLLR) - ID(BBCR) + 1];
214         unsigned int camera_bw_array[NUM_CAMERA_CLIENTS];
215         struct agg_camera_client_info
216                         agg_camera_array[TEGRA_LA_AGG_CAMERA_NUM_CLIENTS];
217         struct la_scaling_info scaling_info[ID(MAX_ID)];
218         int la_scaling_enable_count;
219         struct dentry *latency_debug_dir;
220         struct ptsa_info ptsa_info;
221         bool disable_la;
222         bool disable_ptsa;
223         struct la_to_dc_params la_params;
224         bool disable_disp_ptsa;
225         bool disable_bbc_ptsa;
226
227         void (*init_ptsa)(void);
228         void (*update_display_ptsa_rate)(unsigned int *disp_bw_array);
229         int (*update_camera_ptsa_rate)(enum tegra_la_id id,
230                                         unsigned int bw_mbps,
231                                         int is_hiso);
232         int (*set_disp_la)(enum tegra_la_id id,
233                                 unsigned int bw_mbps,
234                                 struct dc_to_la_params disp_params);
235         int (*set_la)(enum tegra_la_id id, unsigned int bw_mbps);
236         int (*enable_la_scaling)(enum tegra_la_id id,
237                                 unsigned int threshold_low,
238                                 unsigned int threshold_mid,
239                                 unsigned int threshold_high);
240         void (*disable_la_scaling)(enum tegra_la_id id);
241         int (*suspend)(void);
242         void (*resume)(void);
243 };
244
245 void tegra_la_get_t3_specific(struct la_chip_specific *cs);
246 void tegra_la_get_t14x_specific(struct la_chip_specific *cs);
247 void tegra_la_get_t11x_specific(struct la_chip_specific *cs);
248 void tegra_la_get_t12x_specific(struct la_chip_specific *cs);
249
250 #endif /* _MACH_TEGRA_LA_PRIV_H_ */