Files
system76-coreboot/src/vendorcode/google/chromeos/gnvs.c
Kyösti Mälkki 8a1fcf4754 vc/google/chromeos: Refactor GNVS init
Move the support code for filling ChromeOS GNVS from
acpi/chromeos-gnvs.c to vc/google/chromeos/gnvs.c.

Change-Id: I7e92206561812eb3dc69739df49b6c3a93853858
Signed-off-by: Kyösti Mälkki <kyosti.malkki@gmail.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/50612
Reviewed-by: Tim Wawrzynczak <twawrzynczak@chromium.org>
Reviewed-by: Furquan Shaikh <furquan@google.com>
Reviewed-by: Angel Pons <th3fanbus@gmail.com>
Reviewed-by: Lance Zhao
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
2021-04-30 06:46:07 +00:00

93 lines
2.0 KiB
C

/* SPDX-License-Identifier: GPL-2.0-only */
#include <acpi/acpi_gnvs.h>
#include <types.h>
#include <string.h>
#include <stdlib.h>
#include <cbfs.h>
#include <cbmem.h>
#include <console/console.h>
#include <ec/google/chromeec/ec.h>
#include <fmap.h>
#include <security/vboot/vbnv.h>
#include <security/vboot/vboot_common.h>
#include <smbios.h>
#include "chromeos.h"
#include "gnvs.h"
static chromeos_acpi_t *chromeos_acpi;
static size_t chromeos_vpd_region(const char *region, uintptr_t *base)
{
struct region_device vpd;
if (fmap_locate_area_as_rdev(region, &vpd))
return 0;
*base = (uintptr_t)rdev_mmap_full(&vpd);
return region_device_sz(&vpd);
}
void chromeos_init_chromeos_acpi(chromeos_acpi_t *init)
{
size_t vpd_size;
uintptr_t vpd_base = 0;
chromeos_acpi = init;
vpd_size = chromeos_vpd_region("RO_VPD", &vpd_base);
if (vpd_size && vpd_base) {
chromeos_acpi->vpd_ro_base = vpd_base;
chromeos_acpi->vpd_ro_size = vpd_size;
}
vpd_size = chromeos_vpd_region("RW_VPD", &vpd_base);
if (vpd_size && vpd_base) {
chromeos_acpi->vpd_rw_base = vpd_base;
chromeos_acpi->vpd_rw_size = vpd_size;
}
/* EC can override to ECFW_RW. */
chromeos_acpi->vbt2 = ACTIVE_ECFW_RO;
if (CONFIG(EC_GOOGLE_CHROMEEC) && !google_ec_running_ro())
chromeos_acpi->vbt2 = ACTIVE_ECFW_RW;
}
void chromeos_set_me_hash(u32 *hash, int len)
{
if ((len*sizeof(u32)) > sizeof(chromeos_acpi->mehh))
return;
/* Copy to NVS. */
if (chromeos_acpi)
memcpy(chromeos_acpi->mehh, hash, len*sizeof(u32));
}
void chromeos_set_ramoops(void *ram_oops, size_t size)
{
if (!chromeos_acpi)
return;
printk(BIOS_DEBUG, "Ramoops buffer: 0x%zx@%p.\n", size, ram_oops);
chromeos_acpi->ramoops_base = (uintptr_t)ram_oops;
chromeos_acpi->ramoops_len = size;
}
void gnvs_set_ecfw_rw(void)
{
if (!chromeos_acpi)
return;
chromeos_acpi->vbt2 = ACTIVE_ECFW_RW;
}
void smbios_type0_bios_version(uintptr_t address)
{
if (!chromeos_acpi)
return;
/* Location of smbios_type0.bios_version() string filled with spaces. */
chromeos_acpi->vbt10 = address;
}