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>
This commit is contained in:
Kyösti Mälkki
2020-06-17 13:45:16 +03:00
committed by Hung-Te Lin
parent 61bc2191c3
commit e0183d6540
4 changed files with 35 additions and 9 deletions

View File

@@ -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. */

View File

@@ -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();
}