blob: 10a77d39de547bcce1d94afc22c50337964aaa89 [file] [log] [blame]
Kyösti Mälkkie37459e2020-06-17 01:04:44 +03001/* SPDX-License-Identifier: GPL-2.0-only */
2
3#include <acpi/acpi_gnvs.h>
4#include <acpi/acpigen.h>
5#include <cbmem.h>
6#include <console/console.h>
7#include <string.h>
8#include <types.h>
9
10static void *gnvs;
11
12void *acpi_get_gnvs(void)
13{
14 if (gnvs)
15 return gnvs;
16
17 gnvs = cbmem_find(CBMEM_ID_ACPI_GNVS);
18 if (gnvs)
19 return gnvs;
20
21 printk(BIOS_ERR, "Unable to locate Global NVS\n");
22 return NULL;
23}
24
25static void gnvs_assign_cbmc(void)
26{
Kyösti Mälkkie0183d62020-06-17 13:45:16 +030027 uint32_t *gnvs_cbmc = gnvs_cbmc_ptr(gnvs);
Kyösti Mälkkie37459e2020-06-17 01:04:44 +030028 if (gnvs_cbmc)
29 *gnvs_cbmc = (uintptr_t)cbmem_find(CBMEM_ID_CONSOLE);
30}
31
Kyösti Mälkki3139c8d2020-06-28 16:33:33 +030032/* Needs implementation in platform code. */
Kyösti Mälkkie0183d62020-06-17 13:45:16 +030033__weak uint32_t *gnvs_cbmc_ptr(struct global_nvs *gnvs_)
34{
35 return NULL;
36}
37
Kyösti Mälkki4b4e9952020-06-28 21:28:54 +030038__weak void soc_fill_gnvs(struct global_nvs *gnvs_) { }
Kyösti Mälkkia9766c72020-06-29 02:56:49 +030039__weak void mainboard_fill_gnvs(struct global_nvs *gnvs_) { }
Kyösti Mälkki4b4e9952020-06-28 21:28:54 +030040
Kyösti Mälkkie37459e2020-06-17 01:04:44 +030041void *gnvs_get_or_create(void)
42{
43 size_t gnvs_size;
44
45 if (gnvs)
46 return gnvs;
47
48 gnvs = cbmem_find(CBMEM_ID_ACPI_GNVS);
49 if (gnvs)
50 return gnvs;
51
52 gnvs_size = gnvs_size_of_array();
Kyösti Mälkkie0183d62020-06-17 13:45:16 +030053 if (!gnvs_size)
54 return NULL;
Kyösti Mälkkie37459e2020-06-17 01:04:44 +030055
56 gnvs = cbmem_add(CBMEM_ID_ACPI_GNVS, gnvs_size);
57 if (!gnvs)
Kyösti Mälkkie0183d62020-06-17 13:45:16 +030058 return NULL;
Kyösti Mälkkie37459e2020-06-17 01:04:44 +030059
60 memset(gnvs, 0, gnvs_size);
61
62 if (CONFIG(CONSOLE_CBMEM))
63 gnvs_assign_cbmc();
64
65 if (CONFIG(CHROMEOS))
66 gnvs_assign_chromeos();
67
68 return gnvs;
69}
70
Kyösti Mälkki2ab4a962020-06-30 11:41:47 +030071void acpi_fill_gnvs(void)
72{
73 if (!gnvs)
74 return;
75
76 soc_fill_gnvs(gnvs);
77 mainboard_fill_gnvs(gnvs);
Kyösti Mälkki91946c52020-06-30 11:42:52 +030078
79 acpigen_write_scope("\\");
80 acpigen_write_name_dword("NVSA", (uintptr_t)gnvs);
81 acpigen_pop_len();
Kyösti Mälkki2ab4a962020-06-30 11:41:47 +030082}