ARM: tegra12: set CPU rate to 2.2GHz for sku 0x87
[linux-3.10.git] / arch / arm / mach-tegra / tegra12_edp.c
1 /*
2  * arch/arm/mach-tegra/tegra12_edp.c
3  *
4  * Copyright (c) 2013, NVIDIA CORPORATION. All rights reserved.
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms and conditions of the GNU General Public License,
8  * version 2, as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13  * more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  */
18
19 #include <linux/kernel.h>
20 #include <linux/init.h>
21 #include <linux/string.h>
22 #include <linux/module.h>
23 #include <linux/clk.h>
24 #include <linux/kobject.h>
25 #include <linux/err.h>
26
27 #include <mach/edp.h>
28
29 #include "clock.h"
30 #include "common.h"
31
32 #define CORE_MODULES_STATES 1
33 #define TEMPERATURE_RANGES 5
34 #define CAP_CLKS_NUM 2
35 #define TOTAL_CAPS (CORE_EDP_PROFILES_NUM * CORE_MODULES_STATES *\
36                         TEMPERATURE_RANGES * CAP_CLKS_NUM)
37
38 struct tegra_sysedp_corecap td580d_sysedp_corecap[td580d_sysedp_corecap_sz] = {
39 /*
40 TD580D/CD580M/SD580N
41 GPU MaxF        853000 KHz
42 CPU MaxBudget   12000  mW
43 */
44         /*mW     CPU intensive load        GPU intensive load    */
45         /*mW     budget  gpu(khz) mem(khz)  budget  gpu(khz) mem(khz) pthrot(mW)*/
46         {5000,  {1500,  108000, 933000 }, {1500,  108000, 933000 }, 1116 },
47         {6000,  {3000,  108000, 933000 }, {3000,  108000, 933000 }, 2109 },
48         {7000,  {4000,  108000, 933000 }, {3000,  180000, 933000 }, 2589 },
49         {8000,  {5000,  108000, 933000 }, {3000,  252000, 933000 }, 3068 },
50         {9000,  {6000,  180000, 933000 }, {2500,  396000, 933000 }, 3630 },
51         {10000, {7000,  108000, 933000 }, {3500,  396000, 933000 }, 4425 },
52         {11000, {7000,  252000, 933000 }, {4000,  468000, 933000 }, 5301 },
53         {12000, {8000,  180000, 933000 }, {3000,  540000, 933000 }, 5348 },
54         {13000, {9000,  108000, 933000 }, {5000,  540000, 933000 }, 6969 },
55         {14000, {10000, 108000, 933000 }, {3500,  612000, 933000 }, 6846 },
56         {15000, {10000, 180000, 933000 }, {4000,  648000, 933000 }, 7880 },
57         {16000, {11000, 180000, 933000 }, {3500,  684000, 933000 }, 8120 },
58         {17000, {12000, 108000, 933000 }, {4000,  708000, 933000 }, 9024 },
59         {18000, {12000, 252000, 933000 }, {3000,  756000, 933000 }, 9252 },
60         {19000, {12000, 252000, 933000 }, {4000,  756000, 933000 }, 10046 },
61         {20000, {12000, 396000, 933000 }, {5000,  756000, 933000 }, 10873 },
62         {21000, {12000, 468000, 933000 }, {3500,  804000, 933000 }, 10909 },
63         {22000, {12000, 540000, 933000 }, {4000,  804000, 933000 }, 11306 },
64         {23000, {12000, 540000, 933000 }, {4000,  853000, 933000 }, 12696 },
65         {24000, {12000, 612000, 933000 }, {5000,  853000, 933000 }, 13524 },
66         {25000, {12000, 612000, 933000 }, {5000,  853000, 933000 }, 13524 },
67         {26000, {12000, 684000, 933000 }, {6000,  853000, 933000 }, 14452 },
68         {27000, {12000, 708000, 933000 }, {7000,  853000, 933000 }, 15002 },
69         {28000, {12000, 708000, 933000 }, {8000,  853000, 933000 }, 16030 },
70         {29000, {12000, 756000, 933000 }, {8000,  853000, 933000 }, 16311 },
71         {30000, {12000, 756000, 933000 }, {8000,  853000, 933000 }, 16311 },
72         {31000, {12000, 756000, 933000 }, {8000,  853000, 933000 }, 16311 },
73         {32000, {12000, 804000, 933000 }, {9000,  853000, 933000 }, 16883 },
74         {33000, {12000, 804000, 933000 }, {10000, 853000, 933000 }, 17721 },
75 };
76
77 struct tegra_sysedp_corecap td570d_sysedp_corecap[td570d_sysedp_corecap_sz] = {
78 /*
79 TD570D/SD570N
80 GPU MaxF        648000 KHz
81 CPU MaxBudget   9000   mW
82 */
83         /*mW     CPU intensive load        GPU intensive load    */
84         /*mW     budget  gpu(khz) mem(khz)  budget  gpu(khz) mem(khz) pthrot(mW)*/
85         {5000,  {1500, 108000, 792000 }, {1500, 108000, 792000 }, 918 },
86         {6000,  {3000, 108000, 792000 }, {3000, 108000, 792000 }, 2109 },
87         {7000,  {4000, 108000, 792000 }, {3000, 180000, 792000 }, 2589 },
88         {8000,  {5000, 108000, 792000 }, {3000, 252000, 792000 }, 3068 },
89         {9000,  {6000, 180000, 792000 }, {2500, 396000, 792000 }, 3630 },
90         {10000, {7000, 108000, 792000 }, {3500, 396000, 792000 }, 4425 },
91         {11000, {7000, 252000, 792000 }, {4000, 468000, 792000 }, 5301 },
92         {12000, {8000, 180000, 792000 }, {3000, 540000, 792000 }, 5348 },
93         {13000, {9000, 108000, 792000 }, {5000, 540000, 792000 }, 6969 },
94         {14000, {9000, 180000, 792000 }, {3500, 612000, 792000 }, 6846 },
95         {15000, {9000, 252000, 792000 }, {4000, 648000, 792000 }, 7880 },
96         {16000, {9000, 396000, 792000 }, {5000, 648000, 792000 }, 8770 },
97         {17000, {9000, 468000, 792000 }, {6000, 648000, 792000 }, 9488 },
98         {18000, {9000, 468000, 792000 }, {7000, 648000, 792000 }, 9488 },
99         {19000, {9000, 540000, 792000 }, {7000, 648000, 792000 }, 10185 },
100         {20000, {9000, 612000, 792000 }, {7000, 648000, 792000 }, 10185 },
101         {21000, {9000, 612000, 792000 }, {8000, 648000, 792000 }, 10804 },
102         {22000, {9000, 648000, 792000 }, {9000, 648000, 792000 }, 12066 },
103         {23000, {9000, 648000, 792000 }, {9000, 648000, 792000 }, 12066 },
104         {24000, {9000, 648000, 792000 }, {9000, 648000, 792000 }, 12066 },
105         {25000, {9000, 648000, 792000 }, {9000, 648000, 792000 }, 12066 },
106         {26000, {9000, 648000, 792000 }, {9000, 648000, 792000 }, 12066 },
107         {27000, {9000, 648000, 792000 }, {9000, 648000, 792000 }, 12066 },
108         {28000, {9000, 648000, 792000 }, {9000, 648000, 792000 }, 12066 },
109         {29000, {9000, 648000, 792000 }, {9000, 648000, 792000 }, 12066 },
110         {30000, {9000, 648000, 792000 }, {9000, 648000, 792000 }, 12066 },
111         {31000, {9000, 648000, 792000 }, {9000, 648000, 792000 }, 12066 },
112         {32000, {9000, 648000, 792000 }, {9000, 648000, 792000 }, 12066 },
113         {33000, {9000, 648000, 792000 }, {9000, 648000, 792000 }, 12066 },
114 };
115
116 struct tegra_sysedp_corecap td575d_sysedp_corecap[td575d_sysedp_corecap_sz] = {
117 /*
118 TD575D/CD575M/SD575N
119 GPU MaxF        853000 KHz
120 CPU MaxBudget   10000  mW
121 */
122         /*mW     CPU intensive load        GPU intensive load    */
123         /*mW     budget  gpu(khz) mem(khz)  budget  gpu(khz) mem(khz) pthrot(mW) */
124         {5000,  {1500,  108000, 933000}, {1500,  108000, 933000 }, 918 },
125         {6000,  {3000,  108000, 933000}, {3000,  108000, 933000 }, 2109 },
126         {7000,  {4000,  108000, 933000}, {3000,  180000, 933000 }, 2589 },
127         {8000,  {5000,  108000, 933000}, {3000,  252000, 933000 }, 3068 },
128         {9000,  {6000,  180000, 933000}, {2500,  396000, 933000 }, 3630 },
129         {10000, {7000,  108000, 933000}, {3500,  396000, 933000 }, 4425 },
130         {11000, {7000,  252000, 933000}, {4000,  468000, 933000 }, 5301 },
131         {12000, {8000,  180000, 933000}, {3000,  540000, 933000 }, 5348 },
132         {13000, {9000,  108000, 933000}, {5000,  540000, 933000 }, 6969 },
133         {14000, {10000, 108000, 933000}, {3500,  612000, 933000 }, 6846 },
134         {15000, {10000, 180000, 933000}, {4000,  648000, 933000 }, 7880 },
135         {16000, {10000, 252000, 933000}, {3500,  684000, 933000 }, 8120 },
136         {17000, {10000, 396000, 933000}, {4000,  708000, 933000 }, 9024 },
137         {18000, {10000, 396000, 933000}, {3000,  756000, 933000 }, 9252 },
138         {19000, {10000, 468000, 933000}, {4000,  756000, 933000 }, 10046 },
139         {20000, {10000, 540000, 933000}, {5000,  756000, 933000 }, 10873 },
140         {21000, {10000, 540000, 933000}, {3500,  804000, 933000 }, 10909 },
141         {22000, {10000, 612000, 933000}, {4000,  804000, 933000 }, 11306 },
142         {23000, {10000, 648000, 933000}, {4000,  853000, 933000 }, 12696 },
143         {24000, {10000, 708000, 933000}, {5000,  853000, 933000 }, 13524 },
144         {25000, {10000, 708000, 933000}, {5000,  853000, 933000 }, 13524 },
145         {26000, {10000, 708000, 933000}, {6000,  853000, 933000 }, 14049 },
146         {27000, {10000, 756000, 933000}, {7000,  853000, 933000 }, 15002 },
147         {28000, {10000, 756000, 933000}, {8000,  853000, 933000 }, 15071 },
148         {29000, {10000, 804000, 933000}, {8000,  853000, 933000 }, 15621 },
149         {30000, {10000, 804000, 933000}, {8000,  853000, 933000 }, 15621 },
150         {31000, {10000, 804000, 933000}, {8000,  853000, 933000 }, 15621 },
151         {32000, {10000, 804000, 933000}, {9000,  853000, 933000 }, 16331 },
152         {33000, {10000, 853000, 933000}, {10000, 853000, 933000 }, 17721 },
153 };
154
155 struct tegra_sysedp_corecap cd570m_sysedp_corecap[cd570m_sysedp_corecap_sz] = {
156 /*
157 CD570M
158 GPU MaxF        648000 KHz
159 CPU MaxBudget   10000  mW
160 */
161         /*mW     CPU intensive load        GPU intensive load    */
162         /*mW     budget  gpu(khz) mem(khz)  budget  gpu(khz) mem(khz) pthrot(mW)*/
163         {5000,  {1500,  108000, 933000}, {1500,  108000, 933000}, 918 },
164         {6000,  {3000,  108000, 933000}, {3000,  108000, 933000}, 2109 },
165         {7000,  {4000,  108000, 933000}, {3000,  180000, 933000}, 2589 },
166         {8000,  {5000,  108000, 933000}, {3000,  252000, 933000}, 3068 },
167         {9000,  {6000,  180000, 933000}, {2500,  396000, 933000}, 3630 },
168         {10000, {7000,  108000, 933000}, {3500,  396000, 933000}, 4425 },
169         {11000, {7000,  252000, 933000}, {4000,  468000, 933000}, 5301 },
170         {12000, {8000,  180000, 933000}, {3000,  540000, 933000}, 5348 },
171         {13000, {9000,  108000, 933000}, {5000,  540000, 933000}, 6969 },
172         {14000, {10000, 108000, 933000}, {3500,  612000, 933000}, 6846 },
173         {15000, {10000, 180000, 933000}, {4000,  648000, 933000}, 7880 },
174         {16000, {10000, 252000, 933000}, {5000,  648000, 933000}, 8707 },
175         {17000, {10000, 396000, 933000}, {6000,  648000, 933000}, 9636 },
176         {18000, {10000, 396000, 933000}, {7000,  648000, 933000}, 9846 },
177         {19000, {10000, 468000, 933000}, {7000,  648000, 933000}, 10185 },
178         {20000, {10000, 540000, 933000}, {7000,  648000, 933000}, 10185 },
179         {21000, {10000, 540000, 933000}, {8000,  648000, 933000}, 10804 },
180         {22000, {10000, 612000, 933000}, {9000,  648000, 933000}, 12904 },
181         {23000, {10000, 648000, 933000}, {10000, 648000, 933000}, 12904 },
182         {24000, {10000, 648000, 933000}, {10000, 648000, 933000}, 12904 },
183         {25000, {10000, 648000, 933000}, {10000, 648000, 933000}, 12904 },
184         {26000, {10000, 648000, 933000}, {10000, 648000, 933000}, 12904 },
185         {27000, {10000, 648000, 933000}, {10000, 648000, 933000}, 12904 },
186         {28000, {10000, 648000, 933000}, {10000, 648000, 933000}, 12904 },
187         {29000, {10000, 648000, 933000}, {10000, 648000, 933000}, 12904 },
188         {30000, {10000, 648000, 933000}, {10000, 648000, 933000}, 12904 },
189         {31000, {10000, 648000, 933000}, {10000, 648000, 933000}, 12904 },
190         {32000, {10000, 648000, 933000}, {10000, 648000, 933000}, 12904 },
191         {33000, {10000, 648000, 933000}, {10000, 648000, 933000}, 12904 },
192 };
193
194 struct core_edp_entry {
195         int sku;
196         unsigned int cap_mA;
197         int mult;
198         unsigned long cap_cpu[CORE_EDP_PROFILES_NUM][
199                 CORE_MODULES_STATES][TEMPERATURE_RANGES][CAP_CLKS_NUM];
200 };
201
202 static int temperatures[] = { 50, 70, 80, 90, 100 };
203
204 #ifdef CONFIG_TEGRA_DUAL_CBUS
205 static char *cap_clks_names[] = { "edp.emc", "edp.c2bus" };
206 #else
207 static char *cap_clks_names[] = { "edp.emc", "edp.cbus" };
208 #endif
209 static struct clk *cap_clks[CAP_CLKS_NUM];
210
211 /* FIXME: Populate with correct values as per final EDP tables.
212  * Currently contains *safe* values
213  */
214 static struct core_edp_entry core_edp_table[] = {
215 };
216
217 #ifdef CONFIG_TEGRA_EDP_LIMITS
218
219 #define LEAKAGE_CONSTS_IJK_COMMON                                       \
220 {                                                               \
221         /* i = 0 */             \
222         { {  -309609464,    197786326,    -40763150,    1613941, },     \
223           {   964716269,   -569081375,    115781607,   -4206296, },     \
224           {  -994324790,    529664031,   -106360108,    3454033, },     \
225           {   343209442,   -160577505,     31928605,    -895157, },     \
226         },              \
227         /* i = 1 */             \
228         { {   616319664,   -637007187,    137759592,    -7194133,  },   \
229           { -1853817283,   1896032851,   -407407611,    20868220,  },   \
230           {  1824097131,  -1831611624,    390753403,   -19530122,  },   \
231           {  -589155245,    578838526,   -122655676,     5985577,  },   \
232         },              \
233         /* i = 2 */             \
234         { {  -439994037,    455845250,   -104097013,     6191899, },    \
235           {  1354650774,  -1395561938,    318665647,   -18886906, },    \
236           { -1361677255,   1390149678,   -317474532,    18728266, },    \
237           {   447877887,   -451382027,    103201434,    -6046692, },    \
238         },              \
239         /* i = 3 */             \
240         { {    56797556,    -59779544,     13810295,     -848290, },    \
241           {  -175867301,    184753957,    -42708242,     2621537, },    \
242           {   177626357,   -185996541,     43029384,    -2638283, },    \
243           {   -58587547,     61075322,    -14145853,      865351, },    \
244         },              \
245 }
246
247 #define EDP_PARAMS_COMMON_PART                                          \
248         .temp_scaled      = 10,                                         \
249         .dyn_scaled       = 1000,                                       \
250         .dyn_consts_n     = { 950,  1399, 2166, 3041 }, \
251         .consts_scaled    = 100,                                        \
252         .leakage_consts_n = { 45, 67, 87, 100 },                        \
253         .ijk_scaled       = 100000,                                     \
254         .leakage_min      = 30,                                         \
255         /* .volt_temp_cap = { 70, 1240 }, - TODO for T124 */            \
256         .leakage_consts_ijk = LEAKAGE_CONSTS_IJK_COMMON
257
258 static struct tegra_edp_cpu_leakage_params t12x_leakage_params[] = {
259         {
260                 .cpu_speedo_id      = 0, /* Engg SKU */
261                 EDP_PARAMS_COMMON_PART,
262         },
263         {
264                 .cpu_speedo_id      = 1, /* Prod SKU */
265                 EDP_PARAMS_COMMON_PART,
266         },
267         {
268                 .cpu_speedo_id      = 2, /* Prod SKU */
269                 EDP_PARAMS_COMMON_PART,
270         },
271         {
272                 .cpu_speedo_id      = 3, /* Prod SKU */
273                 EDP_PARAMS_COMMON_PART,
274         },
275         {
276                 .cpu_speedo_id      = 5, /* Prod SKU */
277                 EDP_PARAMS_COMMON_PART,
278         },
279 };
280
281 #ifdef CONFIG_TEGRA_GPU_EDP
282 static struct tegra_edp_gpu_leakage_params t12x_gpu_leakage_params = {
283                 .temp_scaled      = 10,
284                 .dyn_scaled       = 1000,
285                 .dyn_consts_n       = 10646,
286                 .consts_scaled    = 1,
287                 .leakage_consts_n   = 1,
288                 .ijk_scaled       = 100000,
289                 .leakage_consts_ijk = {
290                          /* i = 0 */
291                          { {  -208796792,     37746202,    -9648869,      725660, },
292                            {   704446675,   -133808535,    34470023,    -2464142, },
293                            {  -783701649,    146557393,   -38623024,     2654269, },
294                            {   292709580,    -51246839,    13984499,     -934964, },
295                          },
296                          /* i = 1 */
297                          { {   115095343,    -65602614,    11251896,      -838394, },
298                            {  -394753929,    263095142,   -49006854,      3326269, },
299                            {   441644020,   -313320338,    61612126,     -3916786, },
300                            {  -164021554,    118634317,   -24406245,      1517573, },
301                          },
302                          /* i = 2 */
303                          { {   -38857760,     12243796,    -1964159,       181232, },
304                            {   143265078,    -71110695,    13985680,      -917947, },
305                            {  -171456530,     98906114,   -21261015,      1216159, },
306                            {    67437536,    -40520060,     9265259,      -484818, },
307                          },
308                          /* i = 3 */
309                          { {     1795940,      -345535,       83004,       -20007, },
310                            {    -8549105,      6333235,    -1479815,       115441, },
311                            {    12192546,    -10880741,     2632212,      -161404, },
312                            {    -5328587,      4953756,    -1215038,        64556, },
313                          },
314                  },
315                 .leakage_min = 30,
316 };
317
318 struct tegra_edp_gpu_leakage_params *tegra12x_get_gpu_leakage_params()
319 {
320         return &t12x_gpu_leakage_params;
321 }
322 #endif
323
324 struct tegra_edp_cpu_leakage_params *tegra12x_get_leakage_params(int index,
325                                                         unsigned int *sz)
326 {
327         BUG_ON(index >= ARRAY_SIZE(t12x_leakage_params));
328         if (sz)
329                 *sz = ARRAY_SIZE(t12x_leakage_params);
330         return &t12x_leakage_params[index];
331 }
332 #endif
333
334 static struct core_edp_entry *find_edp_entry(int sku, unsigned int regulator_mA)
335 {
336         int i;
337
338         for (i = 0; i < ARRAY_SIZE(core_edp_table); i++) {
339                 struct core_edp_entry *entry = &core_edp_table[i];
340                 if ((entry->sku == sku) && (entry->cap_mA == regulator_mA))
341                         return entry;
342         }
343         return NULL;
344 }
345
346 static unsigned long clip_cap_rate(struct clk *cap_clk, unsigned long rate)
347 {
348         unsigned long floor, ceiling;
349         struct clk *p = clk_get_parent(cap_clk);
350
351         if (!p || !p->ops || !p->ops->shared_bus_update) {
352                 WARN(1, "%s: edp cap clk %s is not a shared bus user\n",
353                         __func__, cap_clk->name);
354                 return rate;
355         }
356
357         /*
358          * Clip cap rate to shared bus possible rates (going up via shared
359          * bus * ladder since bus clocks always rounds up with resolution of
360          * at least 2kHz)
361          */
362         ceiling = clk_round_rate(p, clk_get_min_rate(p));
363         do {
364                 floor = ceiling;
365                 ceiling = clk_round_rate(p, floor + 2000);
366                 if (IS_ERR_VALUE(ceiling)) {
367                         pr_err("%s: failed to clip %lu to %s possible rates\n",
368                                __func__, rate, p->name);
369                         return rate;
370                 }
371         } while ((floor < ceiling) && (ceiling <= rate));
372
373         if (floor > rate)
374                 WARN(1, "%s: %s cap rate %lu is below %s floor %lu\n",
375                         __func__, cap_clk->name, rate, p->name, floor);
376         return floor;
377 }
378
379 int __init tegra12x_select_core_edp_table(unsigned int regulator_mA,
380                                           struct tegra_core_edp_limits *limits)
381 {
382         int i;
383         int sku;
384         unsigned long *cap_rates;
385         struct core_edp_entry *edp_entry;
386
387         BUG_ON(ARRAY_SIZE(temperatures) != TEMPERATURE_RANGES);
388         BUG_ON(ARRAY_SIZE(cap_clks_names) != CAP_CLKS_NUM);
389
390         for (i = 0; i < CAP_CLKS_NUM; i++) {
391                 struct clk *c = tegra_get_clock_by_name(cap_clks_names[i]);
392                 if (!c) {
393                         pr_err("%s: failed to find edp cap clock %s\n",
394                                __func__, cap_clks_names[i]);
395                         return -ENODEV;
396                 }
397                 cap_clks[i] = c;
398         }
399
400         sku = tegra_get_sku_id();
401         if (sku == 0x0)
402                 sku = 0x7;
403
404         if ((sku == 0x7) && (regulator_mA >= 3500)) {
405                 pr_info("%s: no core edp capping for sku %d, %d mA\n",
406                        __func__, sku, regulator_mA);
407                 return -ENODATA;
408         }
409
410         edp_entry = find_edp_entry(sku, regulator_mA);
411         if (!edp_entry) {
412                 pr_info("%s: no core edp table for sku %d, %d mA\n",
413                        __func__, sku, regulator_mA);
414                 return -ENODATA;
415         }
416
417         limits->sku = sku;
418         limits->cap_clocks = cap_clks;
419         limits->cap_clocks_num = CAP_CLKS_NUM;
420         limits->temperatures = temperatures;
421         limits->temperature_ranges = TEMPERATURE_RANGES;
422         limits->core_modules_states = CORE_MODULES_STATES;
423
424         cap_rates = &edp_entry->cap_cpu[0][0][0][0];
425         limits->cap_rates_scpu_on = cap_rates;
426         limits->cap_rates_scpu_off = cap_rates;
427         for (i = 0; i < TOTAL_CAPS; i++, cap_rates++) {
428                 unsigned long rate = *cap_rates * edp_entry->mult;
429                 *cap_rates = clip_cap_rate(cap_clks[i % CAP_CLKS_NUM], rate);
430         }
431
432         return 0;
433 }