blob: 01aff6290722c28401af772df078487c2aab716c [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älkkiae7ac8a2021-01-12 15:23:25 +020029 else if (CONFIG(CHROMEOS))
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
41 if (CONFIG(CHROMEOS))
Kyösti Mälkki66c64132020-12-19 16:19:44 +020042 gnvs_assign_chromeos((u8 *)gnvs + GNVS_CHROMEOS_ACPI_OFFSET);
Kyösti Mälkkie37459e2020-06-17 01:04:44 +030043}
44
Kyösti Mälkki62d6f1f2021-01-27 10:13:33 +020045void *acpi_get_gnvs(void)
46{
47 if (gnvs)
48 return gnvs;
49
50 gnvs = cbmem_find(CBMEM_ID_ACPI_GNVS);
51 if (gnvs)
52 return gnvs;
53
54 printk(BIOS_ERR, "Unable to locate Global NVS\n");
55 return NULL;
56}
57
Kyösti Mälkki4abc7312021-01-12 17:46:30 +020058void *acpi_get_device_nvs(void)
59{
60 return (u8 *)gnvs + GNVS_DEVICE_NVS_OFFSET;
61}
62
Kyösti Mälkki62d6f1f2021-01-27 10:13:33 +020063/* Implemented under platform. */
64__weak void soc_fill_gnvs(struct global_nvs *gnvs_) { }
65__weak void mainboard_fill_gnvs(struct global_nvs *gnvs_) { }
66
67/* Called from write_acpi_tables() only on normal boot path. */
Kyösti Mälkki2ab4a962020-06-30 11:41:47 +030068void acpi_fill_gnvs(void)
69{
70 if (!gnvs)
71 return;
72
73 soc_fill_gnvs(gnvs);
74 mainboard_fill_gnvs(gnvs);
Kyösti Mälkki91946c52020-06-30 11:42:52 +030075
76 acpigen_write_scope("\\");
Kyösti Mälkkifa5f9b52021-01-19 14:12:19 +020077 acpigen_write_name_dword("NVB0", (uintptr_t)gnvs);
Kyösti Mälkkiae7ac8a2021-01-12 15:23:25 +020078 acpigen_write_name_dword("NVS0", 0x100);
Kyösti Mälkki91946c52020-06-30 11:42:52 +030079 acpigen_pop_len();
Kyösti Mälkki4abc7312021-01-12 17:46:30 +020080
Kyösti Mälkkiae7ac8a2021-01-12 15:23:25 +020081 if (CONFIG(CHROMEOS)) {
82 acpigen_write_scope("\\");
83 acpigen_write_name_dword("NVB2", (uintptr_t)gnvs + GNVS_CHROMEOS_ACPI_OFFSET);
84 acpigen_write_name_dword("NVS2", 0xf00);
85 acpigen_pop_len();
86 }
87
Kyösti Mälkki4abc7312021-01-12 17:46:30 +020088 if (CONFIG(ACPI_HAS_DEVICE_NVS)) {
89 acpigen_write_scope("\\");
Kyösti Mälkkifa5f9b52021-01-19 14:12:19 +020090 acpigen_write_name_dword("NVB1", (uintptr_t)gnvs + GNVS_DEVICE_NVS_OFFSET);
91 acpigen_write_name_dword("NVS1", 0x1000);
Kyösti Mälkki4abc7312021-01-12 17:46:30 +020092 acpigen_pop_len();
93 }
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}