arm: tegra12: add support for 0x80 embedded SKU
[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-2014, 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 #ifdef CONFIG_ARCH_TEGRA_12x_SOC
20
21 #include <linux/tegra-fuse.h>
22 #include <mach/edp.h>
23
24 #if defined(CONFIG_SYSEDP_FRAMEWORK) && !defined(CONFIG_ARCH_TEGRA_13x_SOC)
25 static struct tegra_sysedp_corecap td580d_sysedp_corecap[] = {
26 /*
27 TD580D/CD580M/SD580N
28 GPU MaxF        853000 KHz
29 CPU MaxBudget   12000  mW
30 */
31         /*mW     CPU intensive load        GPU intensive load    */
32         /*mW     budget  gpu(khz) mem(khz)  budget  gpu(khz) mem(khz) pthrot(mW)*/
33         {5000,  {1500,  108000, 933000 }, {1500,  108000, 933000 }, 1116 },
34         {6000,  {3000,  108000, 933000 }, {3000,  108000, 933000 }, 2109 },
35         {7000,  {4000,  108000, 933000 }, {3000,  180000, 933000 }, 2589 },
36         {8000,  {5000,  108000, 933000 }, {3000,  252000, 933000 }, 3068 },
37         {9000,  {6000,  180000, 933000 }, {2500,  396000, 933000 }, 3630 },
38         {10000, {7000,  108000, 933000 }, {3500,  396000, 933000 }, 4425 },
39         {11000, {7000,  252000, 933000 }, {4000,  468000, 933000 }, 5301 },
40         {12000, {8000,  180000, 933000 }, {3000,  540000, 933000 }, 5348 },
41         {13000, {9000,  108000, 933000 }, {5000,  540000, 933000 }, 6969 },
42         {14000, {10000, 108000, 933000 }, {3500,  612000, 933000 }, 6846 },
43         {15000, {10000, 180000, 933000 }, {4000,  648000, 933000 }, 7880 },
44         {16000, {11000, 180000, 933000 }, {3500,  684000, 933000 }, 8120 },
45         {17000, {12000, 108000, 933000 }, {4000,  708000, 933000 }, 9024 },
46         {18000, {12000, 252000, 933000 }, {3000,  756000, 933000 }, 9252 },
47         {19000, {12000, 252000, 933000 }, {4000,  756000, 933000 }, 10046 },
48         {20000, {12000, 396000, 933000 }, {5000,  756000, 933000 }, 10873 },
49         {21000, {12000, 468000, 933000 }, {3500,  804000, 933000 }, 10909 },
50         {22000, {12000, 540000, 933000 }, {4000,  804000, 933000 }, 11306 },
51         {23000, {12000, 540000, 933000 }, {4000,  853000, 933000 }, 12696 },
52         {24000, {12000, 612000, 933000 }, {5000,  853000, 933000 }, 13524 },
53         {25000, {12000, 612000, 933000 }, {5000,  853000, 933000 }, 13524 },
54         {26000, {12000, 684000, 933000 }, {6000,  853000, 933000 }, 14452 },
55         {27000, {12000, 708000, 933000 }, {7000,  853000, 933000 }, 15002 },
56         {28000, {12000, 708000, 933000 }, {8000,  853000, 933000 }, 16030 },
57         {29000, {12000, 756000, 933000 }, {8000,  853000, 933000 }, 16311 },
58         {30000, {12000, 756000, 933000 }, {8000,  853000, 933000 }, 16311 },
59         {31000, {12000, 756000, 933000 }, {8000,  853000, 933000 }, 16311 },
60         {32000, {12000, 804000, 933000 }, {9000,  853000, 933000 }, 16883 },
61         {33000, {12000, 804000, 933000 }, {10000, 853000, 933000 }, 17721 },
62 };
63
64 static struct tegra_sysedp_corecap td570d_sysedp_corecap[] = {
65 /*
66 TD570D/SD570N
67 GPU MaxF        648000 KHz
68 CPU MaxBudget   9000   mW
69 */
70         /*mW     CPU intensive load        GPU intensive load    */
71         /*mW     budget  gpu(khz) mem(khz)  budget  gpu(khz) mem(khz) pthrot(mW)*/
72         {5000,  {1500, 108000, 792000 }, {1500, 108000, 792000 }, 918 },
73         {6000,  {3000, 108000, 792000 }, {3000, 108000, 792000 }, 2109 },
74         {7000,  {4000, 108000, 792000 }, {3000, 180000, 792000 }, 2589 },
75         {8000,  {5000, 108000, 792000 }, {3000, 252000, 792000 }, 3068 },
76         {9000,  {6000, 180000, 792000 }, {2500, 396000, 792000 }, 3630 },
77         {10000, {7000, 108000, 792000 }, {3500, 396000, 792000 }, 4425 },
78         {11000, {7000, 252000, 792000 }, {4000, 468000, 792000 }, 5301 },
79         {12000, {8000, 180000, 792000 }, {3000, 540000, 792000 }, 5348 },
80         {13000, {9000, 108000, 792000 }, {5000, 540000, 792000 }, 6969 },
81         {14000, {9000, 180000, 792000 }, {3500, 612000, 792000 }, 6846 },
82         {15000, {9000, 252000, 792000 }, {4000, 648000, 792000 }, 7880 },
83         {16000, {9000, 396000, 792000 }, {5000, 648000, 792000 }, 8770 },
84         {17000, {9000, 468000, 792000 }, {6000, 648000, 792000 }, 9488 },
85         {18000, {9000, 468000, 792000 }, {7000, 648000, 792000 }, 9488 },
86         {19000, {9000, 540000, 792000 }, {7000, 648000, 792000 }, 10185 },
87         {20000, {9000, 612000, 792000 }, {7000, 648000, 792000 }, 10185 },
88         {21000, {9000, 612000, 792000 }, {8000, 648000, 792000 }, 10804 },
89         {22000, {9000, 648000, 792000 }, {9000, 648000, 792000 }, 12066 },
90         {23000, {9000, 648000, 792000 }, {9000, 648000, 792000 }, 12066 },
91         {24000, {9000, 648000, 792000 }, {9000, 648000, 792000 }, 12066 },
92         {25000, {9000, 648000, 792000 }, {9000, 648000, 792000 }, 12066 },
93         {26000, {9000, 648000, 792000 }, {9000, 648000, 792000 }, 12066 },
94         {27000, {9000, 648000, 792000 }, {9000, 648000, 792000 }, 12066 },
95         {28000, {9000, 648000, 792000 }, {9000, 648000, 792000 }, 12066 },
96         {29000, {9000, 648000, 792000 }, {9000, 648000, 792000 }, 12066 },
97         {30000, {9000, 648000, 792000 }, {9000, 648000, 792000 }, 12066 },
98         {31000, {9000, 648000, 792000 }, {9000, 648000, 792000 }, 12066 },
99         {32000, {9000, 648000, 792000 }, {9000, 648000, 792000 }, 12066 },
100         {33000, {9000, 648000, 792000 }, {9000, 648000, 792000 }, 12066 },
101 };
102
103 static struct tegra_sysedp_corecap td575d_sysedp_corecap[] = {
104 /*
105 TD575D/CD575M/SD575N
106 GPU MaxF        853000 KHz
107 CPU MaxBudget   10000  mW
108 */
109         /*mW     CPU intensive load        GPU intensive load    */
110         /*mW     budget  gpu(khz) mem(khz)  budget  gpu(khz) mem(khz) pthrot(mW) */
111         {5000,  {1500,  108000, 933000}, {1500,  108000, 933000 }, 918 },
112         {6000,  {3000,  108000, 933000}, {3000,  108000, 933000 }, 2109 },
113         {7000,  {4000,  108000, 933000}, {3000,  180000, 933000 }, 2589 },
114         {8000,  {5000,  108000, 933000}, {3000,  252000, 933000 }, 3068 },
115         {9000,  {6000,  180000, 933000}, {2500,  396000, 933000 }, 3630 },
116         {10000, {7000,  108000, 933000}, {3500,  396000, 933000 }, 4425 },
117         {11000, {7000,  252000, 933000}, {4000,  468000, 933000 }, 5301 },
118         {12000, {8000,  180000, 933000}, {3000,  540000, 933000 }, 5348 },
119         {13000, {9000,  108000, 933000}, {5000,  540000, 933000 }, 6969 },
120         {14000, {10000, 108000, 933000}, {3500,  612000, 933000 }, 6846 },
121         {15000, {10000, 180000, 933000}, {4000,  648000, 933000 }, 7880 },
122         {16000, {10000, 252000, 933000}, {3500,  684000, 933000 }, 8120 },
123         {17000, {10000, 396000, 933000}, {4000,  708000, 933000 }, 9024 },
124         {18000, {10000, 396000, 933000}, {3000,  756000, 933000 }, 9252 },
125         {19000, {10000, 468000, 933000}, {4000,  756000, 933000 }, 10046 },
126         {20000, {10000, 540000, 933000}, {5000,  756000, 933000 }, 10873 },
127         {21000, {10000, 540000, 933000}, {3500,  804000, 933000 }, 10909 },
128         {22000, {10000, 612000, 933000}, {4000,  804000, 933000 }, 11306 },
129         {23000, {10000, 648000, 933000}, {4000,  853000, 933000 }, 12696 },
130         {24000, {10000, 708000, 933000}, {5000,  853000, 933000 }, 13524 },
131         {25000, {10000, 708000, 933000}, {5000,  853000, 933000 }, 13524 },
132         {26000, {10000, 708000, 933000}, {6000,  853000, 933000 }, 14049 },
133         {27000, {10000, 756000, 933000}, {7000,  853000, 933000 }, 15002 },
134         {28000, {10000, 756000, 933000}, {8000,  853000, 933000 }, 15071 },
135         {29000, {10000, 804000, 933000}, {8000,  853000, 933000 }, 15621 },
136         {30000, {10000, 804000, 933000}, {8000,  853000, 933000 }, 15621 },
137         {31000, {10000, 804000, 933000}, {8000,  853000, 933000 }, 15621 },
138         {32000, {10000, 804000, 933000}, {9000,  853000, 933000 }, 16331 },
139         {33000, {10000, 853000, 933000}, {10000, 853000, 933000 }, 17721 },
140 };
141
142 static struct tegra_sysedp_corecap cd570m_sysedp_corecap[] = {
143 /*
144 CD570M
145 GPU MaxF        648000 KHz
146 CPU MaxBudget   10000  mW
147 */
148         /*mW     CPU intensive load        GPU intensive load    */
149         /*mW     budget  gpu(khz) mem(khz)  budget  gpu(khz) mem(khz) pthrot(mW)*/
150         {5000,  {1500,  108000, 933000}, {1500,  108000, 933000}, 918 },
151         {6000,  {3000,  108000, 933000}, {3000,  108000, 933000}, 2109 },
152         {7000,  {4000,  108000, 933000}, {3000,  180000, 933000}, 2589 },
153         {8000,  {5000,  108000, 933000}, {3000,  252000, 933000}, 3068 },
154         {9000,  {6000,  180000, 933000}, {2500,  396000, 933000}, 3630 },
155         {10000, {7000,  108000, 933000}, {3500,  396000, 933000}, 4425 },
156         {11000, {7000,  252000, 933000}, {4000,  468000, 933000}, 5301 },
157         {12000, {8000,  180000, 933000}, {3000,  540000, 933000}, 5348 },
158         {13000, {9000,  108000, 933000}, {5000,  540000, 933000}, 6969 },
159         {14000, {10000, 108000, 933000}, {3500,  612000, 933000}, 6846 },
160         {15000, {10000, 180000, 933000}, {4000,  648000, 933000}, 7880 },
161         {16000, {10000, 252000, 933000}, {5000,  648000, 933000}, 8707 },
162         {17000, {10000, 396000, 933000}, {6000,  648000, 933000}, 9636 },
163         {18000, {10000, 396000, 933000}, {7000,  648000, 933000}, 9846 },
164         {19000, {10000, 468000, 933000}, {7000,  648000, 933000}, 10185 },
165         {20000, {10000, 540000, 933000}, {7000,  648000, 933000}, 10185 },
166         {21000, {10000, 540000, 933000}, {8000,  648000, 933000}, 10804 },
167         {22000, {10000, 612000, 933000}, {9000,  648000, 933000}, 12904 },
168         {23000, {10000, 648000, 933000}, {10000, 648000, 933000}, 12904 },
169         {24000, {10000, 648000, 933000}, {10000, 648000, 933000}, 12904 },
170         {25000, {10000, 648000, 933000}, {10000, 648000, 933000}, 12904 },
171         {26000, {10000, 648000, 933000}, {10000, 648000, 933000}, 12904 },
172         {27000, {10000, 648000, 933000}, {10000, 648000, 933000}, 12904 },
173         {28000, {10000, 648000, 933000}, {10000, 648000, 933000}, 12904 },
174         {29000, {10000, 648000, 933000}, {10000, 648000, 933000}, 12904 },
175         {30000, {10000, 648000, 933000}, {10000, 648000, 933000}, 12904 },
176         {31000, {10000, 648000, 933000}, {10000, 648000, 933000}, 12904 },
177         {32000, {10000, 648000, 933000}, {10000, 648000, 933000}, 12904 },
178         {33000, {10000, 648000, 933000}, {10000, 648000, 933000}, 12904 },
179 };
180
181 struct tegra_sysedp_corecap *tegra_get_sysedp_corecap(unsigned int *sz)
182 {
183         int cpu_speedo_id;
184         int gpu_speedo_id;
185
186         BUG_ON(sz == NULL);
187
188         cpu_speedo_id = tegra_cpu_speedo_id();
189         gpu_speedo_id = tegra_gpu_speedo_id();
190
191         switch (cpu_speedo_id) {
192         case 0x6:
193         case 0x5:
194         case 0x2:
195                 if (gpu_speedo_id == 1) {
196                         /* 575 variants */
197                         *sz = ARRAY_SIZE(td575d_sysedp_corecap);
198                         return td575d_sysedp_corecap;
199                 } else {
200                         /* CD570M */
201                         *sz = ARRAY_SIZE(cd570m_sysedp_corecap);
202                         return cd570m_sysedp_corecap;
203                 }
204
205         case 0x3:
206         case 0x1:
207                 /* 580 variants */
208                 *sz = ARRAY_SIZE(td580d_sysedp_corecap);
209                 return td580d_sysedp_corecap;
210
211
212         default:
213                 pr_warn("%s: Unknown cpu_speedo_id, 0x%x. "
214                         " Assuming td570d sysedp_corecap table.\n",
215                         __func__, cpu_speedo_id);
216                 /* intentional fall-through */
217         case 0x0:
218                 /* 570 variants */
219                 *sz = ARRAY_SIZE(td570d_sysedp_corecap);
220                 return td570d_sysedp_corecap;
221         }
222 }
223 #endif
224
225 #ifdef CONFIG_TEGRA_EDP_LIMITS
226
227 #ifdef CONFIG_TEGRA_GPU_EDP
228 static struct tegra_edp_gpu_powermodel_params t12x_gpu_powermodel_params = {
229         .common = {
230                 .temp_scaled      = 10,
231                 .dyn_scaled       = 1000,
232                 .dyn_consts_n     = { 10646, },
233                 .consts_scaled    = 1,
234                 .leakage_consts_n = { 1, },
235                 .ijk_scaled       = 100000,
236                 .leakage_min      = 30,
237                 .leakage_consts_ijk = {
238                         /* i = 0 */
239                         { {  -208796792,   37746202,  -9648869,   725660, },
240                           {   704446675, -133808535,  34470023, -2464142, },
241                           {  -783701649,  146557393, -38623024,  2654269, },
242                           {   292709580,  -51246839,  13984499,  -934964, },
243                         },
244                         /* i = 1 */
245                         { {   115095343,  -65602614,  11251896,  -838394, },
246                           {  -394753929,  263095142, -49006854,  3326269, },
247                           {   441644020, -313320338,  61612126, -3916786, },
248                           {  -164021554,  118634317, -24406245,  1517573, },
249                         },
250                         /* i = 2 */
251                         { {   -38857760,   12243796,  -1964159,   181232, },
252                           {   143265078,  -71110695,  13985680,  -917947, },
253                           {  -171456530,   98906114, -21261015,  1216159, },
254                           {    67437536,  -40520060,   9265259,  -484818, },
255                         },
256                         /* i = 3 */
257                         { {     1795940,    -345535,     83004,   -20007, },
258                           {    -8549105,    6333235,  -1479815,   115441, },
259                           {    12192546,  -10880741,   2632212,  -161404, },
260                           {    -5328587,    4953756,  -1215038,    64556, },
261                         },
262                 },
263         },
264 };
265
266 struct tegra_edp_gpu_powermodel_params *tegra12x_get_gpu_powermodel_params(void)
267 {
268         return &t12x_gpu_powermodel_params;
269 }
270
271 #endif /* CONFIG_TEGRA_GPU_EDP */
272
273 #if !defined(CONFIG_ARCH_TEGRA_13x_SOC)
274 #define LEAKAGE_CONSTS_IJK_COMMON                                       \
275 {                                                                       \
276         /* i = 0 */                                                     \
277         { {  -309609464,    197786326,    -40763150,    1613941, },     \
278           {   964716269,   -569081375,    115781607,   -4206296, },     \
279           {  -994324790,    529664031,   -106360108,    3454033, },     \
280           {   343209442,   -160577505,     31928605,    -895157, },     \
281         },                                                              \
282         /* i = 1 */                                                     \
283         { {   616319664,   -637007187,    137759592,    -7194133,  },   \
284           { -1853817283,   1896032851,   -407407611,    20868220,  },   \
285           {  1824097131,  -1831611624,    390753403,   -19530122,  },   \
286           {  -589155245,    578838526,   -122655676,     5985577,  },   \
287         },                                                              \
288         /* i = 2 */                                                     \
289         { {  -439994037,    455845250,   -104097013,     6191899, },    \
290           {  1354650774,  -1395561938,    318665647,   -18886906, },    \
291           { -1361677255,   1390149678,   -317474532,    18728266, },    \
292           {   447877887,   -451382027,    103201434,    -6046692, },    \
293         },                                                              \
294         /* i = 3 */                                                     \
295         { {    56797556,    -59779544,     13810295,     -848290, },    \
296           {  -175867301,    184753957,    -42708242,     2621537, },    \
297           {   177626357,   -185996541,     43029384,    -2638283, },    \
298           {   -58587547,     61075322,    -14145853,      865351, },    \
299         },                                                              \
300 }
301
302 #define EDP_PARAMS_COMMON_PART                                          \
303 {                                                                       \
304         .temp_scaled      = 10,                                         \
305         .dyn_scaled       = 1000,                                       \
306         .dyn_consts_n     = { 950,  1399, 2166, 3041 },                 \
307         .consts_scaled    = 100,                                        \
308         .leakage_consts_n = { 45, 67, 87, 100 },                        \
309         .ijk_scaled       = 100000,                                     \
310         .leakage_min      = 30,                                         \
311         /* .volt_temp_cap = { 70, 1240 }, - TODO for T124 */            \
312         .leakage_consts_ijk = LEAKAGE_CONSTS_IJK_COMMON                 \
313 }
314
315 static struct tegra_edp_cpu_powermodel_params t12x_cpu_powermodel_params[] = {
316         {
317                 .cpu_speedo_id = 0, /* Engg SKU */
318                 .common = EDP_PARAMS_COMMON_PART,
319         },
320         {
321                 .cpu_speedo_id = 1, /* Prod SKU */
322                 .common = EDP_PARAMS_COMMON_PART,
323         },
324         {
325                 .cpu_speedo_id = 2, /* Prod SKU */
326                 .common = EDP_PARAMS_COMMON_PART,
327         },
328         {
329                 .cpu_speedo_id = 3, /* Prod SKU */
330                 .common = EDP_PARAMS_COMMON_PART,
331         },
332         {
333                 .cpu_speedo_id = 5, /* Prod SKU */
334                 .common = EDP_PARAMS_COMMON_PART,
335         },
336         {
337                 .cpu_speedo_id = 6, /* Prod SKU */
338                 .common = EDP_PARAMS_COMMON_PART,
339         },
340         {
341                 .cpu_speedo_id = 7, /* Prod SKU */
342                 .common = EDP_PARAMS_COMMON_PART,
343         },
344 };
345
346 struct tegra_edp_cpu_powermodel_params *tegra12x_get_cpu_powermodel_params(
347                                                         int index,
348                                                         unsigned int *sz)
349 {
350         BUG_ON(index >= ARRAY_SIZE(t12x_cpu_powermodel_params));
351         if (sz)
352                 *sz = ARRAY_SIZE(t12x_cpu_powermodel_params);
353         return &t12x_cpu_powermodel_params[index];
354 }
355 #endif /* CONFIG_ARCH_TEGRA_12x_SOC && !CONFIG_ARCH_TEGRA_13x_SOC */
356
357 #endif /* CONFIG_TEGRA_EDP_LIMITS */
358
359 #endif /* CONFIG_ARCH_TEGRA_12x_SOC */