diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/chromeos/boot_kernel.c | 2 | ||||
-rw-r--r-- | lib/chromeos/crossystem_data.c | 46 |
2 files changed, 48 insertions, 0 deletions
diff --git a/lib/chromeos/boot_kernel.c b/lib/chromeos/boot_kernel.c index 2012bea6f3..2edb5523ed 100644 --- a/lib/chromeos/boot_kernel.c +++ b/lib/chromeos/boot_kernel.c @@ -256,6 +256,8 @@ int boot_kernel(VbSelectAndLoadKernelParams *kparams, crossystem_data_t *cdata) #endif /* CONFIG_OF_UPDATE_FDT_BEFORE_BOOT */ #ifdef CONFIG_X86 + crossystem_data_update_acpi(cdata); + params = (struct boot_params *)(uintptr_t) (kparams->bootloader_address - CROS_PARAMS_SIZE); if (!setup_zimage(params, cmdline, 0, 0, 0)) diff --git a/lib/chromeos/crossystem_data.c b/lib/chromeos/crossystem_data.c index c2fbaeeebb..3720254c86 100644 --- a/lib/chromeos/crossystem_data.c +++ b/lib/chromeos/crossystem_data.c @@ -27,6 +27,8 @@ #define PREFIX "crossystem_data: " +DECLARE_GLOBAL_DATA_PTR; + int crossystem_data_init(crossystem_data_t *cdata, cros_gpio_t *write_protect_switch, cros_gpio_t *recovery_switch, @@ -236,6 +238,50 @@ int crossystem_data_embed_into_fdt(crossystem_data_t *cdata, void *fdt, } #endif /* ^^^^ CONFIG_OF_LIBFDT NOT defined ^^^^ */ +#ifdef CONFIG_X86 +int crossystem_data_update_acpi(crossystem_data_t *cdata) +{ + const void *fdt = gd->blob; + int node_offset, len; + const uint32_t *cell; + chromeos_acpi_t *acpi_table; + + node_offset = fdt_path_offset(fdt, "/chromeos-config"); + if (node_offset < 0) { + VBDEBUG("crossystem_data_update_acpi: Couldn't access " + "chromeos-config.\n"); + return 1; + } + cell = fdt_getprop(fdt, node_offset, "gnvs-vboot-table", NULL); + if (!cell) { + VBDEBUG("crossystem_data_update_acpi: Couldn't access " + "gnvs-vboot-table.\n"); + return 1; + } + acpi_table = (chromeos_acpi_t *)(uintptr_t)ntohl(*cell); + + acpi_table->vbt0 = BOOT_REASON_OTHER; + acpi_table->vbt1 = ACTIVE_MAINFW_RW_A; + acpi_table->vbt2 = cdata->active_ec_firmware; + acpi_table->vbt3 = + (cdata->boot_write_protect_switch ? CHSW_FIRMWARE_WP_DIS : 0) | + (cdata->boot_recovery_switch ? CHSW_RECOVERY_X86 : 0) | + (cdata->boot_developer_switch ? CHSW_DEVELOPER_SWITCH : 0); + + len = min(ID_LEN, sizeof(acpi_table->vbt4)); + memcpy(acpi_table->vbt4, cdata->hardware_id, len); + len = min(ID_LEN, sizeof(acpi_table->vbt5)); + memcpy(acpi_table->vbt5, cdata->firmware_id, len); + len = min(ID_LEN, sizeof(acpi_table->vbt6)); + memcpy(acpi_table->vbt6, cdata->readonly_firmware_id, len); + + acpi_table->vbt7 = cdata->firmware_type; + acpi_table->vbt8 = RECOVERY_REASON_NONE; + acpi_table->vbt9 = cdata->fmap_offset; + return 0; +} +#endif + void crossystem_data_dump(crossystem_data_t *cdata) { #define _p(format, field) \ |