blob: 629469d48e209531bf50428f3e696f4ff5146808 [file] [log] [blame]
Angel Pons27123982020-04-05 13:22:30 +02001/* SPDX-License-Identifier: GPL-2.0-only */
amanda_hwangb3b47e12018-03-08 11:04:40 +08002
Shelley Chen467cce42018-03-07 14:22:28 -08003#include <arch/cpu.h>
4#include <assert.h>
5#include <baseboard/variants.h>
Furquan Shaikhf5b7e802018-05-07 14:42:27 -07006#include <cbfs.h>
amanda_hwangb3b47e12018-03-08 11:04:40 +08007#include <chip.h>
Elyes HAOUAS20eaef02019-03-29 17:45:28 +01008#include <console/console.h>
Subrata Banik75f927602021-07-18 13:41:50 +05309#include <cpu/intel/cpu_ids.h>
amanda_hwangb3b47e12018-03-08 11:04:40 +080010#include <device/device.h>
Furquan Shaikhc6141b92018-05-10 21:58:39 -070011#include <drivers/intel/gma/opregion.h>
amanda_hwangb3b47e12018-03-08 11:04:40 +080012#include <ec/google/chromeec/ec.h>
Sumeet R Pawnikar97c54642020-05-10 01:24:11 +053013#include <intelblocks/power_limit.h>
Shelley Chen467cce42018-03-07 14:22:28 -080014#include <smbios.h>
15#include <soc/ramstage.h>
16#include <string.h>
amanda_hwang04ccd5f2018-03-16 13:43:52 +080017#include <variant/sku.h>
amanda_hwangb3b47e12018-03-08 11:04:40 +080018
Furquan Shaikhe3011452018-05-23 21:27:33 -070019#define PL2_I7_SKU 44
20#define PL2_DEFAULT 29
John Su2257a352018-10-25 19:21:15 +080021#define PL2_KBL_U 25
22
23/* PL2 ID define*/
24#define PL2_ID_DEFAULT 0
25#define PL2_ID_SONA_SYNDRA 1
Ren Kuoa355b162018-12-12 14:39:36 +080026#define PL2_ID_BARD_EKKO 2
John Su2257a352018-10-25 19:21:15 +080027
28static const struct pl2_config {
29 uint32_t cpuid_y0_pl2;
30 uint32_t cpuid_non_y0_pl2;
31} pl2_config_table[] = {
32 [PL2_ID_DEFAULT] = { PL2_I7_SKU, PL2_DEFAULT },
33 [PL2_ID_SONA_SYNDRA] = { PL2_DEFAULT, PL2_KBL_U },
Ren Kuoa355b162018-12-12 14:39:36 +080034 [PL2_ID_BARD_EKKO] = { PL2_DEFAULT, PL2_KBL_U },
John Su2257a352018-10-25 19:21:15 +080035};
Furquan Shaikhe3011452018-05-23 21:27:33 -070036
Gaggery Tsai70627772018-07-26 00:14:09 -070037/* Variant for AKALI */
38#define AKALI_SA_AC_LOADLINE 1100
39#define AKALI_SA_DC_LOADLINE 1028
40#define AKALI_IA_AC_LOADLINE 272
41#define AKALI_IA_DC_LOADLINE 247
42#define AKALI_GT_AC_LOADLINE 314
43#define AKALI_GT_DC_LOADLINE 321
44
45/* We only have Akali and Nami default settings so far */
46enum project_sku {
47 PRJ_AKALI = 1,
48};
49
50static const struct {
51 enum project_sku sku;
52 int ac_loadline[NUM_VR_DOMAINS];
53 int dc_loadline[NUM_VR_DOMAINS];
54} sku_overwrite_mapping[] = {
55 {
56 .sku = PRJ_AKALI,
57 .ac_loadline = {
58 AKALI_SA_AC_LOADLINE,
59 AKALI_IA_AC_LOADLINE,
60 AKALI_GT_AC_LOADLINE,
61 AKALI_GT_AC_LOADLINE
62 },
63 .dc_loadline = {
64 AKALI_SA_DC_LOADLINE,
65 AKALI_IA_DC_LOADLINE,
66 AKALI_GT_DC_LOADLINE,
67 AKALI_GT_DC_LOADLINE
68 }
69 },
70};
71
John Su2257a352018-10-25 19:21:15 +080072static uint32_t get_pl2(int pl2_id)
Furquan Shaikhe3011452018-05-23 21:27:33 -070073{
John Su2257a352018-10-25 19:21:15 +080074 assert(pl2_id < ARRAY_SIZE(pl2_config_table));
Furquan Shaikhe3011452018-05-23 21:27:33 -070075 if (cpuid_eax(1) == CPUID_KABYLAKE_Y0)
John Su2257a352018-10-25 19:21:15 +080076 return pl2_config_table[pl2_id].cpuid_y0_pl2;
Furquan Shaikhe3011452018-05-23 21:27:33 -070077
John Su2257a352018-10-25 19:21:15 +080078 return pl2_config_table[pl2_id].cpuid_non_y0_pl2;
Furquan Shaikhe3011452018-05-23 21:27:33 -070079}
80
Zhuohao Leef7b59552018-03-17 05:00:49 +080081uint32_t variant_board_sku(void)
amanda_hwangb3b47e12018-03-08 11:04:40 +080082{
Zhuohao Leef7b59552018-03-17 05:00:49 +080083 static uint32_t sku_id = SKU_UNKNOWN;
amanda_hwangb3b47e12018-03-08 11:04:40 +080084 uint32_t id;
Zhuohao Leef7b59552018-03-17 05:00:49 +080085
86 if (sku_id != SKU_UNKNOWN)
amanda_hwangb3b47e12018-03-08 11:04:40 +080087 return sku_id;
88 if (google_chromeec_cbi_get_sku_id(&id))
89 return SKU_UNKNOWN;
90 sku_id = id;
Zhuohao Leef7b59552018-03-17 05:00:49 +080091
amanda_hwangb3b47e12018-03-08 11:04:40 +080092 return sku_id;
93}
94
Nico Huberebd8a4f2017-11-01 09:49:16 +010095const char *smbios_system_sku(void)
Shelley Chen467cce42018-03-07 14:22:28 -080096{
Zhuohao Leef7b59552018-03-17 05:00:49 +080097 static char sku_str[14]; /* sku{0..4294967295} */
Shelley Chen467cce42018-03-07 14:22:28 -080098
Zhuohao Leef7b59552018-03-17 05:00:49 +080099 snprintf(sku_str, sizeof(sku_str), "sku%u", variant_board_sku());
Shelley Chen467cce42018-03-07 14:22:28 -0800100
101 return sku_str;
102}
Furquan Shaikhf5b7e802018-05-07 14:42:27 -0700103
104#define OEM_UNKNOWN 0xff
105
106/*
107 * Read OEM ID from EC using cbi commands.
108 * Return value:
109 * Success = OEM ID read from EC
110 * Failure = OEM_UNKNOWN (0xff)
111 */
112static uint8_t read_oem_id(void)
113{
114 static uint8_t oem_id = OEM_UNKNOWN;
115 uint32_t id;
116
117 if (oem_id != OEM_UNKNOWN)
118 return oem_id;
119
120 if (google_chromeec_cbi_get_oem_id(&id))
121 return OEM_UNKNOWN;
122
123 if (id > OEM_UNKNOWN) {
124 printk(BIOS_ERR, "%s: OEM ID too big %u!\n", __func__, id);
125 return OEM_UNKNOWN;
126 }
127
128 oem_id = id;
129 printk(BIOS_DEBUG, "%s: OEM ID=%d\n", __func__, oem_id);
130
131 return oem_id;
132}
133
134/* "oem.bin" in cbfs contains array of records using the following structure. */
135struct oem_mapping {
136 uint8_t oem_id;
137 char oem_name[10];
138} __packed;
139
140/* Local buffer to read "oem.bin" */
141static char oem_bin_data[200];
142
143const char *smbios_mainboard_manufacturer(void)
144{
145 uint8_t oem_id = read_oem_id();
146 const struct oem_mapping *oem_entry = (void *)&oem_bin_data;
147 size_t oem_data_size;
148 size_t curr = 0;
149 static const char *manuf;
150
151 if (manuf)
152 return manuf;
153
154 /* If OEM ID cannot be determined, return default manuf string. */
155 if (oem_id == OEM_UNKNOWN)
156 return CONFIG_MAINBOARD_SMBIOS_MANUFACTURER;
157
Julius Werner834b3ec2020-03-04 16:52:08 -0800158 oem_data_size = cbfs_load("oem.bin", oem_bin_data,
159 sizeof(oem_bin_data));
Furquan Shaikhf5b7e802018-05-07 14:42:27 -0700160
161 while ((curr < oem_data_size) &&
162 ((oem_data_size - curr) >= sizeof(*oem_entry))) {
163 if (oem_id == oem_entry->oem_id) {
164 manuf = oem_entry->oem_name;
165 break;
166 }
167 curr += sizeof(*oem_entry);
168 oem_entry++;
169 }
170
171 if (manuf == NULL)
172 manuf = CONFIG_MAINBOARD_SMBIOS_MANUFACTURER;
173
174 return manuf;
175}
Furquan Shaikhc6141b92018-05-10 21:58:39 -0700176
177const char *mainboard_vbt_filename(void)
178{
179 uint32_t sku_id = variant_board_sku();
180
181 switch (sku_id) {
Ivy Jianfaafbfb2018-05-14 09:38:20 +0800182 case SKU_0_PANTHEON:
183 case SKU_1_PANTHEON:
Ivy Jian457253c2018-07-11 14:15:29 +0800184 case SKU_2_PANTHEON:
John Suc2209e42019-03-05 10:41:46 +0800185 case SKU_3_PANTHEON:
186 case SKU_4_PANTHEON:
Ivy Jianfaafbfb2018-05-14 09:38:20 +0800187 return "vbt-pantheon.bin";
Ivy Jian8bd5c5f2018-06-01 15:43:56 +0800188 case SKU_0_VAYNE:
189 case SKU_1_VAYNE:
190 case SKU_2_VAYNE:
191 return "vbt-vayne.bin";
T.H. Lin770b0342018-07-17 16:09:04 +0800192 case SKU_0_AKALI:
193 case SKU_1_AKALI:
194 case SKU_0_AKALI360:
195 case SKU_1_AKALI360:
196 return "vbt-akali.bin";
Ren Kuo337afb02018-12-22 15:04:56 +0800197 case SKU_0_BARD:
198 case SKU_1_BARD:
199 case SKU_2_BARD:
200 case SKU_3_BARD:
Ren Kuodeab64d2019-07-19 11:10:10 +0800201 case SKU_4_BARD:
202 case SKU_5_BARD:
Ren Kuo02240b72019-08-27 16:17:24 +0800203 case SKU_6_BARD:
204 case SKU_7_BARD:
Ren Kuo337afb02018-12-22 15:04:56 +0800205 return "vbt-bard.bin";
Furquan Shaikhc6141b92018-05-10 21:58:39 -0700206 default:
207 return "vbt.bin";
Furquan Shaikhc6141b92018-05-10 21:58:39 -0700208 }
209}
Gaggery Tsai70627772018-07-26 00:14:09 -0700210
211static int find_sku_mapping(const uint8_t oem_id)
212{
213 /* Check if this OEM ID has a mapping table entry. */
214 for (int i = 0; i < ARRAY_SIZE(sku_overwrite_mapping); i++)
215 if (oem_id == sku_overwrite_mapping[i].sku)
216 return i;
217
218 return -1;
219}
220
221/* Override dev tree settings per board */
222void variant_devtree_update(void)
223{
224 uint32_t sku_id = variant_board_sku();
225 uint32_t i;
226 int oem_index;
John Su2257a352018-10-25 19:21:15 +0800227 uint8_t pl2_id = PL2_ID_DEFAULT;
Ivy Jianb80d1322019-05-27 11:19:44 +0800228 struct device *spi_fpmcu = PCH_DEV_GSPI1;
Gaggery Tsai70627772018-07-26 00:14:09 -0700229
Kyösti Mälkkid5f645c2019-09-28 00:20:27 +0300230 config_t *cfg = config_of_soc();
Kyösti Mälkki28dc7dc2019-07-12 13:10:19 +0300231
Gaggery Tsai70627772018-07-26 00:14:09 -0700232 switch (sku_id) {
Gaggery Tsai70627772018-07-26 00:14:09 -0700233 case SKU_0_SONA:
234 case SKU_1_SONA:
Amanda Huangf7b57d02018-10-11 11:39:37 +0800235 case SKU_0_SYNDRA:
236 case SKU_1_SYNDRA:
237 case SKU_2_SYNDRA:
238 case SKU_3_SYNDRA:
Amanda Huang3080fe02018-12-17 13:25:03 +0800239 case SKU_4_SYNDRA:
240 case SKU_5_SYNDRA:
241 case SKU_6_SYNDRA:
242 case SKU_7_SYNDRA:
John Su2257a352018-10-25 19:21:15 +0800243 pl2_id = PL2_ID_SONA_SYNDRA;
Arthur Heymansfff20212021-03-15 14:56:16 +0100244 __fallthrough;
John Su2257a352018-10-25 19:21:15 +0800245 case SKU_0_VAYNE:
246 case SKU_1_VAYNE:
247 case SKU_2_VAYNE:
248 case SKU_0_PANTHEON:
249 case SKU_1_PANTHEON:
250 case SKU_2_PANTHEON:
Frank Wud0cc3bc2018-12-24 11:25:36 +0800251 case SKU_3_PANTHEON:
252 case SKU_4_PANTHEON:
Gaggery Tsai70627772018-07-26 00:14:09 -0700253 cfg->usb2_ports[5].enable = 0;
Ivy Jianb80d1322019-05-27 11:19:44 +0800254 spi_fpmcu->enabled = 0;
Gaggery Tsai70627772018-07-26 00:14:09 -0700255 break;
Ren Kuoa355b162018-12-12 14:39:36 +0800256 case SKU_0_BARD:
257 case SKU_1_BARD:
258 case SKU_2_BARD:
259 case SKU_3_BARD:
Ren Kuodeab64d2019-07-19 11:10:10 +0800260 case SKU_4_BARD:
261 case SKU_5_BARD:
Ren Kuo02240b72019-08-27 16:17:24 +0800262 case SKU_6_BARD:
263 case SKU_7_BARD:
Ren Kuoa355b162018-12-12 14:39:36 +0800264 case SKU_0_EKKO:
265 case SKU_1_EKKO:
266 case SKU_2_EKKO:
267 case SKU_3_EKKO:
Ren Kuo02240b72019-08-27 16:17:24 +0800268 case SKU_4_EKKO:
269 case SKU_5_EKKO:
270 case SKU_6_EKKO:
271 case SKU_7_EKKO:
Ren Kuoa355b162018-12-12 14:39:36 +0800272 pl2_id = PL2_ID_BARD_EKKO;
Ren Kuo03f654c2019-01-18 17:12:33 +0800273 cfg->usb2_ports[5].enable = 0;
274 cfg->usb2_ports[7].enable = 0;
275 cfg->usb2_ports[8].enable = 0;
276 cfg->usb2_ports[9].enable = 0;
Ren Kuoa355b162018-12-12 14:39:36 +0800277 break;
Gaggery Tsai70627772018-07-26 00:14:09 -0700278 default:
279 break;
280 }
281
Sumeet R Pawnikar97c54642020-05-10 01:24:11 +0530282 struct soc_power_limits_config *soc_conf;
283 soc_conf = &cfg->power_limits_config;
284
John Su2257a352018-10-25 19:21:15 +0800285 /* Update PL2 based on SKU. */
Sumeet R Pawnikar97c54642020-05-10 01:24:11 +0530286 soc_conf->tdp_pl2_override = get_pl2(pl2_id);
John Su2257a352018-10-25 19:21:15 +0800287
Gaggery Tsai70627772018-07-26 00:14:09 -0700288 /* Overwrite settings for different projects based on OEM ID*/
289 oem_index = find_sku_mapping(read_oem_id());
290
291 /* Return if the OEM ID is not supported or no changes are required */
292 if (oem_index < 0)
293 return;
294
295 for (i = 0; i < ARRAY_SIZE(cfg->domain_vr_config); i++) {
296 cfg->domain_vr_config[i].ac_loadline =
297 sku_overwrite_mapping[oem_index].ac_loadline[i];
298 cfg->domain_vr_config[i].dc_loadline =
299 sku_overwrite_mapping[oem_index].dc_loadline[i];
300 }
301}