coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
gnvs.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <acpi/acpi_gnvs.h>
4 #include <acpi/acpigen.h>
5 #include <bootstate.h>
6 #include <cbmem.h>
7 #include <console/console.h>
8 #include <soc/nvs.h>
9 #include <string.h>
10 #include <types.h>
11 
12 static struct global_nvs *gnvs;
13 static void *dnvs;
14 
15 static void acpi_create_gnvs(void *unused)
16 {
17  const size_t gnvs_size = ALIGN_UP(sizeof(struct global_nvs), sizeof(uint64_t));
18  const size_t dnvs_size = ALIGN_UP(size_of_dnvs(), sizeof(uint64_t));
19 
21  if (gnvs)
22  return;
23 
24  /* Allocate for both GNVS and DNVS OpRegions. */
25  gnvs = cbmem_add(CBMEM_ID_ACPI_GNVS, gnvs_size + dnvs_size);
26  if (!gnvs)
27  return;
28 
29  memset(gnvs, 0, gnvs_size + dnvs_size);
30 
31  if (dnvs_size)
32  dnvs = (char *)gnvs + gnvs_size;
33 
34  if (CONFIG(CONSOLE_CBMEM))
36 }
37 
39 
40 void *acpi_get_gnvs(void)
41 {
42  if (gnvs)
43  return gnvs;
44 
46  if (gnvs)
47  return gnvs;
48 
49  printk(BIOS_ERR, "Unable to locate Global NVS\n");
50  return NULL;
51 }
52 
54 {
55  return dnvs;
56 }
57 
58 /* Implemented under platform. */
59 __weak void soc_fill_gnvs(struct global_nvs *gnvs_) { }
60 __weak void mainboard_fill_gnvs(struct global_nvs *gnvs_) { }
61 __weak size_t size_of_dnvs(void) { return 0; }
62 
63 /* Called from write_acpi_tables() only on normal boot path. */
64 void acpi_fill_gnvs(void)
65 {
66  const struct opregion gnvs_op = OPREGION("GNVS", SYSTEMMEMORY, (uintptr_t)gnvs,
67  sizeof(struct global_nvs));
68  const struct opregion dnvs_op = OPREGION("DNVS", SYSTEMMEMORY, (uintptr_t)dnvs,
69  size_of_dnvs());
70 
71  if (!gnvs)
72  return;
73 
76 
77  acpigen_write_scope("\\");
78  acpigen_write_opregion(&gnvs_op);
79  if (dnvs)
80  acpigen_write_opregion(&dnvs_op);
82 }
83 
85 {
86  if (!gnvs)
87  return -1;
88 
89  /* Set unknown wake source */
90  gnvs->pm1i = -1;
91  gnvs->gpei = -1;
92 
93  *gnvs_ = gnvs;
94  return 0;
95 }
static struct global_nvs * gnvs
Definition: gnvs.c:12
void * acpi_get_device_nvs(void)
Definition: gnvs.c:53
__weak void mainboard_fill_gnvs(struct global_nvs *gnvs_)
Definition: gnvs.c:60
static void * dnvs
Definition: gnvs.c:13
void acpi_fill_gnvs(void)
Definition: gnvs.c:64
__weak size_t size_of_dnvs(void)
Definition: gnvs.c:61
static void acpi_create_gnvs(void *unused)
Definition: gnvs.c:15
__weak void soc_fill_gnvs(struct global_nvs *gnvs_)
Definition: gnvs.c:59
BOOT_STATE_INIT_ENTRY(BS_PRE_DEVICE, BS_ON_EXIT, acpi_create_gnvs, NULL)
void * acpi_get_gnvs(void)
Definition: gnvs.c:40
int acpi_reset_gnvs_for_wake(struct global_nvs **gnvs_)
Definition: gnvs.c:84
void acpigen_pop_len(void)
Definition: acpigen.c:37
void acpigen_write_scope(const char *name)
Definition: acpigen.c:326
void acpigen_write_opregion(const struct opregion *opreg)
Definition: acpigen.c:447
void * memset(void *dstpp, int c, size_t len)
Definition: memset.c:12
@ BS_PRE_DEVICE
Definition: bootstate.h:78
@ BS_ON_EXIT
Definition: bootstate.h:96
#define ALIGN_UP(x, a)
Definition: helpers.h:17
void * cbmem_add(u32 id, u64 size)
Definition: imd_cbmem.c:144
void * cbmem_find(u32 id)
Definition: imd_cbmem.c:166
#define CBMEM_ID_CONSOLE
Definition: cbmem_id.h:19
#define CBMEM_ID_ACPI_GNVS
Definition: cbmem_id.h:9
#define printk(level,...)
Definition: stdlib.h:16
@ CONFIG
Definition: dsi_common.h:201
@ SYSTEMMEMORY
Definition: acpigen.h:198
#define OPREGION(rname, space, offset, len)
Definition: acpigen.h:191
#define BIOS_ERR
BIOS_ERR - System in incomplete state.
Definition: loglevel.h:72
const struct smm_save_state_ops *legacy_ops __weak
Definition: save_state.c:8
#define NULL
Definition: stddef.h:19
unsigned long uintptr_t
Definition: stdint.h:21
unsigned long long uint64_t
Definition: stdint.h:17
Definition: nvs.h:14
uint64_t gpei
Definition: nvs.h:21
uint64_t pm1i
Definition: nvs.h:20
uint32_t cbmc
Definition: nvs.h:19