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 <acpi/acpigen.h>
4 #include <baseboard/gpio.h>
5 #include <baseboard/variants.h>
6 #include <device/device.h>
7 #include <drivers/tpm/cr50.h>
8 #include <drivers/wwan/fm/chip.h>
9 #include <ec/ec.h>
10 #include <fw_config.h>
11 #include <security/tpm/tss.h>
12 #include <soc/gpio.h>
13 #include <soc/ramstage.h>
14 #include <stdio.h>
15 
16 WEAK_DEV_PTR(rp6_wwan);
17 
18 static void add_fw_config_oem_string(const struct fw_config *config, void *arg)
19 {
20  struct smbios_type11 *t;
21  char buffer[64];
22 
23  t = (struct smbios_type11 *)arg;
24 
25  snprintf(buffer, sizeof(buffer), "%s-%s", config->field_name, config->option_name);
27 }
28 
29 static void mainboard_smbios_strings(struct device *dev, struct smbios_type11 *t)
30 {
31  fw_config_for_each_found(add_fw_config_oem_string, t);
32 }
33 
35 {
36  int ret;
37 
38  ret = tlcl_lib_init();
39  if (ret != VB2_SUCCESS) {
40  printk(BIOS_ERR, "tlcl_lib_init() failed: 0x%x\n", ret);
41  return;
42  }
43 
45  printk(BIOS_INFO, "Enabling GPIO PM b/c CR50 has long IRQ pulse support\n");
46  config->gpio_override_pm = 0;
47  } else {
48  printk(BIOS_INFO, "Disabling GPIO PM b/c CR50 does not have long IRQ pulse "
49  "support\n");
50  config->gpio_override_pm = 1;
51  config->gpio_pm[COMM_0] = 0;
52  config->gpio_pm[COMM_1] = 0;
53  config->gpio_pm[COMM_2] = 0;
54  config->gpio_pm[COMM_3] = 0;
55  config->gpio_pm[COMM_4] = 0;
56  config->gpio_pm[COMM_5] = 0;
57  }
58 
60 }
61 
63 {
64  /* default implementation does nothing */
65 }
66 
67 __weak void variant_init(void)
68 {
69  /* default implementation does nothing */
70 }
71 
72 static void mainboard_init(void *chip_info)
73 {
74  const struct pad_config *base_pads;
75  const struct pad_config *override_pads;
76  size_t base_num, override_num;
77 
78  base_pads = variant_gpio_table(&base_num);
79  override_pads = variant_gpio_override_table(&override_num);
80  gpio_configure_pads_with_override(base_pads, base_num, override_pads, override_num);
81 
82  variant_init();
84 }
85 
87 {
88  /* Override dev tree settings per board */
89 }
90 
91 static void mainboard_dev_init(struct device *dev)
92 {
94 }
95 
96 static void mainboard_generate_shutdown(const struct device *dev)
97 {
98  const struct drivers_wwan_fm_config *config = config_of(dev);
99  const struct device *parent = dev->bus->dev;
100 
101  if (!config)
102  return;
103  if (config->rtd3dev) {
105  acpigen_emit_namestring(acpi_device_path_join(parent, "RTD3._STA"));
108  {
111  }
113  } else {
116  }
117 }
118 
120 {
122  {
123  if (CONFIG(HAVE_SLP_S0_GATE))
126  }
128  {
129  if (CONFIG(HAVE_SLP_S0_GATE))
132  }
134 }
135 
136 static void mainboard_fill_ssdt(const struct device *dev)
137 {
138  const struct device *wwan = DEV_PTR(rp6_wwan);
139 
140  if (wwan) {
141  acpigen_write_scope("\\_SB");
144  acpigen_write_method_end(); /* Method */
145  acpigen_write_scope_end(); /* Scope */
146  }
147  /* for variant to fill additional SSDT */
148  variant_fill_ssdt(dev);
149 
150  acpigen_write_scope("\\_SB");
153  acpigen_write_method_end(); /* Method */
154  acpigen_write_scope_end(); /* Scope */
155 
156 }
157 
158 void __weak variant_fill_ssdt(const struct device *dev)
159 {
160  /* Add board-specific SSDT entries */
161 }
162 
164 {
165  /* Add board-specific MS0X entries */
166  /*
167  if (s0ix_entry == S0IX_ENTRY) {
168  implement variant operations here
169  }
170  if (s0ix_entry == S0IX_EXIT) {
171  implement variant operations here
172  }
173  */
174 }
175 
176 static void mainboard_enable(struct device *dev)
177 {
178  dev->ops->init = mainboard_dev_init;
179  dev->ops->get_smbios_strings = mainboard_smbios_strings;
180  dev->ops->acpi_fill_ssdt = mainboard_fill_ssdt;
181 }
182 
183 
185 {
186 }
187 
188 static void mainboard_final(void *chip_info)
189 {
191 }
192 
194  .init = mainboard_init,
195  .enable_dev = mainboard_enable,
196  .final = mainboard_final,
197 };
struct chip_operations mainboard_ops
Definition: mainboard.c:19
const char * acpi_device_path_join(const struct device *dev, const char *name)
Definition: device.c:172
void acpigen_emit_namestring(const char *namepath)
Definition: acpigen.c:275
void acpigen_write_store(void)
Definition: acpigen.c:1333
void acpigen_write_scope(const char *name)
Definition: acpigen.c:326
void acpigen_write_if_lequal_op_int(uint8_t op, uint64_t val)
Definition: acpigen.c:1472
void acpigen_write_method_serialized(const char *name, int nargs)
Definition: acpigen.c:764
void acpigen_emit_byte(unsigned char b)
Definition: acpigen.c:61
void acpigen_write_else(void)
Definition: acpigen.c:1510
#define COMM_0
Definition: gpio_soc_defs.h:33
#define COMM_1
Definition: gpio_soc_defs.h:34
#define COMM_3
Definition: gpio_soc_defs.h:36
#define COMM_4
Definition: gpio_soc_defs.h:37
#define COMM_5
Definition: gpio_soc_defs.h:38
#define COMM_2
Definition: gpio_soc_defs.h:35
int smbios_add_string(u8 *start, const char *str)
Definition: smbios.c:40
#define printk(level,...)
Definition: stdlib.h:16
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
static void mainboard_smbios_strings(struct device *dev, struct smbios_type11 *t)
Definition: mainboard.c:29
__weak void variant_update_soc_chip_config(struct soc_intel_alderlake_config *config)
Definition: mainboard.c:62
static void mainboard_fill_ssdt(const struct device *dev)
Definition: mainboard.c:136
void __weak variant_fill_ssdt(const struct device *dev)
Definition: mainboard.c:158
static void mainboard_generate_s0ix_hook(void)
Definition: mainboard.c:119
__weak void variant_init(void)
Definition: mainboard.c:67
void __weak variant_finalize(void)
Definition: mainboard.c:184
static void mainboard_init(void *chip_info)
Definition: mainboard.c:72
static void mainboard_generate_shutdown(const struct device *dev)
Definition: mainboard.c:96
static void mainboard_dev_init(struct device *dev)
Definition: mainboard.c:91
void mainboard_update_soc_chip_config(struct soc_intel_alderlake_config *config)
Definition: mainboard.c:34
static void add_fw_config_oem_string(const struct fw_config *config, void *arg)
Definition: mainboard.c:18
WEAK_DEV_PTR(rp6_wwan)
static void mainboard_final(void *chip_info)
Definition: mainboard.c:188
static void mainboard_enable(struct device *dev)
Definition: mainboard.c:176
void __weak variant_devtree_update(void)
Definition: mainboard.c:86
void __weak variant_generate_s0ix_hook(enum s0ix_entry entry)
Definition: mainboard.c:163
s0ix_entry
Definition: variants.h:27
@ S0IX_EXIT
Definition: variants.h:28
@ S0IX_ENTRY
Definition: variants.h:29
@ ARG0_OP
Definition: acpigen.h:89
@ LOCAL0_OP
Definition: acpigen.h:81
@ ONE_OP
Definition: acpigen.h:31
int acpigen_soc_clear_tx_gpio(unsigned int gpio_num)
Definition: gpio.c:61
void acpigen_write_method_end(void)
Definition: acpigen.h:349
void acpigen_write_scope_end(void)
Definition: acpigen.h:343
int acpigen_soc_set_tx_gpio(unsigned int gpio_num)
Definition: gpio.c:56
void acpigen_write_if_end(void)
Definition: acpigen.h:431
#define DEV_PTR(_alias)
Definition: device.h:403
static DEVTREE_CONST void * config_of(const struct device *dev)
Definition: device.h:382
struct bootblock_arg arg
Definition: decompressor.c:22
#define BIOS_INFO
BIOS_INFO - Expected events.
Definition: loglevel.h:113
#define BIOS_ERR
BIOS_ERR - System in incomplete state.
Definition: loglevel.h:72
const struct pad_config * variant_gpio_override_table(size_t *num)
Definition: gpio.c:198
const struct pad_config *__weak variant_gpio_table(size_t *num)
Definition: gpio.c:406
#define GPIO_SLP_S0_GATE
Definition: gpio.h:18
enum board_config config
Definition: memory.c:448
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_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
DEVTREE_CONST struct device * dev
Definition: device.h:78
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 struct bus * bus
Definition: device.h:108
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
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