blob: 856c105cfe237e29a46ea868fa1fdfc01420e2a5 [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
Kyösti Mälkki37eb24b2021-01-11 18:40:37 +020015void acpi_create_gnvs(void)
Kyösti Mälkkie37459e2020-06-17 01:04:44 +030016{
17 size_t gnvs_size;
18
Kyösti Mälkki62d6f1f2021-01-27 10:13:33 +020019 gnvs = cbmem_find(CBMEM_ID_ACPI_GNVS);
20 if (gnvs)
Kyösti Mälkki37eb24b2021-01-11 18:40:37 +020021 return;
Kyösti Mälkkie37459e2020-06-17 01:04:44 +030022
Kyösti Mälkki66c64132020-12-19 16:19:44 +020023 /* Match with OpRegion declared in global_nvs.asl. */
Kyösti Mälkki37eb24b2021-01-11 18:40:37 +020024 gnvs_size = sizeof(struct global_nvs);
Kyösti Mälkki66c64132020-12-19 16:19:44 +020025 if (gnvs_size < 0x100)
26 gnvs_size = 0x100;
Kyösti Mälkki4abc7312021-01-12 17:46:30 +020027 if (CONFIG(ACPI_HAS_DEVICE_NVS))
Kyösti Mälkki66c64132020-12-19 16:19:44 +020028 gnvs_size = 0x2000;
Kyösti Mälkki84d10cc2021-02-10 17:53:34 +020029 else if (CONFIG(CHROMEOS_NVS))
Kyösti Mälkki66c64132020-12-19 16:19:44 +020030 gnvs_size = 0x1000;
31
Kyösti Mälkkie37459e2020-06-17 01:04:44 +030032 gnvs = cbmem_add(CBMEM_ID_ACPI_GNVS, gnvs_size);
33 if (!gnvs)
Kyösti Mälkki37eb24b2021-01-11 18:40:37 +020034 return;
Kyösti Mälkkie37459e2020-06-17 01:04:44 +030035
36 memset(gnvs, 0, gnvs_size);
37
38 if (CONFIG(CONSOLE_CBMEM))
Kyösti Mälkki37eb24b2021-01-11 18:40:37 +020039 gnvs->cbmc = (uintptr_t)cbmem_find(CBMEM_ID_CONSOLE);
Kyösti Mälkkie37459e2020-06-17 01:04:44 +030040
Kyösti Mälkki8a1fcf42021-02-12 18:43:36 +020041 if (CONFIG(CHROMEOS_NVS)) {
42 chromeos_acpi_t *init = (void *)((u8 *)gnvs + GNVS_CHROMEOS_ACPI_OFFSET);
43 chromeos_init_chromeos_acpi(init);
44 }
Kyösti Mälkkie37459e2020-06-17 01:04:44 +030045}
46
Kyösti Mälkki62d6f1f2021-01-27 10:13:33 +020047void *acpi_get_gnvs(void)
48{
49 if (gnvs)
50 return gnvs;
51
52 gnvs = cbmem_find(CBMEM_ID_ACPI_GNVS);
53 if (gnvs)
54 return gnvs;
55
56 printk(BIOS_ERR, "Unable to locate Global NVS\n");
57 return NULL;
58}
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älkki62d6f1f2021-01-27 10:13:33 +020065/* Implemented under platform. */
66__weak void soc_fill_gnvs(struct global_nvs *gnvs_) { }
67__weak void mainboard_fill_gnvs(struct global_nvs *gnvs_) { }
68
69/* Called from write_acpi_tables() only on normal boot path. */
Kyösti Mälkki2ab4a962020-06-30 11:41:47 +030070void acpi_fill_gnvs(void)
71{
Kyösti Mälkki2ad598f2021-03-16 13:02:34 +020072 const struct opregion gnvs_op = OPREGION("GNVS", SYSTEMMEMORY, (uintptr_t)gnvs, 0x100);
73 const struct opregion cnvs_op = OPREGION("CNVS", SYSTEMMEMORY,
74 (uintptr_t)gnvs + GNVS_CHROMEOS_ACPI_OFFSET, 0xf00);
75 const struct opregion dnvs_op = OPREGION("DNVS", SYSTEMMEMORY,
76 (uintptr_t)gnvs + GNVS_DEVICE_NVS_OFFSET, 0x1000);
77
Kyösti Mälkki2ab4a962020-06-30 11:41:47 +030078 if (!gnvs)
79 return;
80
81 soc_fill_gnvs(gnvs);
82 mainboard_fill_gnvs(gnvs);
Kyösti Mälkki91946c52020-06-30 11:42:52 +030083
84 acpigen_write_scope("\\");
Kyösti Mälkki2ad598f2021-03-16 13:02:34 +020085 acpigen_write_opregion(&gnvs_op);
86
87 if (CONFIG(CHROMEOS_NVS))
88 acpigen_write_opregion(&cnvs_op);
89
90 if (CONFIG(ACPI_HAS_DEVICE_NVS))
91 acpigen_write_opregion(&dnvs_op);
92
Kyösti Mälkki91946c52020-06-30 11:42:52 +030093 acpigen_pop_len();
Kyösti Mälkki2ab4a962020-06-30 11:41:47 +030094}
Kyösti Mälkki4de1a312021-01-15 05:58:42 +020095
96int acpi_reset_gnvs_for_wake(struct global_nvs **gnvs_)
97{
98 if (!gnvs)
99 return -1;
100
101 /* Set unknown wake source */
102 gnvs->pm1i = -1;
103 gnvs->gpei = -1;
104
105 *gnvs_ = gnvs;
106 return 0;
107}