blob: 18c1b331302b5227026b95c4e6d5040b5a764275 [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;
Kyösti Mälkki4abc7312021-01-12 17:46:30 +020042 if (CONFIG(ACPI_HAS_DEVICE_NVS))
Kyösti Mälkki66c64132020-12-19 16:19:44 +020043 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älkki4abc7312021-01-12 17:46:30 +020060void *acpi_get_device_nvs(void)
61{
62 return (u8 *)gnvs + GNVS_DEVICE_NVS_OFFSET;
63}
64
Kyösti Mälkki2ab4a962020-06-30 11:41:47 +030065void acpi_fill_gnvs(void)
66{
67 if (!gnvs)
68 return;
69
70 soc_fill_gnvs(gnvs);
71 mainboard_fill_gnvs(gnvs);
Kyösti Mälkki91946c52020-06-30 11:42:52 +030072
73 acpigen_write_scope("\\");
74 acpigen_write_name_dword("NVSA", (uintptr_t)gnvs);
75 acpigen_pop_len();
Kyösti Mälkki4abc7312021-01-12 17:46:30 +020076
77 if (CONFIG(ACPI_HAS_DEVICE_NVS)) {
78 acpigen_write_scope("\\");
79 acpigen_write_name_dword("NVSD", (uintptr_t)gnvs + GNVS_DEVICE_NVS_OFFSET);
80 acpigen_pop_len();
81 }
Kyösti Mälkki2ab4a962020-06-30 11:41:47 +030082}