coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
mainboard.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 <baseboard/variants.h>
5 #include <device/device.h>
6 #include <drivers/tpm/cr50.h>
7 #include <ec/ec.h>
8 #include <fw_config.h>
9 #include <gpio.h>
10 #include <intelblocks/gpio.h>
11 #include <security/tpm/tss.h>
12 #include <intelblocks/tcss.h>
13 #include <soc/gpio.h>
14 #include <soc/pci_devs.h>
15 #include <soc/ramstage.h>
16 #include <variant/gpio.h>
17 #include <vb2_api.h>
18 
20 
21 WEAK_DEV_PTR(conn1);
22 
23 static void typec_orientation_fixup(void)
24 {
25  const struct device *conn = DEV_PTR(conn1);
26 
27  if (!is_dev_enabled(conn))
28  return;
29 
30  if (fw_config_probe(FW_CONFIG(DB_USB, USB4_GEN2))
31  || fw_config_probe(FW_CONFIG(DB_USB, USB3_ACTIVE))
32  || fw_config_probe(FW_CONFIG(DB_USB, USB4_GEN3))
33  || fw_config_probe(FW_CONFIG(DB_USB, USB3_NO_A))) {
35 
36  if (config) {
38  "Configure Right Type-C port orientation for retimer\n");
39  config->sbu_orientation = TYPEC_ORIENTATION_NORMAL;
40  }
41  }
42 }
43 
44 static void mainboard_init(struct device *dev)
45 {
49 }
50 
52 {
53 }
54 
56 {
57  /* Default weak implementation */
58 }
59 
60 static void add_fw_config_oem_string(const struct fw_config *config, void *arg)
61 {
62  struct smbios_type11 *t;
63  char buffer[64];
64 
65  t = (struct smbios_type11 *)arg;
66 
67  snprintf(buffer, sizeof(buffer), "%s-%s", config->field_name, config->option_name);
69 }
70 
71 static void mainboard_smbios_strings(struct device *dev, struct smbios_type11 *t)
72 {
73  fw_config_for_each_found(add_fw_config_oem_string, t);
74 }
75 
76 static void mainboard_enable(struct device *dev)
77 {
78  dev->ops->init = mainboard_init;
79  dev->ops->get_smbios_strings = mainboard_smbios_strings;
80 
82 }
83 
85 {
86  int ret;
87  if (!CONFIG(TPM_GOOGLE_CR50) || !CONFIG(SPI_TPM)) {
88  /*
89  * Negotiation of long interrupt pulses is only supported via SPI. I2C is only
90  * used on reworked prototypes on which the TPM is replaced with Dauntless under
91  * development, it will use long pulses by default, or use the interrupt line in
92  * a different way altogether.
93  */
94  return;
95  }
96 
97  ret = tlcl_lib_init();
98  if (ret != VB2_SUCCESS) {
99  printk(BIOS_ERR, "tlcl_lib_init() failed: 0x%x\n", ret);
100  return;
101  }
102 
104  printk(BIOS_INFO, "Enabling S0i3.4\n");
105  } else {
106  /*
107  * Disable S0i3.4, preventing the GPIO block from switching to
108  * slow clock.
109  */
110  printk(BIOS_INFO, "Not enabling S0i3.4\n");
112  cfg->gpio_override_pm = 1;
113  memset(cfg->gpio_pm, 0, sizeof(cfg->gpio_pm));
114  }
115 }
116 
117 static void mainboard_chip_init(void *chip_info)
118 {
119  const struct pad_config *base_pads;
120  const struct pad_config *override_pads;
121  size_t base_num, override_num;
122 
123  base_pads = variant_base_gpio_table(&base_num);
124  override_pads = variant_override_gpio_table(&override_num);
125 
126  gpio_configure_pads_with_override(base_pads, base_num, override_pads, override_num);
127 
128  /*
129  * Check SATAXPCIE1 (GPP_A12) RX status to determine if SSD is NVMe or SATA and set
130  * the IOSSTATE RX field to drive 0 or 1 back to the internal controller to ensure
131  * the attached device is not mis-detected on resume from S0ix.
132  */
133  if (gpio_get(GPP_A12)) {
134  const struct pad_config gpio_pedet_nvme[] = {
135  PAD_CFG_NF_IOSSTATE(GPP_A12, NONE, DEEP, NF1, HIZCRx1),
136  };
137  gpio_configure_pads(gpio_pedet_nvme, ARRAY_SIZE(gpio_pedet_nvme));
138  printk(BIOS_INFO, "SATAXPCIE1 indicates PCIe NVMe is present\n");
139  } else {
140  const struct pad_config gpio_pedet_sata[] = {
141  PAD_CFG_NF_IOSSTATE(GPP_A12, NONE, DEEP, NF1, HIZCRx0),
142  };
143  gpio_configure_pads(gpio_pedet_sata, ARRAY_SIZE(gpio_pedet_sata));
144  printk(BIOS_INFO, "SATAXPCIE1 indicates SATA SSD is present\n");
145  }
146 }
147 
150  .enable_dev = mainboard_enable,
151 };
struct chip_operations mainboard_ops
Definition: mainboard.c:19
#define GPP_A12
void * memset(void *dstpp, int c, size_t len)
Definition: memset.c:12
int smbios_add_string(u8 *start, const char *str)
Definition: smbios.c:40
#define ARRAY_SIZE(a)
Definition: helpers.h:12
@ TYPEC_ORIENTATION_NORMAL
#define printk(level,...)
Definition: stdlib.h:16
bool is_dev_enabled(const struct device *dev)
Definition: device_const.c:369
bool cr50_is_long_interrupt_pulse_enabled(void)
Definition: cr50.c:151
@ CONFIG
Definition: dsi_common.h:201
void mainboard_ec_init(void)
Definition: ec.c:8
#define FW_CONFIG(__field, __option)
Definition: fw_config.h:28
void mainboard_update_soc_chip_config(struct soc_intel_alderlake_config *config)
Definition: mainboard.c:34
WEAK_DEV_PTR(rp6_wwan)
void __weak variant_devtree_update(void)
Definition: mainboard.c:86
void variant_ramstage_init(void)
Definition: mainboard.c:152
static void mainboard_init(struct device *dev)
Definition: mainboard.c:44
static void mainboard_smbios_strings(struct device *dev, struct smbios_type11 *t)
Definition: mainboard.c:71
static void typec_orientation_fixup(void)
Definition: mainboard.c:23
static void mainboard_chip_init(void *chip_info)
Definition: mainboard.c:117
static void add_fw_config_oem_string(const struct fw_config *config, void *arg)
Definition: mainboard.c:60
static void mainboard_enable(struct device *dev)
Definition: mainboard.c:76
__weak const struct soc_amd_gpio * variant_override_gpio_table(size_t *size)
Definition: mainboard.c:224
#define DEV_PTR(_alias)
Definition: device.h:403
int gpio_get(gpio_t gpio)
Definition: gpio.c:166
struct bootblock_arg arg
Definition: decompressor.c:22
bool fw_config_probe(const struct fw_config *match)
Definition: fw_config.c:62
#define BIOS_INFO
BIOS_INFO - Expected events.
Definition: loglevel.h:113
#define BIOS_ERR
BIOS_ERR - System in incomplete state.
Definition: loglevel.h:72
enum board_config config
Definition: memory.c:448
const struct pad_config *__weak variant_base_gpio_table(size_t *num)
Definition: gpio.c:444
u8 buffer[C2P_BUFFER_MAXSIZE]
Definition: psp_smm.c:18
const struct smm_save_state_ops *legacy_ops __weak
Definition: save_state.c:8
void gpio_configure_pads(const struct soc_amd_gpio *gpio_list_ptr, size_t size)
program a particular set of GPIO
Definition: gpio.c:307
void gpio_configure_pads_with_override(const struct soc_amd_gpio *base_cfg, size_t base_num_pads, const struct soc_amd_gpio *override_cfg, size_t override_num_pads)
Definition: gpio.c:262
@ LPM_S0i3_4
Definition: chip.h:139
#define PAD_CFG_NF_IOSSTATE(pad, pull, rst, func, iosstate)
Definition: gpio_defs.h:220
void(* init)(void *chip_info)
Definition: device.h:25
void(* init)(struct device *dev)
Definition: device.h:42
Definition: device.h:107
struct device_operations * ops
Definition: device.h:143
DEVTREE_CONST void * chip_info
Definition: device.h:164
struct fw_config - Firmware configuration field and option.
Definition: fw_config.h:20
u8 eos[2]
Definition: smbios.h:815
enum lpm_state_mask LpmStateDisableMask
Definition: chip.h:124
uint8_t gpio_pm[TOTAL_GPIO_COMM]
Definition: chip.h:368
uint8_t gpio_override_pm
Definition: chip.h:356
uint32_t tlcl_lib_init(void)
Call this first.
Definition: tss.c:145
int snprintf(char *buf, size_t size, const char *fmt,...)
Note: This file is only for POSIX compatibility, and is meant to be chain-included via string....
Definition: vsprintf.c:35