1 /* SPDX-License-Identifier: GPL-2.0-only */
3 #include <baseboard/variants.h>
7 #include <soc/gpio_soc_defs.h>
8 #include <intelblocks/graphics.h>
9 #include <drivers/intel/gma/opregion.h>
10 #include <console/console.h>
11 #include <ec/google/chromeec/ec.h>
13 /* Per-pipe DDI Function Control 2 */
14 #define TRANS_DDI_FUNC_CTL2_A 0x60404
15 #define TRANS_DDI_AUDIO_MUTE_OVERRIDE_BITS_FIELDS (3 << 6)
17 const char *get_wifi_sar_cbfs_filename(void)
19 return get_wifi_sar_fw_config_filename(FW_CONFIG_FIELD(WIFI
));
22 static const struct pad_config wifi_pcie_enable_pad
[] = {
23 /* H20 : IMGCLKOUT1 ==> WLAN_PERST_L */
24 PAD_CFG_GPO(GPP_H20
, 1, DEEP
),
25 /* B11 : NC ==> EN_PP3300_WLAN_X*/
26 PAD_CFG_GPO(GPP_B11
, 1, DEEP
),
29 void variant_update_soc_chip_config(struct soc_intel_alderlake_config
*config
)
31 if (!fw_config_probe(FW_CONFIG(WIFI
, WIFI_6E
))) {
32 printk(BIOS_INFO
, "CNVi bluetooth disabled by fw_config\n");
33 config
->cnvi_bt_core
= false;
34 printk(BIOS_INFO
, "CNVi bluetooth audio offload disabled by fw_config\n");
35 config
->cnvi_bt_audio_offload
= false;
39 void fw_config_gpio_padbased_override(struct pad_config
*padbased_table
)
41 if (fw_config_probe(FW_CONFIG(WIFI
, WIFI_6_7921
))
42 || fw_config_probe(FW_CONFIG(WIFI
, WIFI_6_8852
))) {
43 printk(BIOS_INFO
, "Enable PCie based Wifi GPIO pins.\n");
44 gpio_padbased_override(padbased_table
, wifi_pcie_enable_pad
,
45 ARRAY_SIZE(wifi_pcie_enable_pad
));
49 void variant_finalize(void)
52 * Panel CSOT MNB601LS1-3 will flicker once during enter Chrome login screen,
53 * it is because it inserts 12 blank frames if it receives the unmute in VB-ID.
55 * Always override the mute in VB-ID to avoid Tcon EC detected the
56 * audiomute_flag change.
58 graphics_gtt_rmw(TRANS_DDI_FUNC_CTL2_A
, ~TRANS_DDI_AUDIO_MUTE_OVERRIDE_BITS_FIELDS
,
59 TRANS_DDI_AUDIO_MUTE_OVERRIDE_BITS_FIELDS
);
62 static int get_ssfc(uint32_t *val
)
64 static uint32_t known_value
;
68 } ssfc_state
= SSFC_NOT_READ
;
70 if (ssfc_state
== SSFC_AVAILABLE
) {
76 * If SSFC field is not in the CBI then the value of SSFC will be 0 for
77 * further processing later since 0 of each bits group means default
78 * component in a variant. For more detail, please refer to cbi_ssfc.h.
80 if (google_chromeec_cbi_get_ssfc(&known_value
) != 0) {
81 printk(BIOS_DEBUG
, "SSFC not set in CBI\n");
85 ssfc_state
= SSFC_AVAILABLE
;
87 printk(BIOS_INFO
, "SSFC 0x%x.\n", known_value
);
91 const char *mainboard_vbt_filename(void)
94 if (get_ssfc(&ssfc
)) {
95 printk(BIOS_INFO
, "Failed to read SSFC, using default vbt-teliks.bin\n");
96 return "vbt-teliks.bin";
100 * Determine if the panel is 11 inches based on the SSFC register.
102 * Bit 6 of the SSFC register indicates the panel size:
106 bool is_panel_11_inch
= (ssfc
>> 6) & 0x1;
108 if (is_panel_11_inch
) {
109 printk(BIOS_INFO
, "Bit 6 of SSFC is 1, use vbt-teliks_panel_11_inch.bin\n");
110 return "vbt-teliks_panel_11_inch.bin";
113 printk(BIOS_INFO
, "Bit 6 of SSFC is 0, use vbt-teliks.bin\n");
114 return "vbt-teliks.bin";