Hung-Te Lin submitted this change.

View Change

Approvals: build bot (Jenkins): Verified Angel Pons: Looks good to me, approved
ACPI: Allocate GNVS early in ramstage

We need this to happen prior to SMM module loader. If
there is some debugging output it's better they do not
appear in the middle of CPU bringup.

Change-Id: I45b4b5c0c5bf8bee258a465d1e364bfe98190e44
Signed-off-by: Kyösti Mälkki <kyosti.malkki@gmail.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/48697
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Angel Pons <th3fanbus@gmail.com>
---
M src/acpi/chromeos-gnvs.c
M src/acpi/gnvs.c
M src/include/acpi/acpi_gnvs.h
M src/lib/hardwaremain.c
4 files changed, 35 insertions(+), 9 deletions(-)

diff --git a/src/acpi/chromeos-gnvs.c b/src/acpi/chromeos-gnvs.c
index 4bcf892..bdd7d69 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 fbc84b3..c0a58f3 100644
--- a/src/acpi/gnvs.c
+++ b/src/acpi/gnvs.c
@@ -24,11 +24,22 @@

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 @@
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 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 6173fa1..1da6fd4 100644
--- a/src/include/acpi/acpi_gnvs.h
+++ b/src/include/acpi/acpi_gnvs.h
@@ -12,9 +12,10 @@
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 @@
* 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 173ee97..d040a0e 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 @@
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();


To view, visit change 48697. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: coreboot
Gerrit-Branch: master
Gerrit-Change-Id: I45b4b5c0c5bf8bee258a465d1e364bfe98190e44
Gerrit-Change-Number: 48697
Gerrit-PatchSet: 5
Gerrit-Owner: Kyösti Mälkki <kyosti.malkki@gmail.com>
Gerrit-Reviewer: Angel Pons <th3fanbus@gmail.com>
Gerrit-Reviewer: Hung-Te Lin <hungte@chromium.org>
Gerrit-Reviewer: build bot (Jenkins) <no-reply@coreboot.org>
Gerrit-CC: Paul Menzel <paulepanter@users.sourceforge.net>
Gerrit-MessageType: merged