coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
vr_config.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <device/pci_ids.h>
4 #include <device/pci_ops.h>
5 #include <fsp/api.h>
6 #include <soc/ramstage.h>
7 #include <soc/vr_config.h>
8 #include <console/console.h>
9 #include <intelblocks/cpulib.h>
10 
11 static const struct vr_config default_configs[NUM_VR_DOMAINS] = {
12  [VR_SYSTEM_AGENT] = {
13  .vr_config_enable = 1,
14  .psi1threshold = VR_CFG_AMP(20),
15  .psi2threshold = VR_CFG_AMP(5),
16  .psi3threshold = VR_CFG_AMP(1),
17  .psi3enable = 1,
18  .psi4enable = 1,
19  .imon_slope = 0,
20  .imon_offset = 0,
21  .icc_max = 0,
22  .voltage_limit = 1520,
23  },
24  [VR_IA_CORE] = {
25  .vr_config_enable = 1,
26  .psi1threshold = VR_CFG_AMP(20),
27  .psi2threshold = VR_CFG_AMP(5),
28  .psi3threshold = VR_CFG_AMP(1),
29  .psi3enable = 1,
30  .psi4enable = 1,
31  .imon_slope = 0,
32  .imon_offset = 0,
33  .icc_max = 0,
34  .voltage_limit = 1520,
35  },
36  [VR_GT_UNSLICED] = {
37  .vr_config_enable = 1,
38  .psi1threshold = VR_CFG_AMP(20),
39  .psi2threshold = VR_CFG_AMP(5),
40  .psi3threshold = VR_CFG_AMP(1),
41  .psi3enable = 1,
42  .psi4enable = 1,
43  .imon_slope = 0,
44  .imon_offset = 0,
45  .icc_max = 0,
46  .voltage_limit = 1520,
47  },
48  [VR_GT_SLICED] = {
49  .vr_config_enable = 1,
50  .psi1threshold = VR_CFG_AMP(20),
51  .psi2threshold = VR_CFG_AMP(5),
52  .psi3threshold = VR_CFG_AMP(1),
53  .psi3enable = 1,
54  .psi4enable = 1,
55  .imon_slope = 0,
56  .imon_offset = 0,
57  .icc_max = 0,
58  .voltage_limit = 1520,
59  },
60 };
61 
64  enum chip_pl2_4_cfg pl2_4_cfg; /* Use 'value_not_set' for don't care */
66 };
67 
68 struct vr_lookup {
71  const struct vr_lookup_item *items;
72 };
73 
74 #define VR_CONFIG(x, y) \
75  static const struct vr_lookup_item vr_config_##x##_##y[] =
76 #define VR_CONFIG_ICC(x) VR_CONFIG(x, ICC)
77 #define VR_CONFIG_LL(x) VR_CONFIG(x, LL)
78 #define VR_CONFIG_TDC(x) VR_CONFIG(x, TDC)
79 
80 #define VR_REFITEM(x, y) { x, ARRAY_SIZE(vr_config_##x##_##y), vr_config_##x##_##y}
81 #define VR_REFITEM_ICC(x) VR_REFITEM(x, ICC)
82 #define VR_REFITEM_LL(x) VR_REFITEM(x, LL)
83 #define VR_REFITEM_TDC(x) VR_REFITEM(x, TDC)
84 
85 static uint16_t load_table(const struct vr_lookup *tbl,
86  const int tbl_entries,
87  const int domain,
88  const uint16_t tdp,
89  const uint16_t mch_id)
90 {
91  const config_t *cfg = config_of_soc();
92 
93  for (size_t i = 0; i < tbl_entries; i++) {
94  if (tbl[i].mchid != mch_id)
95  continue;
96 
97  for (size_t j = 0; j < tbl[i].num_items; j++) {
98  if (tbl[i].items[j].tdp_min > tdp)
99  continue;
100 
101  if ((tbl[i].items[j].pl2_4_cfg != value_not_set) &&
102  (tbl[i].items[j].pl2_4_cfg != cfg->cpu_pl2_4_cfg))
103  continue;
104 
105  return tbl[i].items[j].conf[domain];
106  }
107  break;
108  }
109 
110  printk(BIOS_ERR, "Unknown MCH (0x%x) in %s\n", mch_id, __func__);
111 
112  return 0;
113 }
114 
115 /*
116  * Iccmax table from Doc #337344 Section 7.2 DC Specifications for CFL.
117  * Iccmax table from Doc #338023 Section 7.2 DC Specifications for WHL.
118  * Iccmax table from Doc #606599 Section 7.2 DC Specifications for CML.
119  *
120  * Platform Segment SA IA GT (GT/GTx)
121  * ---------------------------------------------------------------------
122  * CFL-U (28W) GT3 quad 8.5 64 64
123  * CFL-U (28W) GT3 dual 8.5 64 64
124  *
125  * CFL-H (45W) GT2 hex 11.1 128 0
126  * CFL-H (45W) GT2 quad 11.1 86 0
127  *
128  * CFL-S (95W) GT2 octa 11.1 193 45
129  *
130  * CFL-S (95W) GT2 hex 11.1 138 45
131  * CFL-S (65W) GT2 hex 11.1 133 45
132  * CFL-S (80W) GT2 hex 11.1 133 45
133  * CFL-S (35W) GT2 hex 11.1 104 35
134  *
135  * CFL-S (91W) GT2 quad 11.1 100 45
136  * CFL-S (83W) GT2 quad 11.1 100 45
137  * CFL-S (71W) GT2 quad 11.1 100 45
138  * CFL-S (65W) GT2 quad 11.1 79 45
139  * CFL-S (62W) GT2 quad 11.1 79 45
140  * CFL-S (35W) GT2 quad 11.1 66 35
141  *
142  * CFL-S (58W) GT2 dual 11.1 79 45
143  * CFL-S (54W) GT2 dual 11.1 58 45
144  * CFL-S (35W) GT2 dual 11.1 40 35
145  *
146  * CNL-U (15W) 13 34 0
147  *
148  * WHL-U (15W) GT2 quad 6 70 31
149  * WHL-U (15W) GT2 dual 6 35 31
150  *
151  * CML-U v1/v2 (15W) GT2 hex 6 85(70) 31
152  * CML-U v1/v2 (15W) GT2 quad 6 85(70) 31
153  * CML-U v1/v2 (15W) GT2 dual 6 35 31
154  *
155  * CML-H (65W) GT2 octa 11.1 192(165) 32
156  * CML-H (45W) GT2 octa 11.1 165(140) 32
157  * CML-H (45W) GT2 hex 11.1 140(128) 32
158  * CML-H (45W) GT2 quad 11.1 105(86) 32
159  *
160  * CML-S (125W)GT2 deca 11.1 245(210) 35
161  * CML-S (125W)GT2 octa 11.1 245(210) 35
162  * CML-S (125W)GT2 hex 11.1 140 35
163  * CML-S XeonW (80W) GT2 deca 11.1 210 35
164  * CML-S XeonW (80W) GT2 octa 11.1 210 35
165  * CML-S XeonW (80W) GT2 hex 11.1 140 35
166  * CML-S (65W) GT2 deca 11.1 210(175) 35
167  * CML-S (65W) GT2 octa 11.1 210(175) 35
168  * CML-S (65W) GT2 hex 11.1 140 35
169  * CML-S (35W) GT2 deca 11.1 140(104) 35
170  * CML-S (35W) GT2 octa 11.1 140(104) 35
171  * CML-S (35W) GT2 hex 11.1 104 35
172  * CML-S (65W) GT2 quad 11.1 102 35
173  * CML-S (35W) GT2 quad 11.1 65 35
174  * CML-S (58W) GT2 dual 11.1 60 35
175  * CML-S (35W) GT2 dual 11.1 55 35
176  *
177  * GT0 versions are the same as GT2/GT3, but have GT/GTx set to 0.
178  * The above values in () are for baseline.
179  */
180 
182  { 0, value_not_set, VR_CFG_ALL_DOMAINS_ICC(13, 34, 0, 0) },
183 };
185  { 0, value_not_set, VR_CFG_ALL_DOMAINS_ICC(13, 34, 0, 0) },
186 };
188  { 0, value_not_set, VR_CFG_ALL_DOMAINS_ICC(6, 70, 31, 31) },
189 };
191  { 0, value_not_set, VR_CFG_ALL_DOMAINS_ICC(6, 35, 31, 31) },
192 };
194  { 0, value_not_set, VR_CFG_ALL_DOMAINS_ICC(8.5, 64, 64, 64) },
195 };
197  { 0, value_not_set, VR_CFG_ALL_DOMAINS_ICC(8.5, 64, 64, 64) },
198 };
200  { 0, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 128, 0, 0) },
201 };
203  { 0, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 128, 0, 0) },
204 };
206  { 0, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 86, 0, 0) },
207 };
209  { 58, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 79, 35, 35) },
210  { 54, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 58, 45, 45) },
211  { 0, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 40, 35, 35) },
212 };
214  { 71, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 100, 45, 45) },
215  { 62, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 79, 45, 45) },
216  { 35, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 66, 35, 35) },
217 };
219  { 80, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 193, 45, 45) },
220  { 65, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 186, 45, 45) },
221  { 0, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 104, 35, 35) },
222 };
224  { 80, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 193, 45, 45) },
225  { 65, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 186, 45, 45) },
226  { 0, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 104, 35, 35) },
227 };
229  { 80, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 193, 45, 45) },
230  { 65, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 186, 45, 45) },
231  { 0, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 104, 35, 35) },
232 };
234  { 95, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 138, 45, 45) },
235  { 65, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 133, 45, 45) },
236  { 54, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 104, 45, 45) },
237  { 0, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 104, 35, 35) },
238 };
240  { 95, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 138, 45, 45) },
241  { 65, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 133, 45, 45) },
242  { 54, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 104, 45, 45) },
243  { 0, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 104, 35, 35) },
244 };
246  { 95, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 138, 45, 45) },
247  { 65, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 133, 45, 45) },
248  { 54, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 104, 45, 45) },
249  { 0, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 104, 35, 35) },
250 };
252  { 71, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 100, 45, 45) },
253  { 62, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 79, 45, 45) },
254  { 54, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 66, 45, 45) },
255  { 0, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 66, 35, 35) },
256 };
258  { 0, performance, VR_CFG_ALL_DOMAINS_ICC(6, 85, 31, 31) },
259  { 0, baseline, VR_CFG_ALL_DOMAINS_ICC(6, 70, 31, 31) },
260 };
262  { 0, performance, VR_CFG_ALL_DOMAINS_ICC(6, 85, 31, 31) },
263  { 0, baseline, VR_CFG_ALL_DOMAINS_ICC(6, 70, 31, 31) },
264 };
266  { 0, value_not_set, VR_CFG_ALL_DOMAINS_ICC(6, 35, 31, 31) },
267 };
269  { 65, baseline, VR_CFG_ALL_DOMAINS_ICC(11.1, 165, 32, 32) },
270  { 65, performance, VR_CFG_ALL_DOMAINS_ICC(11.1, 192, 32, 32) },
271  { 0, baseline, VR_CFG_ALL_DOMAINS_ICC(11.1, 140, 32, 32) },
272  { 0, performance, VR_CFG_ALL_DOMAINS_ICC(11.1, 165, 32, 32) },
273 };
275  { 0, performance, VR_CFG_ALL_DOMAINS_ICC(11.1, 140, 32, 32) },
276  { 0, baseline, VR_CFG_ALL_DOMAINS_ICC(11.1, 140, 32, 32) },
277 };
279  { 0, performance, VR_CFG_ALL_DOMAINS_ICC(11.1, 105, 32, 32) },
280  { 0, baseline, VR_CFG_ALL_DOMAINS_ICC(11.1, 86, 32, 32) },
281 };
283  {125, performance, VR_CFG_ALL_DOMAINS_ICC(11.1, 245, 35, 35) },
284  {125, baseline, VR_CFG_ALL_DOMAINS_ICC(11.1, 210, 35, 35) },
285  { 80, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 210, 35, 35) },
286  { 65, performance, VR_CFG_ALL_DOMAINS_ICC(11.1, 210, 35, 35) },
287  { 65, baseline, VR_CFG_ALL_DOMAINS_ICC(11.1, 175, 35, 35) },
288  { 0, performance, VR_CFG_ALL_DOMAINS_ICC(11.1, 140, 35, 35) },
289  { 0, baseline, VR_CFG_ALL_DOMAINS_ICC(11.1, 104, 35, 35) },
290 };
292  {125, performance, VR_CFG_ALL_DOMAINS_ICC(11.1, 245, 35, 35) },
293  {125, baseline, VR_CFG_ALL_DOMAINS_ICC(11.1, 210, 35, 35) },
294  { 80, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 210, 35, 35) },
295  { 65, performance, VR_CFG_ALL_DOMAINS_ICC(11.1, 210, 35, 35) },
296  { 65, baseline, VR_CFG_ALL_DOMAINS_ICC(11.1, 175, 35, 35) },
297  { 0, performance, VR_CFG_ALL_DOMAINS_ICC(11.1, 140, 35, 35) },
298  { 0, baseline, VR_CFG_ALL_DOMAINS_ICC(11.1, 104, 35, 35) },
299 };
301  { 65, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 140, 35, 35) },
302  { 0, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 104, 35, 35) },
303 };
305  { 36, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 102, 35, 35) },
306  { 0, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 65, 35, 35) },
307 };
309  { 36, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 60, 35, 35) },
310  { 0, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 55, 35, 35) },
311 };
312 
313 static const struct vr_lookup vr_config_icc[] = {
343 };
344 
346  { 0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 2.4, 2.0, 2.0) },
347 };
349  { 0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 2.4, 2.0, 2.0) },
350 };
352  { 0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 1.8, 0, 0) },
353 };
355  { 0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 2.4, 0, 0) },
356 };
358  { 0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 2.4, 2.0, 2.0) },
359 };
361  { 0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 2.4, 2.0, 2.0) },
362 };
364  { 0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 1.8, 2.7, 2.7) },
365 };
367  { 0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 1.8, 2.7, 2.7) },
368 };
370  { 0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 1.8, 2.7, 2.7) },
371 };
373  { 0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 2.1, 3.1, 3.1) },
374 };
376  { 0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 2.1, 3.1, 3.1) },
377 };
379  { 0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 2.1, 3.1, 3.1) },
380 };
382  { 0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 1.6, 3.1, 3.1) },
383 };
385  { 0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 1.6, 3.1, 3.1) },
386 };
388  { 0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 1.6, 3.1, 3.1) },
389 };
391  { 0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 2.1, 3.1, 3.1) },
392 };
394  { 0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 2.1, 3.1, 3.1) },
395 };
397  { 0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 2.1, 3.1, 3.1) },
398 };
400  { 0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 2.1, 3.1, 3.1) },
401 };
403  { 0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 1.8, 3.1, 3.1) },
404 };
406  { 0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 1.8, 3.1, 3.1) },
407 };
409  { 0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 2.4, 3.1, 3.1) },
410 };
412  { 0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 1.1, 2.7, 2.7) },
413 };
415  { 0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 1.1, 2.7, 2.7) },
416 };
418  { 0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 1.1, 2.7, 2.7) },
419 };
421  { 36, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 1.1, 4.0, 4.0) },
422  { 0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 1.7, 4.0, 4.0) },
423 };
425  { 36, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 1.1, 4.0, 4.0) },
426  { 0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 1.7, 4.0, 4.0) },
427 };
429  {125, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 1.1, 4.0, 4.0) },
430  { 0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 1.7, 4.0, 4.0) },
431 };
433  { 0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 1.7, 4.0, 4.0) },
434 };
436  { 0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 1.7, 4.0, 4.0) },
437 };
438 
439 
440 static const struct vr_lookup vr_config_ll[] = {
471 };
472 
474  { 0, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 80, 25, 25) },
475 };
477  { 58, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 33, 30, 30) },
478  { 54, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 31, 30, 30) },
479  { 0, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 29, 25, 25) },
480 };
482  { 58, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 33, 30, 30) },
483  { 54, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 31, 30, 30) },
484  { 0, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 29, 25, 25) },
485 };
487  { 71, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 70, 30, 30) },
488  { 62, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 62, 30, 30) },
489  { 0, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 45, 25, 25) },
490 };
492  { 71, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 70, 30, 30) },
493  { 62, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 62, 30, 30) },
494  { 0, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 45, 25, 25) },
495 };
497  { 71, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 70, 30, 30) },
498  { 62, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 62, 30, 30) },
499  { 0, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 45, 25, 25) },
500 };
502  { 95, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 100, 30, 30) },
503  { 80, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 89, 30, 30) },
504  { 65, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 91, 30, 30) },
505  { 0, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 74, 25, 25) },
506 };
508  { 95, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 100, 30, 30) },
509  { 80, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 89, 30, 30) },
510  { 65, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 91, 30, 30) },
511  { 0, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 74, 25, 25) },
512 };
514  { 80, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 150, 30, 30) },
515  { 65, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 146, 30, 30) },
516  { 0, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 74, 25, 25) },
517 };
519  { 80, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 150, 30, 30) },
520  { 65, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 146, 30, 30) },
521  { 0, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 74, 25, 25) },
522 };
524  { 80, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 150, 30, 30) },
525  { 65, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 146, 30, 30) },
526  { 0, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 74, 25, 25) },
527 };
529  { 0, baseline, VR_CFG_ALL_DOMAINS_TDC(4, 48, 22, 22) },
530  { 0, performance, VR_CFG_ALL_DOMAINS_TDC(4, 58, 22, 22) },
531 };
533  { 0, baseline, VR_CFG_ALL_DOMAINS_TDC(4, 48, 22, 22) },
534  { 0, performance, VR_CFG_ALL_DOMAINS_TDC(4, 58, 22, 22) },
535 };
537  { 0, value_not_set, VR_CFG_ALL_DOMAINS_TDC(4, 24, 22, 22) },
538 };
540  { 65, performance, VR_CFG_ALL_DOMAINS_TDC(10, 146, 25, 25) },
541  { 65, baseline, VR_CFG_ALL_DOMAINS_TDC(10, 117, 25, 25) },
542  { 0, performance, VR_CFG_ALL_DOMAINS_TDC(10, 125, 25, 25) },
543  { 0, baseline, VR_CFG_ALL_DOMAINS_TDC(10, 86, 25, 25) },
544 };
546  { 0, performance, VR_CFG_ALL_DOMAINS_TDC(10, 92, 25, 25) },
547  { 0, baseline, VR_CFG_ALL_DOMAINS_TDC(10, 80, 25, 25) },
548 };
550  { 0, performance, VR_CFG_ALL_DOMAINS_TDC(10, 80, 25, 25) },
551  { 0, baseline, VR_CFG_ALL_DOMAINS_TDC(10, 60, 25, 25) },
552 };
554  { 36, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 175, 28, 28) },
555  { 0, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 100, 28, 28) },
556 };
558  { 36, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 175, 28, 28) },
559  { 0, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 100, 28, 28) },
560 };
562  {125, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 132, 28, 28) },
563  { 65, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 104, 28, 28) },
564  { 0, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 74, 28, 28) },
565 };
567  { 36, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 68, 28, 28) },
568  { 0, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 42, 28, 28) },
569 };
571  { 36, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 38, 28, 28) },
572  { 0, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 25, 28, 28) },
573 };
574 
575 static const struct vr_lookup vr_config_tdc[] = {
598 };
599 
600 static uint16_t get_sku_voltagelimit(int domain)
601 {
602  return 1520;
603 }
604 
605 static uint16_t get_sku_icc_max(const int domain,
606  const uint16_t tdp,
607  const uint16_t mch_id,
608  const uint16_t igd_id)
609 {
610  if (igd_id == 0xffff && ((domain == VR_GT_SLICED) || (domain == VR_GT_UNSLICED)))
611  return 0;
612 
613  return load_table(vr_config_icc, ARRAY_SIZE(vr_config_icc), domain, tdp, mch_id);
614 }
615 
617  int domain, const struct vr_config *chip_cfg)
618 {
619  FSP_S_CONFIG *vr_params = (FSP_S_CONFIG *)params;
620  const struct vr_config *cfg;
621  static uint16_t mch_id = 0, igd_id = 0;
622  const uint16_t tdp = cpu_get_power_max() / 1000;
623 
624  if (!mch_id) {
626  mch_id = dev ? pci_read_config16(dev, PCI_DEVICE_ID) : 0xffff;
627  }
628  if (!igd_id) {
629  struct device *dev = pcidev_path_on_root(SA_DEVFN_IGD);
630  igd_id = dev ? pci_read_config16(dev, PCI_DEVICE_ID) : 0xffff;
631  }
632 
633  if (domain < 0 || domain >= NUM_VR_DOMAINS)
634  return;
635 
636  /* Use device tree override if requested. */
637  if (chip_cfg->vr_config_enable)
638  cfg = chip_cfg;
639  else
640  cfg = &default_configs[domain];
641 
642  vr_params->VrConfigEnable[domain] = cfg->vr_config_enable;
643  vr_params->Psi1Threshold[domain] = cfg->psi1threshold;
644  vr_params->Psi2Threshold[domain] = cfg->psi2threshold;
645  vr_params->Psi3Threshold[domain] = cfg->psi3threshold;
646  vr_params->Psi3Enable[domain] = cfg->psi3enable;
647  vr_params->Psi4Enable[domain] = cfg->psi4enable;
648  vr_params->ImonSlope[domain] = cfg->imon_slope;
649  vr_params->ImonOffset[domain] = cfg->imon_offset;
650  printk(BIOS_INFO, "VR config[%d]:\n", domain);
651  printk(BIOS_INFO, " Psi1Threshold: %u\n", cfg->psi1threshold);
652  printk(BIOS_INFO, " Psi2Threshold: %u\n", cfg->psi2threshold);
653  printk(BIOS_INFO, " Psi3Threshold: %u\n", cfg->psi3threshold);
654  printk(BIOS_INFO, " Psi3Enable: %u\n", cfg->psi3enable);
655  printk(BIOS_INFO, " Psi4Enable: %u\n", cfg->psi4enable);
656  printk(BIOS_INFO, " ImonSlope: %u\n", cfg->imon_slope);
657  printk(BIOS_INFO, " ImonOffset: %u\n", cfg->imon_offset);
658 
659  /* If board provided non-zero value, use it. */
660  if (cfg->voltage_limit)
661  vr_params->VrVoltageLimit[domain] = cfg->voltage_limit;
662  else
663  vr_params->VrVoltageLimit[domain] = get_sku_voltagelimit(domain);
664  printk(BIOS_INFO, " VrVoltageLimit: %u\n", vr_params->VrVoltageLimit[domain]);
665 
666  if (cfg->icc_max)
667  vr_params->IccMax[domain] = cfg->icc_max;
668  else
669  vr_params->IccMax[domain] = get_sku_icc_max(domain, tdp, mch_id, igd_id);
670  printk(BIOS_INFO, " IccMax: %u\n", vr_params->IccMax[domain]);
671 
672  if (cfg->ac_loadline)
673  vr_params->AcLoadline[domain] = cfg->ac_loadline;
674  else
675  vr_params->AcLoadline[domain] = load_table(vr_config_ll,
677  domain, tdp, mch_id);
678  printk(BIOS_INFO, " AcLoadline: %u\n", vr_params->AcLoadline[domain]);
679 
680  if (cfg->dc_loadline)
681  vr_params->DcLoadline[domain] = cfg->dc_loadline;
682  else
683  vr_params->DcLoadline[domain] = load_table(vr_config_ll,
685  domain, tdp, mch_id);
686  printk(BIOS_INFO, " DcLoadline: %u\n", vr_params->DcLoadline[domain]);
687 
688  vr_params->TdcEnable[domain] = !cfg->tdc_disable;
689  printk(BIOS_INFO, " TdcEnable: %u\n", vr_params->TdcEnable[domain]);
690 
691  if (cfg->tdc_powerlimit)
692  vr_params->TdcPowerLimit[domain] = cfg->tdc_powerlimit;
693  else
694  vr_params->TdcPowerLimit[domain] = load_table(vr_config_tdc,
696  domain, tdp, mch_id);
697  printk(BIOS_INFO, " TdcPowerLimit: %u\n", vr_params->TdcPowerLimit[domain]);
698 }
#define VR_CFG_ALL_DOMAINS_ICC(ia, gt)
Definition: vr_config.h:52
#define VR_CFG_ALL_DOMAINS_TDC(ia, gt)
Definition: vr_config.h:58
@ NUM_VR_DOMAINS
Definition: vr_config.h:43
#define VR_CFG_ALL_DOMAINS_LOADLINE(ia, gt)
Definition: vr_config.h:46
#define VR_CFG_AMP(i)
Definition: vr_config.h:33
void fill_vr_domain_config(FSP_S_CONFIG *s_cfg, int domain, const struct vr_config *chip_cfg)
Definition: vr_config.c:113
static struct sdram_info params
Definition: sdram_configs.c:83
#define ARRAY_SIZE(a)
Definition: helpers.h:12
@ VR_GT_UNSLICED
Definition: vr_config.h:62
@ VR_GT_SLICED
Definition: vr_config.h:63
@ VR_IA_CORE
Definition: vr_config.h:61
@ VR_SYSTEM_AGENT
Definition: vr_config.h:60
#define VR_REFITEM_TDC(x)
Definition: vr_config.c:83
#define VR_REFITEM_LL(x)
Definition: vr_config.c:82
#define VR_CONFIG_ICC(x)
Definition: vr_config.c:76
static uint16_t load_table(const struct vr_lookup *tbl, const int tbl_entries, const int domain, const uint16_t tdp, const uint16_t mch_id)
Definition: vr_config.c:85
#define VR_REFITEM_ICC(x)
Definition: vr_config.c:81
static const struct vr_lookup vr_config_icc[]
Definition: vr_config.c:313
static uint16_t get_sku_icc_max(const int domain, const uint16_t tdp, const uint16_t mch_id, const uint16_t igd_id)
Definition: vr_config.c:605
static const struct vr_lookup vr_config_tdc[]
Definition: vr_config.c:575
static const struct vr_lookup vr_config_ll[]
Definition: vr_config.c:440
#define VR_CONFIG_LL(x)
Definition: vr_config.c:77
#define VR_CONFIG_TDC(x)
Definition: vr_config.c:78
static const struct vr_config default_configs[NUM_VR_DOMAINS]
Definition: vr_config.c:11
static uint16_t get_sku_voltagelimit(int domain)
Definition: vr_config.c:600
#define printk(level,...)
Definition: stdlib.h:16
uint32_t cpu_get_power_max(void)
Definition: cpulib.c:358
DEVTREE_CONST struct device * pcidev_path_on_root(pci_devfn_t devfn)
Definition: device_const.c:255
#define FSP_S_CONFIG
Definition: fsp_upd.h:9
#define config_of_soc()
Definition: device.h:394
static __always_inline u16 pci_read_config16(const struct device *dev, u16 reg)
Definition: pci_ops.h:52
#define BIOS_INFO
BIOS_INFO - Expected events.
Definition: loglevel.h:113
#define BIOS_ERR
BIOS_ERR - System in incomplete state.
Definition: loglevel.h:72
#define PCI_DEVICE_ID
Definition: pci_def.h:9
#define PCI_DID_INTEL_CML_H_4_2
Definition: pci_ids.h:4016
#define PCI_DID_INTEL_CFL_ID_U
Definition: pci_ids.h:3986
#define PCI_DID_INTEL_CML_S_P0P1_10_2
Definition: pci_ids.h:4010
#define PCI_DID_INTEL_CFL_ID_S_WS_4
Definition: pci_ids.h:3995
#define PCI_DID_INTEL_CFL_ID_S_S_6
Definition: pci_ids.h:3999
#define PCI_DID_INTEL_CML_S_P0P1_8_2
Definition: pci_ids.h:4011
#define PCI_DID_INTEL_WHL_ID_W_4
Definition: pci_ids.h:3984
#define PCI_DID_INTEL_CML_S_G0G1_2
Definition: pci_ids.h:4014
#define PCI_DID_INTEL_CML_S_G0G1_P0P1_6_2
Definition: pci_ids.h:4012
#define PCI_DID_INTEL_CFL_ID_S_WS_8
Definition: pci_ids.h:3997
#define PCI_DID_INTEL_CFL_ID_S_DT_2
Definition: pci_ids.h:3992
#define PCI_DID_INTEL_CFL_ID_H_8
Definition: pci_ids.h:3990
#define PCI_DID_INTEL_CFL_ID_S
Definition: pci_ids.h:3991
#define PCI_DID_INTEL_CNL_ID_U
Definition: pci_ids.h:3982
#define PCI_DID_INTEL_CFL_ID_S_DT_4
Definition: pci_ids.h:3993
#define PCI_DID_INTEL_CFL_ID_H_4
Definition: pci_ids.h:3989
#define PCI_DID_INTEL_CFL_ID_U_2
Definition: pci_ids.h:3987
#define PCI_DID_INTEL_CML_ULT_6_2
Definition: pci_ids.h:4007
#define PCI_DID_INTEL_CML_S_G0G1_4
Definition: pci_ids.h:4013
#define PCI_DID_INTEL_CNL_ID_Y
Definition: pci_ids.h:3983
#define PCI_DID_INTEL_CFL_ID_S_WS_6
Definition: pci_ids.h:3996
#define PCI_DID_INTEL_CFL_ID_S_DT_8
Definition: pci_ids.h:3994
#define PCI_DID_INTEL_CFL_ID_H
Definition: pci_ids.h:3988
#define PCI_DID_INTEL_CML_ULT
Definition: pci_ids.h:4005
#define PCI_DID_INTEL_CML_H_8_2
Definition: pci_ids.h:4017
#define PCI_DID_INTEL_CFL_ID_S_S_8
Definition: pci_ids.h:4000
#define PCI_DID_INTEL_CML_ULT_2_2
Definition: pci_ids.h:4006
#define PCI_DID_INTEL_WHL_ID_W_2
Definition: pci_ids.h:3985
#define PCI_DID_INTEL_CFL_ID_S_S_4
Definition: pci_ids.h:3998
#define PCI_DID_INTEL_CML_H
Definition: pci_ids.h:4015
u16 mchid
#define SA_DEVFN_ROOT
Definition: pci_devs.h:23
#define SA_DEVFN_IGD
Definition: pci_devs.h:32
chip_pl2_4_cfg
Definition: chip.h:31
@ value_not_set
Definition: chip.h:34
@ performance
Definition: chip.h:33
@ baseline
Definition: chip.h:32
unsigned short uint16_t
Definition: stdint.h:11
unsigned char uint8_t
Definition: stdint.h:8
Definition: device.h:107
uint16_t psi1threshold
Definition: vr_config.h:18
uint16_t icc_max
Definition: vr_config.h:22
uint8_t imon_slope
Definition: vr_config.h:28
uint8_t tdc_disable
Definition: vr_config.h:46
uint16_t psi3threshold
Definition: vr_config.h:20
uint16_t psi2threshold
Definition: vr_config.h:19
uint8_t psi4enable
Definition: vr_config.h:24
bool vr_config_enable
Definition: vr_config.h:13
uint16_t ac_loadline
Definition: vr_config.h:17
uint16_t tdc_powerlimit
Definition: vr_config.h:49
uint16_t dc_loadline
Definition: vr_config.h:18
uint8_t imon_offset
Definition: vr_config.h:32
uint16_t voltage_limit
Definition: vr_config.h:38
uint8_t psi3enable
Definition: vr_config.h:23
enum chip_pl2_4_cfg pl2_4_cfg
Definition: vr_config.c:64
uint16_t conf[NUM_VR_DOMAINS]
Definition: vr_config.c:65
uint16_t tdp_min
Definition: vr_config.c:63
uint8_t tdp
Definition: vr_config.c:43
const struct vr_lookup_item * items
Definition: vr_config.c:71
uint8_t num_items
Definition: vr_config.c:70
uint16_t mchid
Definition: vr_config.c:42