coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
helpers.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
3 #include <console/console.h>
4 #include <inttypes.h>
5 #include <baseboard/variants.h>
7 
8 /* Global definitions for FW_CONFIG values */
9 enum {
10  /* Daughterboard index for attributes. */
13  /* Mainboard USB index for attributes. */
16  /* Lid accelerometer properties. */
19  /* Base gyro sensor properties. */
22  /* Keyboard backlight presence */
25  /* Tablet mode supported through lid angle */
28  /* Stylus presence */
31  /* Fingerprint sensor presence */
34  /* NVME presence */
37  /* EMMC presence */
40  /* SD controller type */
43  /* SAR presence */
46  /* Mainboard Type for VCORE IC */
49  /* Fan information */
52  /* WWAN presence */
55  /* Audio AMP type */
58  /* Audio codec type */
61 };
62 
64 {
65  static uint64_t known_value;
66 
67  if (known_value) {
68  *val = known_value;
69  return 0;
70  }
71 
72  if (google_chromeec_cbi_get_fw_config(&known_value) != 0) {
73  printk(BIOS_ERR, "FW_CONFIG not set in CBI\n");
74  return -1;
75  }
76 
77  *val = known_value;
78 
79  return 0;
80 }
81 
82 static unsigned int extract_field(uint64_t mask, int shift)
83 {
85 
86  /* On errors nothing is assumed to be set. */
88  return 0;
89 
90  return (fw_config >> shift) & mask;
91 }
92 
94 {
96 }
97 
99 {
101 }
102 
104 {
106 }
107 
109 {
111 }
112 
114 {
116 }
117 
119 {
122 }
123 
125 {
126  uint32_t board_version;
127 
128  if (!CONFIG(VARIANT_SUPPORTS_PRE_V3_SCHEMATICS))
129  return true;
130 
131  if (google_chromeec_cbi_get_board_version(&board_version) != 0)
132  return false;
133 
134  if ((int)board_version < CONFIG_VARIANT_MIN_BOARD_ID_V3_SCHEMATICS)
135  return false;
136 
137  return true;
138 }
139 
141 {
142  uint32_t board_version;
143 
144  if (!CONFIG(VARIANT_SUPPORTS_PRE_V3_6_SCHEMATICS))
145  return true;
146 
147  if (google_chromeec_cbi_get_board_version(&board_version) != 0)
148  return false;
149 
150  if ((int)board_version < CONFIG_VARIANT_MIN_BOARD_ID_V3_6_SCHEMATICS)
151  return false;
152 
153  return true;
154 }
155 
156 /*
157  * pre-v3.6, CODEC_GPI was used as headphone jack interrupt.
158  * Starting v3.6 this was changed to a separate GPIO.
159  */
161 {
163 }
164 
166 {
167  uint32_t board_version;
168 
169  if (!CONFIG(VARIANT_SUPPORTS_WIFI_POWER_ACTIVE_HIGH))
170  return true;
171 
172  if (google_chromeec_cbi_get_board_version(&board_version) != 0)
173  return false;
174 
175  if ((int)board_version < CONFIG_VARIANT_MIN_BOARD_ID_WIFI_POWER_ACTIVE_LOW)
176  return false;
177 
178  return true;
179 }
180 
182 {
184 }
185 
187 {
188  if (CONFIG(VARIANT_HAS_FPMCU))
189  return true;
190 
191  return false;
192 }
193 
195 {
196  /*
197  * Older board versions need an extra delay here to finish resetting
198  * the FPMCU. The resistor value in the glitch prevention circuit was
199  * sized so that the FPMCU doesn't turn of for ~1 second. On newer
200  * boards, that's been updated to ~30ms, which allows the FPMCU's
201  * reset to be completed in the time between bootblock and finalize.
202  */
203  uint32_t board_version;
204 
205  if (google_chromeec_cbi_get_board_version(&board_version))
206  board_version = 1;
207 
208  if (board_version <= CONFIG_VARIANT_MAX_BOARD_ID_BROKEN_FMPCU_POWER)
209  return true;
210 
211  return false;
212 }
#define printk(level,...)
Definition: stdlib.h:16
@ CONFIG
Definition: dsi_common.h:201
int google_chromeec_cbi_get_fw_config(uint64_t *fw_config)
Definition: ec.c:844
int google_chromeec_cbi_get_board_version(uint32_t *version)
Definition: ec.c:870
#define BIOS_ERR
BIOS_ERR - System in incomplete state.
Definition: loglevel.h:72
static const int mask[4]
Definition: gpio.c:308
unsigned int uint32_t
Definition: stdint.h:14
unsigned long long uint64_t
Definition: stdint.h:17
struct fw_config - Firmware configuration field and option.
Definition: fw_config.h:20
u8 val
Definition: sys.c:300
static unsigned int extract_field(uint64_t mask, int shift)
Definition: helpers.c:82
static int get_fw_config(uint64_t *val)
Definition: helpers.c:63
int variant_has_nvme(void)
Definition: helpers.c:108
bool variant_uses_codec_gpi(void)
Definition: helpers.c:160
@ FW_CONFIG_MASK_MB_USB_INDEX
Definition: helpers.c:14
@ FW_CONFIG_MASK_MB_TYPE
Definition: helpers.c:47
@ FW_CONFIG_SHIFT_EMMC
Definition: helpers.c:39
@ FW_CONFIG_SHIFT_MB_TYPE
Definition: helpers.c:48
@ FW_CONFIG_MASK_BASE_GYRO
Definition: helpers.c:20
@ FW_CONFIG_MASK_KEYB_BL
Definition: helpers.c:23
@ FW_CONFIG_MASK_NVME
Definition: helpers.c:35
@ FW_CONFIG_MASK_AUDIO_CODEC_SOURCE
Definition: helpers.c:59
@ FW_CONFIG_SHIFT_AUDIO_AMP
Definition: helpers.c:57
@ FW_CONFIG_MASK_WWAN
Definition: helpers.c:53
@ FW_CONFIG_MASK_FAN
Definition: helpers.c:50
@ FW_CONFIG_SHIFT_NVME
Definition: helpers.c:36
@ FW_CONFIG_STYLUS_SHIFT
Definition: helpers.c:30
@ FW_CONFIG_MASK_AUDIO_AMP
Definition: helpers.c:56
@ FW_CONFIG_LID_ANGLE_TABLET_MODE_SHIFT
Definition: helpers.c:27
@ FW_CONFIG_MASK_SAR
Definition: helpers.c:44
@ FW_CONFIG_SHIFT_WWAN
Definition: helpers.c:54
@ FW_CONFIG_MASK_DB_INDEX
Definition: helpers.c:11
@ FW_CONFIG_MASK_LID_ACCEL
Definition: helpers.c:17
@ FW_CONFIG_SHIFT_FAN
Definition: helpers.c:51
@ FW_CONFIG_SHIFT_SAR
Definition: helpers.c:45
@ FW_CONFIG_SHIFT_FP
Definition: helpers.c:33
@ FW_CONFIG_BASE_GYRO_SHIFT
Definition: helpers.c:21
@ FW_CONFIG_MB_USB_INDEX_SHIFT
Definition: helpers.c:15
@ FW_CONFIG_MASK_LID_ANGLE_TABLET_MODE
Definition: helpers.c:26
@ FW_CONFIG_DB_INDEX_SHIFT
Definition: helpers.c:12
@ FW_CONFIG_MASK_EMMC
Definition: helpers.c:38
@ FW_CONFIG_MASK_FP
Definition: helpers.c:32
@ FW_CONFIG_KEYB_BL_SHIFT
Definition: helpers.c:24
@ FW_CONFIG_SHIFT_SD_CTRLR
Definition: helpers.c:42
@ FW_CONFIG_MASK_SD_CTRLR
Definition: helpers.c:41
@ FW_CONFIG_SHIFT_AUDIO_CODEC_SOURCE
Definition: helpers.c:60
@ FW_CONFIG_LID_ACCEL_SHIFT
Definition: helpers.c:18
@ FW_CONFIG_MASK_STYLUS
Definition: helpers.c:29
int variant_gets_mb_type_config(void)
Definition: helpers.c:98
bool variant_uses_v3_schematics(void)
Definition: helpers.c:124
bool variant_has_active_low_wifi_power(void)
Definition: helpers.c:165
bool fpmcu_needs_delay(void)
Definition: helpers.c:194
int variant_has_wwan(void)
Definition: helpers.c:113
int variant_get_daughterboard_id(void)
Definition: helpers.c:181
bool variant_has_fingerprint(void)
Definition: helpers.c:186
int variant_has_emmc(void)
Definition: helpers.c:103
int variant_is_convertible(void)
Definition: helpers.c:118
int variant_gets_sar_config(void)
Definition: helpers.c:93
bool variant_uses_v3_6_schematics(void)
Definition: helpers.c:140