From 4bd9187dadaf4f3be5a1776d98d1f79cdfb23de8 Mon Sep 17 00:00:00 2001 From: Kyösti Mälkki Date: Tue, 16 Mar 2021 19:02:26 +0200 Subject: ACPI: Refactor use of global and device NVS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit After ChromeOS NVS was moved to a separate allocation and the use of multiple OperationRegions, maintaining the fixed offsets is not necessary. Use actual structure size for OperationRegions, but align the allocations to 8 bytes or sizeof(uint64_t). Change-Id: I9c73b7c44d234af42c571b23187b924ca2c3894a Signed-off-by: Kyösti Mälkki Reviewed-on: https://review.coreboot.org/c/coreboot/+/51639 Tested-by: build bot (Jenkins) Reviewed-by: Angel Pons --- src/acpi/Kconfig | 3 --- src/acpi/acpigen_extern.asl | 3 --- src/acpi/gnvs.c | 36 ++++++++++++++++-------------------- 3 files changed, 16 insertions(+), 26 deletions(-) (limited to 'src/acpi') diff --git a/src/acpi/Kconfig b/src/acpi/Kconfig index 9ffd7a93ad..d1051d8030 100644 --- a/src/acpi/Kconfig +++ b/src/acpi/Kconfig @@ -30,9 +30,6 @@ config ACPI_SOC_NVS Set to indicate exists for the platform with a definition for global_nvs. -config ACPI_HAS_DEVICE_NVS - bool - config ACPI_NO_PCAT_8259 bool help diff --git a/src/acpi/acpigen_extern.asl b/src/acpi/acpigen_extern.asl index 1a6217adb8..c778376bf2 100644 --- a/src/acpi/acpigen_extern.asl +++ b/src/acpi/acpigen_extern.asl @@ -9,9 +9,6 @@ #if CONFIG(ACPI_SOC_NVS) External (GNVS, OpRegionObj) -#endif - -#if CONFIG(ACPI_HAS_DEVICE_NVS) External (DNVS, OpRegionObj) #endif diff --git a/src/acpi/gnvs.c b/src/acpi/gnvs.c index d7fe380729..8024783af7 100644 --- a/src/acpi/gnvs.c +++ b/src/acpi/gnvs.c @@ -8,32 +8,28 @@ #include #include #include -#include static struct global_nvs *gnvs; +static void *dnvs; void acpi_create_gnvs(void) { - size_t gnvs_size; + const size_t gnvs_size = ALIGN_UP(sizeof(struct global_nvs), sizeof(uint64_t)); + const size_t dnvs_size = ALIGN_UP(size_of_dnvs(), sizeof(uint64_t)); gnvs = cbmem_find(CBMEM_ID_ACPI_GNVS); if (gnvs) return; - /* Match with OpRegion declared in global_nvs.asl. */ - gnvs_size = sizeof(struct global_nvs); - if (gnvs_size < 0x100) - gnvs_size = 0x100; - if (CONFIG(ACPI_HAS_DEVICE_NVS)) - gnvs_size = 0x2000; - else if (CONFIG(CHROMEOS_NVS)) - gnvs_size = 0x1000; - - gnvs = cbmem_add(CBMEM_ID_ACPI_GNVS, gnvs_size); + /* Allocate for both GNVS and DNVS OpRegions. */ + gnvs = cbmem_add(CBMEM_ID_ACPI_GNVS, gnvs_size + dnvs_size); if (!gnvs) return; - memset(gnvs, 0, gnvs_size); + memset(gnvs, 0, gnvs_size + dnvs_size); + + if (dnvs_size) + dnvs = (char *)gnvs + gnvs_size; if (CONFIG(CONSOLE_CBMEM)) gnvs->cbmc = (uintptr_t)cbmem_find(CBMEM_ID_CONSOLE); @@ -54,19 +50,21 @@ void *acpi_get_gnvs(void) void *acpi_get_device_nvs(void) { - return (u8 *)gnvs + GNVS_DEVICE_NVS_OFFSET; + return dnvs; } /* Implemented under platform. */ __weak void soc_fill_gnvs(struct global_nvs *gnvs_) { } __weak void mainboard_fill_gnvs(struct global_nvs *gnvs_) { } +__weak size_t size_of_dnvs(void) { return 0; } /* Called from write_acpi_tables() only on normal boot path. */ void acpi_fill_gnvs(void) { - const struct opregion gnvs_op = OPREGION("GNVS", SYSTEMMEMORY, (uintptr_t)gnvs, 0x100); - const struct opregion dnvs_op = OPREGION("DNVS", SYSTEMMEMORY, - (uintptr_t)gnvs + GNVS_DEVICE_NVS_OFFSET, 0x1000); + const struct opregion gnvs_op = OPREGION("GNVS", SYSTEMMEMORY, (uintptr_t)gnvs, + sizeof(struct global_nvs)); + const struct opregion dnvs_op = OPREGION("DNVS", SYSTEMMEMORY, (uintptr_t)dnvs, + size_of_dnvs()); if (!gnvs) return; @@ -76,10 +74,8 @@ void acpi_fill_gnvs(void) acpigen_write_scope("\\"); acpigen_write_opregion(&gnvs_op); - - if (CONFIG(ACPI_HAS_DEVICE_NVS)) + if (dnvs) acpigen_write_opregion(&dnvs_op); - acpigen_pop_len(); } -- cgit v1.2.3