ARM: tegra12: set CPU rate to 2.2GHz for sku 0x87
[linux-3.10.git] / arch / arm / mach-tegra / tegra14x_la.c
1 /*
2  * arch/arm/mach-tegra/tegra14x_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 T14X_MC_LA_AVPC_ARM7_0  0x2e4
31 #define T14X_MC_LA_DC_0         0x2e8
32 #define T14X_MC_LA_DC_1         0x2ec
33 #define T14X_MC_LA_DC_2         0x2f0
34 #define T14X_MC_LA_DCB_0                0x2f4
35 #define T14X_MC_LA_DCB_1                0x2f8
36 #define T14X_MC_LA_DCB_2                0x2fc
37 #define T14X_MC_LA_EPP_0                0x300
38 #define T14X_MC_LA_EPP_1                0x304
39 #define T14X_MC_LA_G2_0         0x308
40 #define T14X_MC_LA_G2_1         0x30c
41 #define T14X_MC_LA_HC_0         0x310
42 #define T14X_MC_LA_HC_1         0x314
43 #define T14X_MC_LA_HDA_0                0x318
44 #define T14X_MC_LA_ISP_0                0x31C
45 #define T14X_MC_LA_MPCORE_0             0x320
46 #define T14X_MC_LA_MPCORELP_0   0x324
47 #define T14X_MC_LA_MSENC_0              0x328
48 #define T14X_MC_LA_NV_0         0x334
49 #define T14X_MC_LA_NV_1         0x338
50 #define T14X_MC_LA_NV2_0                0x33c
51 #define T14X_MC_LA_NV2_1                0x340
52 #define T14X_MC_LA_PPCS_0               0x344
53 #define T14X_MC_LA_PPCS_1               0x348
54 #define T14X_MC_LA_PTC_0                0x34c
55
56 #define T14X_MC_LA_VDE_0                0x354
57 #define T14X_MC_LA_VDE_1                0x358
58 #define T14X_MC_LA_VDE_2                0x35c
59 #define T14X_MC_LA_VDE_3                0x360
60 #define T14X_MC_LA_VI_0         0x364
61 #define T14X_MC_LA_VI_1         0x368
62 #define T14X_MC_LA_VI_2         0x36c
63 #define T14X_MC_LA_ISP2_0               0x370 /* T14x specific*/
64 #define T14X_MC_LA_ISP2_1               0x374 /* T14x specific*/
65
66 #define T14X_MC_LA_EMUCIF_0             0x38c
67 #define T14X_MC_LA_TSEC_0               0x390
68
69 #define T14X_MC_LA_BBMCI_0              0x394 /* T14x specific*/
70 #define T14X_MC_LA_BBMCILL_0            0x398 /* T14x specific*/
71 #define T14X_MC_LA_DC_3         0x39c /* T14x specific*/
72
73 #define T14X_MC_DIS_PTSA_RATE_0                 0x41c
74 #define T14X_MC_DIS_PTSA_MIN_0                  0x420
75 #define T14X_MC_DIS_PTSA_MAX_0                  0x424
76 #define T14X_MC_DISB_PTSA_RATE_0                0x428
77 #define T14X_MC_DISB_PTSA_MIN_0                 0x42c
78 #define T14X_MC_DISB_PTSA_MAX_0                 0x430
79 #define T14X_MC_VE_PTSA_RATE_0                  0x434
80 #define T14X_MC_VE_PTSA_MIN_0                   0x438
81 #define T14X_MC_VE_PTSA_MAX_0                   0x43c
82 #define T14X_MC_RING2_PTSA_RATE_0               0x440
83 #define T14X_MC_RING2_PTSA_MIN_0                0x444
84 #define T14X_MC_RING2_PTSA_MAX_0                0x448
85 #define T14X_MC_MLL_MPCORER_PTSA_RATE_0         0x44c
86 #define T14X_MC_MLL_MPCORER_PTSA_MIN_0          0x450
87 #define T14X_MC_MLL_MPCORER_PTSA_MAX_0          0x454
88 #define T14X_MC_SMMU_SMMU_PTSA_RATE_0           0x458
89 #define T14X_MC_SMMU_SMMU_PTSA_MIN_0            0x45c
90 #define T14X_MC_SMMU_SMMU_PTSA_MAX_0            0x460
91 #define T14X_MC_R0_DIS_PTSA_RATE_0              0x464
92 #define T14X_MC_R0_DIS_PTSA_MIN_0               0x468
93 #define T14X_MC_R0_DIS_PTSA_MAX_0               0x46c
94 #define T14X_MC_R0_DISB_PTSA_RATE_0             0x470
95 #define T14X_MC_R0_DISB_PTSA_MIN_0              0x474
96 #define T14X_MC_R0_DISB_PTSA_MAX_0              0x478
97 #define T14X_MC_RING1_PTSA_RATE_0               0x47c
98 #define T14X_MC_RING1_PTSA_MIN_0                0x480
99 #define T14X_MC_RING1_PTSA_MAX_0                0x484
100
101 #define T14X_MC_BBC_PTSA_RATE_0                 0x4d0
102 #define T14X_MC_BBC_PTSA_MIN_0                  0x4d4
103 #define T14X_MC_BBC_PTSA_MAX_0                  0x4d8
104
105 #define T14X_MC_SCALED_LA_DISPLAY0A_0           0x690
106 #define T14X_MC_SCALED_LA_DISPLAY0B_0           0x698
107 #define T14X_MC_SCALED_LA_DISPLAY0BB_0          0x69c
108 #define T14X_MC_SCALED_LA_DISPLAY0C_0           0x6a0
109
110
111 #define T14X_MC_DIS_EXTRA_SNAP_LEVELS_0         0x2ac
112 #define T14X_MC_HEG_EXTRA_SNAP_LEVELS_0         0x2b0
113 #define T14X_MC_EMEM_ARB_MISC0_0                0x0d8
114 #define T14X_MC_TIMING_CONTROL_0                0xfc
115 #define T14X_MC_PTSA_GRANT_DECREMENT_0          0x960
116
117 #define T14X_MC_BBCLL_EARB_CFG_0                0x080
118
119 #define T14X_BASE_EMC_FREQ_MHZ          800
120 #define T14X_MAX_CAMERA_BW_MHZ          528
121 #define T14X_MAX_BBCDMA_BW_MHZ          1200
122 #define T14X_MAX_BBCLL_BW_MHZ           640
123
124 /* maximum valid value for latency allowance */
125 #define T14X_MC_LA_MAX_VALUE            255
126
127 #define T14X_MC_RA(r) \
128         (IO_ADDRESS(TEGRA_MC_BASE) + (T14X_MC_##r))
129 #define T14X_RA(r) \
130         (IO_ADDRESS(TEGRA_MC_BASE) + (T14X_MC_LA_##r))
131
132 #define T14X_LA(f, e, a, r, i, ss, la) \
133 { \
134         .fifo_size_in_atoms = f, \
135         .expiration_in_ns = e, \
136         .reg_addr = T14X_RA(a), \
137         .mask = MASK(r), \
138         .shift = SHIFT(r), \
139         .id = ID(i), \
140         .name = __stringify(i), \
141         .scaling_supported = ss, \
142         .init_la = la, \
143 }
144
145 /*
146  * The consensus for getting the fifo_size_in_atoms is:
147  * 1.If REORDER_DEPTH exists, use it(default is overridden).
148  * 2.Else if (write_client) use RFIFO_DEPTH.
149  * 3.Else (read client) use RDFIFO_DEPTH.
150  * Multiply the value by 2 for dual channel.
151  * Multiply the value by 2 for wide clients.
152  * A client is wide, if CMW is larger than MW.
153  * Refer to project.h file.
154  */
155 struct la_client_info t14x_la_info_array[] = {
156         T14X_LA(4,      150,    AVPC_ARM7_0, 7 : 0,     AVPC_ARM7R,     false,  0),
157         T14X_LA(8,      150,    AVPC_ARM7_0, 23 : 16,   AVPC_ARM7W,     false,  0),
158         T14X_LA(128,    1050,   DC_0,   7 : 0,          DISPLAY_0A,     true,   0),
159         T14X_LA(128,    1050,   DC_0,   23 : 16,        DISPLAY_0B,     true,   0),
160         T14X_LA(128,    1050,   DC_1,   7 : 0,          DISPLAY_0C,     true,   0),
161         T14X_LA(192,    1050,   DC_2,   7 : 0,          DISPLAY_HC,     false,  0),
162         T14X_LA(128,    1920,   DCB_0,  7 : 0,          DISPLAY_0AB,    true,   0),
163         T14X_LA(128,    1050,   DCB_0,  23 : 16,        DISPLAY_0BB,    true,   0),
164         T14X_LA(128,    1920,   DCB_1,  7 : 0,          DISPLAY_0CB,    true,   0),
165         T14X_LA(192,    1050,   DCB_2,  7 : 0,          DISPLAY_HCB,    false,  0),
166         T14X_LA(192,    1920,   DC_2,   23 : 16,        DISPLAY_T,      false,  0),
167         T14X_LA(192,    1920,   DC_3,   7 : 0,          DISPLAYD,       false,  0),
168         T14X_LA(32,     150,    EPP_0,  7 : 0,          EPPUP,          false,  0),
169         T14X_LA(32,     150,    EPP_0,  23 : 16,        EPPU,           false,  0),
170         T14X_LA(32,     150,    EPP_1,  7 : 0,          EPPV,           false,  0),
171         T14X_LA(32,     150,    EPP_1,  23 : 16,        EPPY,           false,  0),
172         T14X_LA(128,    150,    G2_0,   7 : 0,          G2PR,           false,  35),
173         T14X_LA(128,    150,    G2_0,   23 : 16,        G2SR,           false,  21),
174         T14X_LA(72,     150,    G2_1,   7 : 0,          G2DR,           false,  24),
175         T14X_LA(128,    150,    G2_1,   23 : 16,        G2DW,           false,  9),
176         T14X_LA(16,     150,    HC_0,   7 : 0,          HOST1X_DMAR,    false,  0),
177         T14X_LA(8,      150,    HC_0,   23 : 16,        HOST1XR,        false,  0),
178         T14X_LA(32,     150,    HC_1,   7 : 0,          HOST1XW,        false,  0),
179         T14X_LA(64,     150,    HDA_0,  7 : 0,          HDAR,           false,  0),
180         T14X_LA(64,     150,    HDA_0,  23 : 16,        HDAW,           false,  0),
181         T14X_LA(64,     150,    ISP_0,  7 : 0,          ISPW,           false,  0),
182         T14X_LA(40,     150,    MPCORE_0,   7 : 0,      MPCORER,        false,  0),
183         T14X_LA(42,     150,    MPCORE_0,   23 : 16,    MPCOREW,        false,  0),
184         T14X_LA(24,     150,    MPCORELP_0, 7 : 0,      MPCORE_LPR,     false,  0),
185         T14X_LA(24,     150,    MPCORELP_0, 23 : 16,    MPCORE_LPW,     false,  0),
186         T14X_LA(160,    150,    NV_0,   7 : 0,          FDCDRD,         false,  30),
187         T14X_LA(256,    150,    NV_0,   23 : 16,        IDXSRD,         false,  23),
188         T14X_LA(256,    150,    NV_1,   7 : 0,          TEXL2SRD,       false,  23),
189         T14X_LA(128,    150,    NV_1,   23 : 16,        FDCDWR,         false,  23),
190         T14X_LA(160,    150,    NV2_0,  7 : 0,          FDCDRD2,        false,  30),
191         T14X_LA(128,    150,    NV2_1,  7 : 0,          FDCDWR2,        false,  23),
192         T14X_LA(4,      150,    PPCS_0, 7 : 0,          PPCS_AHBDMAR,   false,  0),
193         T14X_LA(29,     150,    PPCS_0, 23 : 16,        PPCS_AHBSLVR,   false,  0),
194         T14X_LA(8,      150,    PPCS_1, 7 : 0,          PPCS_AHBDMAW,   false,  0),
195         T14X_LA(8,      150,    PPCS_1, 23 : 16,        PPCS_AHBSLVW,   false,  0),
196         T14X_LA(20,     150,    PTC_0,  7 : 0,          PTCR,           false,  0),
197         T14X_LA(8,      150,    VDE_0,  7 : 0,          VDE_BSEVR,      false,  28),
198         T14X_LA(9,      150,    VDE_0,  23 : 16,        VDE_MBER,       false,  59),
199         T14X_LA(64,     150,    VDE_1,  7 : 0,          VDE_MCER,       false,  27),
200         T14X_LA(32,     150,    VDE_1,  23 : 16,        VDE_TPER,       false,  110),
201         T14X_LA(4,      150,    VDE_2,  7 : 0,          VDE_BSEVW,      false,  255),
202         T14X_LA(4,      150,    VDE_2,  23 : 16,        VDE_DBGW,       false,  255),
203         T14X_LA(8,      150,    VDE_3,  7 : 0,          VDE_MBEW,       false,  132),
204         T14X_LA(32,     150,    VDE_3,  23 : 16,        VDE_TPMW,       false,  38),
205         T14X_LA(200,    1050,   VI_0,   7 : 0,          VI_WSB,         true,   0),
206         T14X_LA(200,    1050,   VI_1,   7 : 0,          VI_WU,          true,   0),
207         T14X_LA(200,    1050,   VI_1,   23 : 16,        VI_WV,          true,   0),
208         T14X_LA(200,    1050,   VI_2,   7 : 0,          VI_WY,          true,   0),
209
210         T14X_LA(64,     150,    MSENC_0,7 : 0,          MSENCSRD,       false,  50),
211         T14X_LA(16,     150,    MSENC_0,23 : 16,        MSENCSWR,       false,  37),
212         T14X_LA(14,     150,    EMUCIF_0,7 : 0,         EMUCIFR,        false,  0),
213         T14X_LA(24,     150,    EMUCIF_0,23 : 16,       EMUCIFW,        false,  0),
214         T14X_LA(32,     150,    TSEC_0, 7 : 0,          TSECSRD,        false,  0),
215         T14X_LA(32,     150,    TSEC_0, 23 : 16,        TSECSWR,        false,  0),
216
217         T14X_LA(125,    150,    VI_0,   23 : 16,        VI_W,           false,  0),
218         T14X_LA(75,     150,    ISP2_0, 7 : 0,          ISP_RA,         false,  0),
219         T14X_LA(150,    150,    ISP2_1, 7 : 0,          ISP_WA,         false,  0),
220         T14X_LA(64,     150,    ISP2_1, 23 : 16,        ISP_WB,         false,  0),
221         T14X_LA(32,     150,    BBMCI_0,7 : 0,          BBCR,           false,  8),
222         T14X_LA(32,     150,    BBMCI_0,23 : 16,        BBCW,           false,  8),
223         T14X_LA(16,     150,    BBMCILL_0,7 : 0,        BBCLLR,         false,  1),
224
225 /* end of list. */
226         T14X_LA(0,      0,      DC_3,   0 : 0,          MAX_ID,         false,  0)
227 };
228
229 static struct la_chip_specific *cs;
230
231 static unsigned int t14x_get_ptsa_rate(unsigned int bw)
232 {
233         // 8 = (1 channels) * (2 ddr) * (4 bytes)
234         // T148DIFF - T114 code was wrong - hopefully this is right for T148
235         unsigned base_memory_bw = 8 * T14X_BASE_EMC_FREQ_MHZ;
236         // 281 = 256 * 1.1 (1.1 is the extra margin for ISO clients)
237         unsigned rate = 281 * bw / base_memory_bw;
238         if (rate > 255)
239                 rate = 255;
240         return rate;
241 }
242
243 static void program_ptsa(void)
244 {
245         struct ptsa_info *p = &cs->ptsa_info;
246
247         writel(p->ptsa_grant_dec, T14X_MC_RA(PTSA_GRANT_DECREMENT_0));
248         writel(1, T14X_MC_RA(TIMING_CONTROL_0));
249
250         writel(p->dis_ptsa_rate, T14X_MC_RA(DIS_PTSA_RATE_0));
251         writel(p->dis_ptsa_min, T14X_MC_RA(DIS_PTSA_MIN_0));
252         writel(p->dis_ptsa_max, T14X_MC_RA(DIS_PTSA_MAX_0));
253
254         writel(p->disb_ptsa_rate, T14X_MC_RA(DISB_PTSA_RATE_0));
255         writel(p->disb_ptsa_min, T14X_MC_RA(DISB_PTSA_MIN_0));
256         writel(p->disb_ptsa_max, T14X_MC_RA(DISB_PTSA_MAX_0));
257
258         writel(p->ve_ptsa_rate, T14X_MC_RA(VE_PTSA_RATE_0));
259         writel(p->ve_ptsa_min, T14X_MC_RA(VE_PTSA_MIN_0));
260         writel(p->ve_ptsa_max, T14X_MC_RA(VE_PTSA_MAX_0));
261
262         writel(p->ring2_ptsa_rate, T14X_MC_RA(RING2_PTSA_RATE_0));
263         writel(p->ring2_ptsa_min, T14X_MC_RA(RING2_PTSA_MIN_0));
264         writel(p->ring2_ptsa_max, T14X_MC_RA(RING2_PTSA_MAX_0));
265
266         writel(p->bbc_ptsa_rate, T14X_MC_RA(BBC_PTSA_RATE_0));
267         writel(p->bbc_ptsa_min, T14X_MC_RA(BBC_PTSA_MIN_0));
268         writel(p->bbc_ptsa_max, T14X_MC_RA(BBC_PTSA_MAX_0));
269
270         writel(p->bbcll_earb_cfg, T14X_MC_RA(BBCLL_EARB_CFG_0));
271
272         writel(p->mpcorer_ptsa_rate, T14X_MC_RA(MLL_MPCORER_PTSA_RATE_0));
273         writel(p->mpcorer_ptsa_min, T14X_MC_RA(MLL_MPCORER_PTSA_MIN_0));
274         writel(p->mpcorer_ptsa_max, T14X_MC_RA(MLL_MPCORER_PTSA_MAX_0));
275
276         writel(p->smmu_ptsa_rate, T14X_MC_RA(SMMU_SMMU_PTSA_RATE_0));
277         writel(p->smmu_ptsa_min, T14X_MC_RA(SMMU_SMMU_PTSA_MIN_0));
278         writel(p->smmu_ptsa_max, T14X_MC_RA(SMMU_SMMU_PTSA_MAX_0));
279
280         writel(p->ring1_ptsa_rate, T14X_MC_RA(RING1_PTSA_RATE_0));
281         writel(p->ring1_ptsa_min, T14X_MC_RA(RING1_PTSA_MIN_0));
282         writel(p->ring1_ptsa_max, T14X_MC_RA(RING1_PTSA_MAX_0));
283
284         writel(p->dis_extra_snap_level, T14X_MC_RA(DIS_EXTRA_SNAP_LEVELS_0));
285         writel(p->heg_extra_snap_level, T14X_MC_RA(HEG_EXTRA_SNAP_LEVELS_0));
286 }
287
288 static void save_ptsa(void)
289 {
290         struct ptsa_info *p = &cs->ptsa_info;
291
292         p->ptsa_grant_dec = readl(T14X_MC_RA(PTSA_GRANT_DECREMENT_0));
293
294         p->dis_ptsa_rate = readl(T14X_MC_RA(DIS_PTSA_RATE_0));
295         p->dis_ptsa_min = readl(T14X_MC_RA(DIS_PTSA_MIN_0));
296         p->dis_ptsa_max = readl(T14X_MC_RA(DIS_PTSA_MAX_0));
297
298         p->disb_ptsa_rate = readl(T14X_MC_RA(DISB_PTSA_RATE_0));
299         p->disb_ptsa_min = readl(T14X_MC_RA(DISB_PTSA_MIN_0));
300         p->disb_ptsa_max = readl(T14X_MC_RA(DISB_PTSA_MAX_0));
301
302         p->ve_ptsa_rate = readl(T14X_MC_RA(VE_PTSA_RATE_0));
303         p->ve_ptsa_min = readl(T14X_MC_RA(VE_PTSA_MIN_0));
304         p->ve_ptsa_max = readl(T14X_MC_RA(VE_PTSA_MAX_0));
305
306         p->ring2_ptsa_rate = readl(T14X_MC_RA(RING2_PTSA_RATE_0));
307         p->ring2_ptsa_min = readl(T14X_MC_RA(RING2_PTSA_MIN_0));
308         p->ring2_ptsa_max = readl(T14X_MC_RA(RING2_PTSA_MAX_0));
309
310         p->bbc_ptsa_rate = readl(T14X_MC_RA(BBC_PTSA_RATE_0));
311         p->bbc_ptsa_min = readl(T14X_MC_RA(BBC_PTSA_MIN_0));
312         p->bbc_ptsa_max = readl(T14X_MC_RA(BBC_PTSA_MAX_0));
313
314         p->bbcll_earb_cfg = readl(T14X_MC_RA(BBCLL_EARB_CFG_0));
315
316         p->mpcorer_ptsa_rate = readl(T14X_MC_RA(MLL_MPCORER_PTSA_RATE_0));
317         p->mpcorer_ptsa_min = readl(T14X_MC_RA(MLL_MPCORER_PTSA_MIN_0));
318         p->mpcorer_ptsa_max = readl(T14X_MC_RA(MLL_MPCORER_PTSA_MAX_0));
319
320         p->smmu_ptsa_rate = readl(T14X_MC_RA(SMMU_SMMU_PTSA_RATE_0));
321         p->smmu_ptsa_min = readl(T14X_MC_RA(SMMU_SMMU_PTSA_MIN_0));
322         p->smmu_ptsa_max = readl(T14X_MC_RA(SMMU_SMMU_PTSA_MAX_0));
323
324         p->ring1_ptsa_rate = readl(T14X_MC_RA(RING1_PTSA_RATE_0));
325         p->ring1_ptsa_min = readl(T14X_MC_RA(RING1_PTSA_MIN_0));
326         p->ring1_ptsa_max = readl(T14X_MC_RA(RING1_PTSA_MAX_0));
327
328         p->dis_extra_snap_level = readl(T14X_MC_RA(DIS_EXTRA_SNAP_LEVELS_0));
329         p->heg_extra_snap_level = readl(T14X_MC_RA(HEG_EXTRA_SNAP_LEVELS_0));
330 }
331
332 static void program_ring1_ptsa(struct ptsa_info *p)
333 {
334         p->ring1_ptsa_rate = p->dis_ptsa_rate +
335                              p->bbc_ptsa_rate;
336 #if defined(CONFIG_TEGRA_ERRATA_977223)
337         p->ring1_ptsa_rate /= 2;
338 #endif
339         p->ring1_ptsa_rate += p->disb_ptsa_rate +
340                               p->ve_ptsa_rate +
341                               p->ring2_ptsa_rate;
342         writel(p->ring1_ptsa_rate, T14X_MC_RA(RING1_PTSA_RATE_0));
343 }
344
345 static void t14x_init_ptsa(void)
346 {
347         struct ptsa_info *p = &cs->ptsa_info;
348         struct clk *emc_clk __attribute__((unused));
349         unsigned long emc_freq __attribute__((unused));
350         unsigned long same_freq __attribute__((unused));
351         unsigned long grant_dec __attribute__((unused));
352
353         emc_clk = clk_get(NULL, "emc");
354         la_debug("**** emc clk_rate=%luMHz", clk_get_rate(emc_clk) / 1000000);
355
356         emc_freq = clk_get_rate(emc_clk);
357         emc_freq /= 1000000;
358         /* Compute initial value for grant dec */
359         same_freq = readl(T14X_MC_RA(EMEM_ARB_MISC0_0));
360         same_freq = same_freq >> 27 & 1;
361         grant_dec = 256 * (same_freq ? 2 : 1) * emc_freq /
362                     T14X_BASE_EMC_FREQ_MHZ;
363         if (grant_dec > 511)
364                 grant_dec = 511;
365
366         p->dis_ptsa_min = 0x36;
367         p->dis_ptsa_max = 0x1e;
368         p->dis_ptsa_rate = readl(T14X_MC_RA(DIS_PTSA_RATE_0));
369
370         p->disb_ptsa_min = 0x36;
371         p->disb_ptsa_max = 0x1e;
372         p->disb_ptsa_rate = readl(T14X_MC_RA(DISB_PTSA_RATE_0));
373
374         p->ve_ptsa_rate = t14x_get_ptsa_rate(T14X_MAX_CAMERA_BW_MHZ);
375         p->ve_ptsa_min = 0x3d;
376         p->ve_ptsa_max = 0x14;
377
378         p->ring2_ptsa_rate = 0x01;
379         p->ring2_ptsa_min = 0x3f;
380         p->ring2_ptsa_max = 0x01;
381
382         p->bbc_ptsa_min = 0x3e;
383         p->bbc_ptsa_max = 0x18;
384
385         p->mpcorer_ptsa_rate = 23 * emc_freq / T14X_BASE_EMC_FREQ_MHZ;
386         p->mpcorer_ptsa_min = 0x3f;
387         p->mpcorer_ptsa_max = 0x0b;
388
389         p->smmu_ptsa_rate = 0x1;
390         p->smmu_ptsa_min = 0x1;
391         p->smmu_ptsa_max = 0x1;
392
393         p->ring1_ptsa_min = 0x36;
394         p->ring1_ptsa_max = 0x1f;
395
396         p->dis_extra_snap_level = 0x0;
397         p->heg_extra_snap_level = 0x2;
398         p->ptsa_grant_dec = grant_dec;
399
400         p->bbc_ptsa_rate = t14x_get_ptsa_rate(T14X_MAX_BBCDMA_BW_MHZ);
401
402         /* BBC ring0 ptsa max/min/rate/limit */
403         p->bbcll_earb_cfg = 0xd << 24 | 0x3f << 16 |
404                 t14x_get_ptsa_rate(T14X_MAX_BBCLL_BW_MHZ) << 8 | 8 << 0;
405
406         program_ring1_ptsa(p);
407         program_ptsa();
408 }
409
410 #define ID_IDX(x) (ID(x) - ID(DISPLAY_0A))
411 static void t14x_update_display_ptsa_rate(unsigned int *disp_bw_array)
412 {
413         unsigned int total_dis_bw;
414         unsigned int total_disb_bw;
415         struct ptsa_info *p = &cs->ptsa_info;
416
417         if (cs->disable_ptsa || cs->disable_disp_ptsa)
418                 return;
419         total_dis_bw = disp_bw_array[ID_IDX(DISPLAY_0A)] +
420                         disp_bw_array[ID_IDX(DISPLAY_0B)] +
421                         disp_bw_array[ID_IDX(DISPLAY_0C)] +
422                         disp_bw_array[ID_IDX(DISPLAY_T)] +
423                         disp_bw_array[ID_IDX(DISPLAYD)];
424         total_disb_bw = disp_bw_array[ID_IDX(DISPLAY_0AB)] +
425                         disp_bw_array[ID_IDX(DISPLAY_0BB)] +
426                         disp_bw_array[ID_IDX(DISPLAY_0CB)];
427
428         p->dis_ptsa_rate = t14x_get_ptsa_rate(total_dis_bw);
429         p->disb_ptsa_rate = t14x_get_ptsa_rate(total_disb_bw);
430
431         writel(p->dis_ptsa_rate, T14X_MC_RA(DIS_PTSA_RATE_0));
432         writel(p->disb_ptsa_rate, T14X_MC_RA(DISB_PTSA_RATE_0));
433
434         program_ring1_ptsa(p);
435 }
436
437 #define BBC_ID_IDX(x) (ID(x) - ID(BBCR))
438 static void t14x_update_bbc_ptsa_rate(uint *bbc_bw_array)
439 {
440         uint total_bbc_bw;
441         struct ptsa_info *p = &cs->ptsa_info;
442
443         if (cs->disable_ptsa || cs->disable_bbc_ptsa)
444                 return;
445
446         total_bbc_bw = bbc_bw_array[BBC_ID_IDX(BBCR)] +
447                        bbc_bw_array[BBC_ID_IDX(BBCW)];
448         p->bbc_ptsa_rate = t14x_get_ptsa_rate(total_bbc_bw);
449         writel(p->bbc_ptsa_rate, T14X_MC_RA(BBC_PTSA_RATE_0));
450         program_ring1_ptsa(p);
451 }
452
453 static void program_la(struct la_client_info *ci, int la)
454 {
455         unsigned long reg_read;
456         unsigned long reg_write;
457
458         spin_lock(&cs->lock);
459         reg_read = readl(ci->reg_addr);
460         reg_write = (reg_read & ~ci->mask) |
461                         (la << ci->shift);
462         writel(reg_write, ci->reg_addr);
463         ci->la_set = la;
464         la_debug("reg_addr=0x%x, read=0x%x, write=0x%x",
465                 (u32)ci->reg_addr, (u32)reg_read, (u32)reg_write);
466
467         BUG_ON(la > 255);
468         /* la scaling for display is on in MC always.
469          * set lo and hi la values to same as normal la.
470          */
471         switch (ci->id) {
472                 case ID(DISPLAY_0A):
473                         writel(la << 16 | la, T14X_MC_RA(SCALED_LA_DISPLAY0A_0));
474                         break;
475                 case ID(DISPLAY_0B):
476                         writel(la << 16 | la, T14X_MC_RA(SCALED_LA_DISPLAY0B_0));
477                         break;
478                 case ID(DISPLAY_0C):
479                         writel(la << 16 | la, T14X_MC_RA(SCALED_LA_DISPLAY0C_0));
480                         break;
481                 case ID(DISPLAY_0BB):
482                         writel(la << 16 | la, T14X_MC_RA(SCALED_LA_DISPLAY0BB_0));
483                         break;
484                 default:
485                         break;
486         }
487         spin_unlock(&cs->lock);
488 }
489
490 #define DISPLAY_MARGIN 100 /* 100 -> 1.0, 110 -> 1.1 */
491 static int t14x_set_la(enum tegra_la_id id, unsigned int bw_mbps)
492 {
493         int ideal_la;
494         int la_to_set;
495         unsigned int fifo_size_in_atoms;
496         int bytes_per_atom = cs->atom_size;
497         struct la_client_info *ci;
498         int idx = cs->id_to_index[id];
499
500         VALIDATE_ID(id, cs);
501         VALIDATE_BW(bw_mbps);
502
503         ci = &cs->la_info_array[idx];
504         fifo_size_in_atoms = ci->fifo_size_in_atoms;
505
506         if (id == TEGRA_LA_BBCR || id == TEGRA_LA_BBCW) {
507                 cs->bbc_bw_array[id - TEGRA_LA_BBCR] = bw_mbps;
508                 t14x_update_bbc_ptsa_rate(cs->bbc_bw_array);
509 #ifdef CONFIG_TEGRA_DISABLE_BBC_LATENCY_ALLOWANCE
510                 return 0;
511 #endif
512         }
513
514         if (id >= TEGRA_LA_DISPLAY_0A && id <= TEGRA_LA_DISPLAYD) {
515                 cs->disp_bw_array[id - TEGRA_LA_DISPLAY_0A] = bw_mbps;
516                 t14x_update_display_ptsa_rate(cs->disp_bw_array);
517         }
518
519         if (bw_mbps == 0) {
520                 la_to_set = cs->la_max_value;
521         } else {
522                 if (id >= TEGRA_LA_DISPLAY_0A && id <= TEGRA_LA_DISPLAYD) {
523                         /* display la margin shold be 1.1 */
524                         ideal_la = (100 * fifo_size_in_atoms * bytes_per_atom * 1000) /
525                                    (DISPLAY_MARGIN * bw_mbps * cs->ns_per_tick);
526                 } else {
527                         ideal_la = (fifo_size_in_atoms * bytes_per_atom * 1000) /
528                                    (bw_mbps * cs->ns_per_tick);
529                 }
530                 la_to_set = ideal_la -
531                             (ci->expiration_in_ns / cs->ns_per_tick) - 1;
532         }
533
534         la_debug("\n%s:id=%d,idx=%d, bw=%dmbps, la_to_set=%d",
535                 __func__, id, idx, bw_mbps, la_to_set);
536         la_to_set = (la_to_set < 0) ? 0 : la_to_set;
537         la_to_set = (la_to_set > cs->la_max_value) ? cs->la_max_value : la_to_set;
538
539         if (cs->disable_la)
540                 return 0;
541         program_la(ci, la_to_set);
542         return 0;
543 }
544
545 static int t14x_la_suspend(void)
546 {
547         int i = 0;
548         struct la_client_info *ci;
549
550         /* stashing LA and PTSA from registers is necessary
551          * in order to get latest values programmed by DVFS.
552          */
553         for (i = 0; i < cs->la_info_array_size; i++) {
554                 ci = &cs->la_info_array[i];
555                 ci->la_set = (readl(ci->reg_addr) & ci->mask) >>
556                              ci->shift;
557         }
558         save_ptsa();
559         return 0;
560 }
561
562 static void t14x_la_resume(void)
563 {
564         int i;
565
566         for (i = 0; i < cs->la_info_array_size; i++) {
567                 if (cs->la_info_array[i].la_set)
568                         program_la(&cs->la_info_array[i],
569                                 cs->la_info_array[i].la_set);
570         }
571         program_ptsa();
572 }
573
574 void tegra_la_get_t14x_specific(struct la_chip_specific *cs_la)
575 {
576         cs_la->ns_per_tick = 30;
577         cs_la->atom_size = 16;
578         cs_la->la_max_value = T14X_MC_LA_MAX_VALUE;
579         cs_la->la_info_array = t14x_la_info_array;
580         cs_la->la_info_array_size = ARRAY_SIZE(t14x_la_info_array);
581         cs_la->init_ptsa = t14x_init_ptsa;
582         cs_la->update_display_ptsa_rate = t14x_update_display_ptsa_rate;
583         cs_la->set_la = t14x_set_la;
584         cs_la->suspend = t14x_la_suspend;
585         cs_la->resume = t14x_la_resume;
586         cs = cs_la;
587 }