blob: a895a83e83d6b57db4822f5cff662101bdf5d5fe [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>
Kyösti Mälkki37eb24b2021-01-11 18:40:37 +02007#include <soc/nvs.h>
8#include <stdint.h>
Kyösti Mälkkie37459e2020-06-17 01:04:44 +03009#include <string.h>
10#include <types.h>
Kyösti Mälkki66c64132020-12-19 16:19:44 +020011#include <vendorcode/google/chromeos/gnvs.h>
Kyösti Mälkkie37459e2020-06-17 01:04:44 +030012
Kyösti Mälkki37eb24b2021-01-11 18:40:37 +020013static struct global_nvs *gnvs;
Kyösti Mälkkie37459e2020-06-17 01:04:44 +030014
15void *acpi_get_gnvs(void)
16{
17 if (gnvs)
18 return gnvs;
19
20 gnvs = cbmem_find(CBMEM_ID_ACPI_GNVS);
21 if (gnvs)
22 return gnvs;
23
24 printk(BIOS_ERR, "Unable to locate Global NVS\n");
25 return NULL;
26}
27
Kyösti Mälkki4b4e9952020-06-28 21:28:54 +030028__weak void soc_fill_gnvs(struct global_nvs *gnvs_) { }
Kyösti Mälkkia9766c72020-06-29 02:56:49 +030029__weak void mainboard_fill_gnvs(struct global_nvs *gnvs_) { }
Kyösti Mälkki4b4e9952020-06-28 21:28:54 +030030
Kyösti Mälkki37eb24b2021-01-11 18:40:37 +020031void acpi_create_gnvs(void)
Kyösti Mälkkie37459e2020-06-17 01:04:44 +030032{
33 size_t gnvs_size;
34
Kyösti Mälkki37eb24b2021-01-11 18:40:37 +020035 if (cbmem_find(CBMEM_ID_ACPI_GNVS))
36 return;
Kyösti Mälkkie37459e2020-06-17 01:04:44 +030037
Kyösti Mälkki66c64132020-12-19 16:19:44 +020038 /* Match with OpRegion declared in global_nvs.asl. */
Kyösti Mälkki37eb24b2021-01-11 18:40:37 +020039 gnvs_size = sizeof(struct global_nvs);
Kyösti Mälkki66c64132020-12-19 16:19:44 +020040 if (gnvs_size < 0x100)
41 gnvs_size = 0x100;
42 if (gnvs_size > 0x1000)
43 gnvs_size = 0x2000;
44 else if (CONFIG(MAINBOARD_HAS_CHROMEOS))
45 gnvs_size = 0x1000;
46
Kyösti Mälkkie37459e2020-06-17 01:04:44 +030047 gnvs = cbmem_add(CBMEM_ID_ACPI_GNVS, gnvs_size);
48 if (!gnvs)
Kyösti Mälkki37eb24b2021-01-11 18:40:37 +020049 return;
Kyösti Mälkkie37459e2020-06-17 01:04:44 +030050
51 memset(gnvs, 0, gnvs_size);
52
53 if (CONFIG(CONSOLE_CBMEM))
Kyösti Mälkki37eb24b2021-01-11 18:40:37 +020054 gnvs->cbmc = (uintptr_t)cbmem_find(CBMEM_ID_CONSOLE);
Kyösti Mälkkie37459e2020-06-17 01:04:44 +030055
56 if (CONFIG(CHROMEOS))
Kyösti Mälkki66c64132020-12-19 16:19:44 +020057 gnvs_assign_chromeos((u8 *)gnvs + GNVS_CHROMEOS_ACPI_OFFSET);
Kyösti Mälkkie37459e2020-06-17 01:04:44 +030058}
59
Kyösti Mälkki2ab4a962020-06-30 11:41:47 +030060void acpi_fill_gnvs(void)
61{
62 if (!gnvs)
63 return;
64
65 soc_fill_gnvs(gnvs);
66 mainboard_fill_gnvs(gnvs);
Kyösti Mälkki91946c52020-06-30 11:42:52 +030067
68 acpigen_write_scope("\\");
69 acpigen_write_name_dword("NVSA", (uintptr_t)gnvs);
70 acpigen_pop_len();
Kyösti Mälkki2ab4a962020-06-30 11:41:47 +030071}