ARM: tegra12: set CPU rate to 2.2GHz for sku 0x87
[linux-3.10.git] / arch / arm / mach-tegra / tegra11x_la.c
1 /*
2  * arch/arm/mach-tegra/tegra11x_la.c
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 #include <linux/types.h>
18 #include <linux/kernel.h>
19 #include <linux/err.h>
20 #include <linux/stringify.h>
21 #include <linux/clk.h>
22 #include <linux/clk/tegra.h>
23 #include <linux/tegra-soc.h>
24 #include <asm/io.h>
25 #include <mach/latency_allowance.h>
26
27 #include "iomap.h"
28 #include "la_priv.h"
29
30 #define T11X_MC_LA_AVPC_ARM7_0          0x2e4
31 #define T11X_MC_LA_DC_0                 0x2e8
32 #define T11X_MC_LA_DC_1                 0x2ec
33 #define T11X_MC_LA_DC_2                 0x2f0
34 #define T11X_MC_LA_DCB_0                0x2f4
35 #define T11X_MC_LA_DCB_1                0x2f8
36 #define T11X_MC_LA_DCB_2                0x2fc
37 #define T11X_MC_LA_EPP_0                0x300
38 #define T11X_MC_LA_EPP_1                0x304
39 #define T11X_MC_LA_G2_0                 0x308
40 #define T11X_MC_LA_G2_1                 0x30c
41 #define T11X_MC_LA_HC_0                 0x310
42 #define T11X_MC_LA_HC_1                 0x314
43 #define T11X_MC_LA_HDA_0                0x318
44 #define T11X_MC_LA_ISP_0                0x31C
45 #define T11X_MC_LA_MPCORE_0             0x320
46 #define T11X_MC_LA_MPCORELP_0           0x324
47 #define T11X_MC_LA_MSENC_0              0x328
48 #define T11X_MC_LA_NV_0                 0x334
49 #define T11X_MC_LA_NV_1                 0x338
50 #define T11X_MC_LA_NV2_0                0x33c
51 #define T11X_MC_LA_NV2_1                0x340
52 #define T11X_MC_LA_PPCS_0               0x344
53 #define T11X_MC_LA_PPCS_1               0x348
54 #define T11X_MC_LA_PTC_0                0x34c
55
56 #define T11X_MC_LA_VDE_0                0x354
57 #define T11X_MC_LA_VDE_1                0x358
58 #define T11X_MC_LA_VDE_2                0x35c
59 #define T11X_MC_LA_VDE_3                0x360
60 #define T11X_MC_LA_VI_0                 0x364
61 #define T11X_MC_LA_VI_1                 0x368
62 #define T11X_MC_LA_VI_2                 0x36c
63
64 #define T11X_MC_LA_XUSB_0               0x37c /* T11x specific*/
65 #define T11X_MC_LA_XUSB_1               0x380 /* T11x specific*/
66 #define T11X_MC_LA_NV_2                 0x384 /* T11x specific*/
67 #define T11X_MC_LA_NV_3                 0x388 /* T11x specific*/
68
69 #define T11X_MC_LA_EMUCIF_0             0x38c
70 #define T11X_MC_LA_TSEC_0               0x390
71
72 #define T11X_MC_DIS_PTSA_RATE_0                 0x41c
73 #define T11X_MC_DIS_PTSA_MIN_0                  0x420
74 #define T11X_MC_DIS_PTSA_MAX_0                  0x424
75 #define T11X_MC_DISB_PTSA_RATE_0                0x428
76 #define T11X_MC_DISB_PTSA_MIN_0                 0x42c
77 #define T11X_MC_DISB_PTSA_MAX_0                 0x430
78 #define T11X_MC_VE_PTSA_RATE_0                  0x434
79 #define T11X_MC_VE_PTSA_MIN_0                   0x438
80 #define T11X_MC_VE_PTSA_MAX_0                   0x43c
81 #define T11X_MC_RING2_PTSA_RATE_0               0x440
82 #define T11X_MC_RING2_PTSA_MIN_0                0x444
83 #define T11X_MC_RING2_PTSA_MAX_0                0x448
84 #define T11X_MC_MLL_MPCORER_PTSA_RATE_0         0x44c
85 #define T11X_MC_MLL_MPCORER_PTSA_MIN_0          0x450
86 #define T11X_MC_MLL_MPCORER_PTSA_MAX_0          0x454
87 #define T11X_MC_SMMU_SMMU_PTSA_RATE_0           0x458
88 #define T11X_MC_SMMU_SMMU_PTSA_MIN_0            0x45c
89 #define T11X_MC_SMMU_SMMU_PTSA_MAX_0            0x460
90 #define T11X_MC_R0_DIS_PTSA_RATE_0              0x464
91 #define T11X_MC_R0_DIS_PTSA_MIN_0               0x468
92 #define T11X_MC_R0_DIS_PTSA_MAX_0               0x46c
93 #define T11X_MC_R0_DISB_PTSA_RATE_0             0x470
94 #define T11X_MC_R0_DISB_PTSA_MIN_0              0x474
95 #define T11X_MC_R0_DISB_PTSA_MAX_0              0x478
96 #define T11X_MC_RING1_PTSA_RATE_0               0x47c
97 #define T11X_MC_RING1_PTSA_MIN_0                0x480
98 #define T11X_MC_RING1_PTSA_MAX_0                0x484
99
100 #define T11X_MC_DIS_EXTRA_SNAP_LEVELS_0         0x2ac
101 #define T11X_MC_HEG_EXTRA_SNAP_LEVELS_0         0x2b0
102 #define T11X_MC_EMEM_ARB_MISC0_0                0x0d8
103 #define T11X_MC_PTSA_GRANT_DECREMENT_0          0x960
104
105 #define T11X_BASE_EMC_FREQ_MHZ          500
106 #define T11X_MAX_CAMERA_BW_MHZ          528
107
108 /* maximum valid value for latency allowance */
109 #define T11X_MC_LA_MAX_VALUE            255
110
111 #define T11X_MC_RA(r) \
112         (IO_ADDRESS(TEGRA_MC_BASE) + (T11X_MC_##r))
113 #define T11X_RA(r) \
114         (IO_ADDRESS(TEGRA_MC_BASE) + (T11X_MC_LA_##r))
115
116 #define T11X_LA(f, e, a, r, i, ss, la) \
117 { \
118         .fifo_size_in_atoms = f, \
119         .expiration_in_ns = e, \
120         .reg_addr = T11X_RA(a), \
121         .mask = MASK(r), \
122         .shift = SHIFT(r), \
123         .id = ID(i), \
124         .name = __stringify(i), \
125         .scaling_supported = ss, \
126         .init_la = la, \
127 }
128
129 /*
130  * The consensus for getting the fifo_size_in_atoms is:
131  * 1.If REORDER_DEPTH exists, use it(default is overridden).
132  * 2.Else if (write_client) use RFIFO_DEPTH.
133  * 3.Else (read client) use RDFIFO_DEPTH.
134  * Multiply the value by 2 for dual channel.
135  * Multiply the value by 2 for wide clients.
136  * A client is wide, if CMW is larger than MW.
137  * Refer to project.h file.
138  */
139 struct la_client_info t11x_la_info_array[] = {
140         T11X_LA(3,      150,    AVPC_ARM7_0, 7 : 0,     AVPC_ARM7R,     false,  0),
141         T11X_LA(3,      150,    AVPC_ARM7_0, 23 : 16,   AVPC_ARM7W,     false,  0),
142         T11X_LA(256,    1050,   DC_0,   7 : 0,          DISPLAY_0A,     true,   0),
143         T11X_LA(256,    1050,   DC_0,   23 : 16,        DISPLAY_0B,     true,   0),
144         T11X_LA(256,    1050,   DC_1,   7 : 0,          DISPLAY_0C,     true,   0),
145         T11X_LA(96,     1050,   DC_2,   7 : 0,          DISPLAY_HC,     false,  0),
146         T11X_LA(256,    1050,   DCB_0,  7 : 0,          DISPLAY_0AB,    true,   0),
147         T11X_LA(256,    1050,   DCB_0,  23 : 16,        DISPLAY_0BB,    true,   0),
148         T11X_LA(256,    1050,   DCB_1,  7 : 0,          DISPLAY_0CB,    true,   0),
149         T11X_LA(96,     1050,   DCB_2,  7 : 0,          DISPLAY_HCB,    false,  0),
150         T11X_LA(16,     150,    EPP_0,  7 : 0,          EPPUP,          false,  0),
151         T11X_LA(64,     150,    EPP_0,  23 : 16,        EPPU,           false,  0),
152         T11X_LA(64,     150,    EPP_1,  7 : 0,          EPPV,           false,  0),
153         T11X_LA(64,     150,    EPP_1,  23 : 16,        EPPY,           false,  0),
154         T11X_LA(128,    150,    G2_0,   7 : 0,          G2PR,           false,  0),
155         T11X_LA(128,    150,    G2_0,   23 : 16,        G2SR,           false,  0),
156         T11X_LA(96,     150,    G2_1,   7 : 0,          G2DR,           false,  0),
157         T11X_LA(256,    150,    G2_1,   23 : 16,        G2DW,           false,  0),
158         T11X_LA(32,     150,    HC_0,   7 : 0,          HOST1X_DMAR,    false,  0),
159         T11X_LA(16,     150,    HC_0,   23 : 16,        HOST1XR,        false,  0),
160         T11X_LA(64,     150,    HC_1,   7 : 0,          HOST1XW,        false,  0),
161         T11X_LA(32,     150,    HDA_0,  7 : 0,          HDAR,           false,  0),
162         T11X_LA(32,     150,    HDA_0,  23 : 16,        HDAW,           false,  0),
163         T11X_LA(128,    150,    ISP_0,  7 : 0,          ISPW,           false,  0),
164         T11X_LA(96,     150,    MPCORE_0,   7 : 0,      MPCORER,        false,  0),
165         T11X_LA(128,    150,    MPCORE_0,   23 : 16,    MPCOREW,        false,  0),
166         T11X_LA(96,     150,    MPCORELP_0, 7 : 0,      MPCORE_LPR,     false,  0),
167         T11X_LA(128,    150,    MPCORELP_0, 23 : 16,    MPCORE_LPW,     false,  0),
168         T11X_LA(128,    150,    NV_0,   7 : 0,          FDCDRD,         false,  0),
169         T11X_LA(256,    150,    NV_0,   23 : 16,        IDXSRD,         false,  0),
170         T11X_LA(432,    150,    NV_1,   7 : 0,          TEXL2SRD,       false,  0),
171         T11X_LA(128,    150,    NV_1,   23 : 16,        FDCDWR,         false,  0),
172         T11X_LA(128,    150,    NV2_0,  7 : 0,          FDCDRD2,        false,  0),
173         T11X_LA(128,    150,    NV2_1,  7 : 0,          FDCDWR2,        false,  0),
174         T11X_LA(8,      150,    PPCS_0, 7 : 0,          PPCS_AHBDMAR,   false,  0),
175         T11X_LA(80,     150,    PPCS_0, 23 : 16,        PPCS_AHBSLVR,   false,  0),
176         T11X_LA(16,     150,    PPCS_1, 7 : 0,          PPCS_AHBDMAW,   false,  0),
177         T11X_LA(80,     150,    PPCS_1, 23 : 16,        PPCS_AHBSLVW,   false,  0),
178         T11X_LA(40,     150,    PTC_0,  7 : 0,          PTCR,           false,  0),
179         T11X_LA(16,     150,    VDE_0,  7 : 0,          VDE_BSEVR,      false,  131),
180         T11X_LA(8,      150,    VDE_0,  23 : 16,        VDE_MBER,       false,  131),
181         T11X_LA(64,     150,    VDE_1,  7 : 0,          VDE_MCER,       false,  50),
182         T11X_LA(32,     150,    VDE_1,  23 : 16,        VDE_TPER,       false,  123),
183         T11X_LA(8,      150,    VDE_2,  7 : 0,          VDE_BSEVW,      false,  131),
184         T11X_LA(32,     150,    VDE_2,  23 : 16,        VDE_DBGW,       false,  131),
185         T11X_LA(16,     150,    VDE_3,  7 : 0,          VDE_MBEW,       false,  70),
186         T11X_LA(32,     150,    VDE_3,  23 : 16,        VDE_TPMW,       false,  76),
187         T11X_LA(128,    1050,   VI_0,   7 : 0,          VI_WSB,         true,   0),
188         T11X_LA(128,    1050,   VI_1,   7 : 0,          VI_WU,          true,   0),
189         T11X_LA(128,    1050,   VI_1,   23 : 16,        VI_WV,          true,   0),
190         T11X_LA(128,    1050,   VI_2,   7 : 0,          VI_WY,          true,   0),
191
192         T11X_LA(128,    150,    MSENC_0,    7 : 0,      MSENCSRD,       false,  128),
193         T11X_LA(32,     150,    MSENC_0,    23 : 16,    MSENCSWR,       false,  41),
194         T11X_LA(160,    150,    XUSB_0,     7 : 0,      XUSB_HOSTR,     false,  0),
195         T11X_LA(160,    150,    XUSB_0,     23 : 16,    XUSB_HOSTW,     false,  0),
196         T11X_LA(160,    150,    XUSB_1,     7 : 0,      XUSB_DEVR,      false,  0),
197         T11X_LA(160,    150,    XUSB_1,     23 : 16,    XUSB_DEVW,      false,  0),
198         T11X_LA(128,    150,    NV_2,       7 : 0,      FDCDRD3,        false,  0),
199         T11X_LA(128,    150,    NV_2,       23 : 16,    FDCDRD4,        false,  0),
200         T11X_LA(128,    150,    NV_3,       7 : 0,      FDCDWR3,        false,  0),
201         T11X_LA(128,    150,    NV_3,       23 : 16,    FDCDWR4,        false,  0),
202         T11X_LA(28,     150,    EMUCIF_0,   7 : 0,      EMUCIFR,        false,  0),
203         T11X_LA(48,     150,    EMUCIF_0,   23 : 16,    EMUCIFW,        false,  0),
204         T11X_LA(32,     150,    TSEC_0,     7 : 0,      TSECSRD,        false,  0),
205         T11X_LA(32,     150,    TSEC_0,     23 : 16,    TSECSWR,        false,  0),
206
207 /* end of list. */
208         T11X_LA(0,      0,      TSEC_0,     0 : 0,      MAX_ID,         false,  0)
209 };
210
211 static unsigned int t11x_get_ptsa_rate(unsigned int bw)
212 {
213         /* 16 = 2 channels * 2 ddr * 4 bytes */
214         unsigned int base_memory_bw = 16 * T11X_BASE_EMC_FREQ_MHZ;
215         unsigned int rate = 281 * bw / base_memory_bw;
216         if (rate > 255)
217                 rate = 255;
218         return rate;
219 }
220
221 static void t11x_init_ptsa(void)
222 {
223         struct clk *emc_clk __attribute__((unused));
224         unsigned long emc_freq __attribute__((unused));
225         unsigned long same_freq __attribute__((unused));
226         unsigned long grant_dec __attribute__((unused));
227         unsigned long ring1_rate __attribute__((unused));
228
229         emc_clk = clk_get(NULL, "emc");
230         la_debug("**** emc clk_rate=%luMHz", clk_get_rate(emc_clk)/1000000);
231
232         emc_freq = clk_get_rate(emc_clk);
233         emc_freq /= 1000000;
234         /* Compute initial value for grant dec */
235         same_freq = readl(T11X_MC_RA(EMEM_ARB_MISC0_0));
236         same_freq = same_freq >> 27 & 1;
237         grant_dec = 256 * (same_freq ? 2 : 1) * emc_freq;
238         if (grant_dec > 511)
239                 grant_dec = 511;
240         writel(grant_dec, T11X_MC_RA(PTSA_GRANT_DECREMENT_0));
241
242         writel(0x3d, T11X_MC_RA(DIS_PTSA_MIN_0));
243         writel(0x14, T11X_MC_RA(DIS_PTSA_MAX_0));
244
245         writel(0x3d, T11X_MC_RA(DISB_PTSA_MIN_0));
246         writel(0x14, T11X_MC_RA(DISB_PTSA_MAX_0));
247
248         writel(t11x_get_ptsa_rate(T11X_MAX_CAMERA_BW_MHZ),
249                 T11X_MC_RA(VE_PTSA_RATE_0));
250         writel(0x3d, T11X_MC_RA(VE_PTSA_MIN_0));
251         writel(0x14, T11X_MC_RA(VE_PTSA_MAX_0));
252
253         writel(0x01, T11X_MC_RA(RING2_PTSA_RATE_0));
254         writel(0x3f, T11X_MC_RA(RING2_PTSA_MIN_0));
255         writel(0x05, T11X_MC_RA(RING2_PTSA_MAX_0));
256
257         writel(38 * emc_freq / T11X_BASE_EMC_FREQ_MHZ,
258                 T11X_MC_RA(MLL_MPCORER_PTSA_RATE_0));
259         writel(0x3f, T11X_MC_RA(MLL_MPCORER_PTSA_MIN_0));
260         writel(0x05, T11X_MC_RA(MLL_MPCORER_PTSA_MAX_0));
261
262         writel(0x01, T11X_MC_RA(SMMU_SMMU_PTSA_RATE_0));
263         writel(0x01, T11X_MC_RA(SMMU_SMMU_PTSA_MIN_0));
264         writel(0x01, T11X_MC_RA(SMMU_SMMU_PTSA_MAX_0));
265
266         ring1_rate = readl(T11X_MC_RA(DIS_PTSA_RATE_0)) +
267                      readl(T11X_MC_RA(DISB_PTSA_RATE_0));
268 #if defined(CONFIG_TEGRA_ERRATA_977223)
269         ring1_rate /= 2;
270 #endif
271         ring1_rate += readl(T11X_MC_RA(VE_PTSA_RATE_0)) +
272                       readl(T11X_MC_RA(RING2_PTSA_RATE_0));
273         writel(ring1_rate, T11X_MC_RA(RING1_PTSA_RATE_0));
274         writel(0x36, T11X_MC_RA(RING1_PTSA_MIN_0));
275         writel(0x1f, T11X_MC_RA(RING1_PTSA_MAX_0));
276
277         writel(0x00, T11X_MC_RA(DIS_EXTRA_SNAP_LEVELS_0));
278         writel(0x03, T11X_MC_RA(HEG_EXTRA_SNAP_LEVELS_0));
279 }
280
281 static void t11x_update_display_ptsa_rate(unsigned int *disp_bw_array)
282 {
283         unsigned int num_active = (disp_bw_array[0] != 0) +
284                                   (disp_bw_array[1] != 0) +
285                                   (disp_bw_array[2] != 0);
286         unsigned int num_activeb = (disp_bw_array[5] != 0) +
287                                    (disp_bw_array[6] != 0) +
288                                    (disp_bw_array[7] != 0);
289         unsigned int max_bw = disp_bw_array[0];
290         unsigned int max_bwb = disp_bw_array[5];
291         unsigned int rate_dis;
292         unsigned int rate_disb;
293         unsigned long ring1_rate;
294
295         max_bw = max(disp_bw_array[0], disp_bw_array[1]);
296         max_bw = max(max_bw, disp_bw_array[2]);
297
298         max_bwb = max(disp_bw_array[5], disp_bw_array[6]);
299         max_bwb = max(max_bwb, disp_bw_array[7]);
300
301         rate_dis = t11x_get_ptsa_rate(num_active * max_bw);
302         rate_disb = t11x_get_ptsa_rate(num_activeb * max_bwb);
303
304         writel(rate_dis, T11X_MC_RA(DIS_PTSA_RATE_0));
305         writel(rate_disb, T11X_MC_RA(DISB_PTSA_RATE_0));
306
307         ring1_rate = rate_dis + rate_disb;
308 #if defined(CONFIG_TEGRA_ERRATA_977223)
309         ring1_rate /= 2;
310 #endif
311         ring1_rate += readl(T11X_MC_RA(VE_PTSA_RATE_0)) +
312                       readl(T11X_MC_RA(RING2_PTSA_RATE_0));
313         writel(ring1_rate, T11X_MC_RA(RING1_PTSA_RATE_0));
314 }
315
316 void tegra_la_get_t11x_specific(struct la_chip_specific *cs)
317 {
318         cs->ns_per_tick = 30;
319         cs->atom_size = 16;
320         cs->la_max_value = T11X_MC_LA_MAX_VALUE;
321         cs->la_info_array = t11x_la_info_array;
322         cs->la_info_array_size = ARRAY_SIZE(t11x_la_info_array);
323         cs->init_ptsa = t11x_init_ptsa;
324         cs->update_display_ptsa_rate = t11x_update_display_ptsa_rate;
325 }