diff options
-rw-r--r-- | src/acpi/chromeos-gnvs.c | 11 | ||||
-rw-r--r-- | src/acpi/gnvs.c | 22 | ||||
-rw-r--r-- | src/include/acpi/acpi_gnvs.h | 6 | ||||
-rw-r--r-- | src/lib/hardwaremain.c | 5 |
4 files changed, 35 insertions, 9 deletions
diff --git a/src/acpi/chromeos-gnvs.c b/src/acpi/chromeos-gnvs.c index 4bcf892745..bdd7d69cc5 100644 --- a/src/acpi/chromeos-gnvs.c +++ b/src/acpi/chromeos-gnvs.c @@ -4,9 +4,18 @@ #include <ec/google/chromeec/ec.h> #include <vendorcode/google/chromeos/gnvs.h> +/* Remove once implemented on platform code. */ +__weak void *gnvs_chromeos_ptr(struct global_nvs *gnvs) +{ + return NULL; +} + void gnvs_assign_chromeos(void) { - chromeos_acpi_t *gnvs_chromeos = gnvs_chromeos_ptr(); + chromeos_acpi_t *gnvs_chromeos = gnvs_chromeos_ptr(acpi_get_gnvs()); + if (!gnvs_chromeos) + return; + chromeos_init_chromeos_acpi(gnvs_chromeos); /* EC can override to ECFW_RW. */ diff --git a/src/acpi/gnvs.c b/src/acpi/gnvs.c index fbc84b36fd..c0a58f3ba7 100644 --- a/src/acpi/gnvs.c +++ b/src/acpi/gnvs.c @@ -24,11 +24,22 @@ void *acpi_get_gnvs(void) static void gnvs_assign_cbmc(void) { - uint32_t *gnvs_cbmc = gnvs_cbmc_ptr(); + uint32_t *gnvs_cbmc = gnvs_cbmc_ptr(gnvs); if (gnvs_cbmc) *gnvs_cbmc = (uintptr_t)cbmem_find(CBMEM_ID_CONSOLE); } +/* Platforms that implement GNVS will need to implement these. */ +__weak size_t gnvs_size_of_array(void) +{ + return 0; +} + +__weak uint32_t *gnvs_cbmc_ptr(struct global_nvs *gnvs_) +{ + return NULL; +} + void *gnvs_get_or_create(void) { size_t gnvs_size; @@ -41,10 +52,12 @@ void *gnvs_get_or_create(void) return gnvs; gnvs_size = gnvs_size_of_array(); + if (!gnvs_size) + return NULL; gnvs = cbmem_add(CBMEM_ID_ACPI_GNVS, gnvs_size); if (!gnvs) - return gnvs; + return NULL; memset(gnvs, 0, gnvs_size); @@ -59,11 +72,10 @@ void *gnvs_get_or_create(void) void acpi_inject_nvsa(void) { - uintptr_t gnvs_address = (uintptr_t)acpi_get_gnvs(); - if (!gnvs_address) + if (!gnvs) return; acpigen_write_scope("\\"); - acpigen_write_name_dword("NVSA", gnvs_address); + acpigen_write_name_dword("NVSA", (uintptr_t)gnvs); acpigen_pop_len(); } diff --git a/src/include/acpi/acpi_gnvs.h b/src/include/acpi/acpi_gnvs.h index 6173fa168b..1da6fd493a 100644 --- a/src/include/acpi/acpi_gnvs.h +++ b/src/include/acpi/acpi_gnvs.h @@ -12,9 +12,10 @@ void acpi_inject_nvsa(void); void gnvs_assign_chromeos(void); /* Platform code must implement these. */ +struct global_nvs; size_t gnvs_size_of_array(void); -uint32_t *gnvs_cbmc_ptr(void); -void *gnvs_chromeos_ptr(void); +uint32_t *gnvs_cbmc_ptr(struct global_nvs *gnvs); +void *gnvs_chromeos_ptr(struct global_nvs *gnvs); /* * Creates acpi gnvs and adds it to the DSDT table. @@ -28,7 +29,6 @@ void southbridge_inject_dsdt(const struct device *device); * Defined as weak in common acpi as gnvs structure definition is * chipset specific. */ -struct global_nvs; void acpi_create_gnvs(struct global_nvs *gnvs); void acpi_init_gnvs(struct global_nvs *gnvs); diff --git a/src/lib/hardwaremain.c b/src/lib/hardwaremain.c index 173ee97192..d040a0ef93 100644 --- a/src/lib/hardwaremain.c +++ b/src/lib/hardwaremain.c @@ -7,6 +7,7 @@ #include <adainit.h> #include <acpi/acpi.h> +#include <acpi/acpi_gnvs.h> #include <arch/exception.h> #include <bootstate.h> #include <console/console.h> @@ -447,6 +448,10 @@ void main(void) acpi_is_wakeup_s3(); threads_initialize(); + /* Initialise GNVS early. */ + if (CONFIG(HAVE_ACPI_TABLES)) + gnvs_get_or_create(); + /* Schedule the static boot state entries. */ boot_state_schedule_static_entries(); |