From 737aa42b27b80930564b32f9efbf04f5539d39c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kope=C4=87?= Date: Mon, 3 Jan 2022 12:13:53 +0100 Subject: [PATCH] add fmap support in flashrom plugin MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Michał Kopeć --- .../flashrom/fu-flashrom-internal-device.c | 66 +++++++++++++++---- 1 file changed, 52 insertions(+), 14 deletions(-) diff --git a/plugins/flashrom/fu-flashrom-internal-device.c b/plugins/flashrom/fu-flashrom-internal-device.c index e37725dedab5..24820a047fb1 100644 --- a/plugins/flashrom/fu-flashrom-internal-device.c +++ b/plugins/flashrom/fu-flashrom-internal-device.c @@ -101,6 +101,22 @@ fu_flashrom_internal_device_prepare(FuDevice *device, FwupdInstallFlags flags, G return TRUE; } +static gboolean +fu_flashrom_has_vboot(FuFlashromDevice *device) +{ + struct flashrom_flashctx *flashctx = fu_flashrom_device_get_flashctx(device); + gsize flash_size = fu_flashrom_device_get_flash_size(device); + struct flashrom_layout *layout; + + if (flashrom_layout_read_fmap_from_rom(&layout, flashctx, 0, flash_size)) + return FALSE; + + if (flashrom_layout_include_region(layout, "RW_SECTION_A")) + return FALSE; + + return TRUE; +} + static gboolean fu_flashrom_internal_device_write_firmware(FuDevice *device, FuFirmware *firmware, @@ -127,21 +143,43 @@ fu_flashrom_internal_device_write_firmware(FuDevice *device, buf = g_bytes_get_data(blob_fw, &sz); - if (flashrom_layout_read_from_ifd(&layout, flashctx, NULL, 0)) { - g_set_error_literal(error, - FWUPD_ERROR, - FWUPD_ERROR_READ, - "failed to read layout from Intel ICH descriptor"); - return FALSE; - } + if (fu_flashrom_has_vboot(parent)) { + g_debug("vboot detected, attempting FMAP path"); + if (flashrom_layout_read_fmap_from_rom(&layout, flashctx, 0, flash_size)) { + g_set_error_literal(error, + FWUPD_ERROR, + FWUPD_ERROR_READ, + "failed to read FMAP from ROM"); + } + g_debug("fmap read"); + if (flashrom_layout_include_region(layout, "RW_SECTION_A")) { + g_set_error_literal(error, + FWUPD_ERROR, + FWUPD_ERROR_NOT_SUPPORTED, + "invalid region name"); + return FALSE; + } + g_debug("rw_a included"); + /* for now, always include both RW sections if present */ + flashrom_layout_include_region(layout, "RW_SECTION_B"); - /* include bios region for safety reasons */ - if (flashrom_layout_include_region(layout, "bios")) { - g_set_error_literal(error, - FWUPD_ERROR, - FWUPD_ERROR_NOT_SUPPORTED, - "invalid region name"); - return FALSE; + } else { + g_debug("vboot not detected, attempting IFD"); + if (flashrom_layout_read_from_ifd(&layout, flashctx, NULL, 0)) { + g_set_error_literal(error, + FWUPD_ERROR, + FWUPD_ERROR_READ, + "failed to read layout from Intel ICH descriptor"); + return FALSE; + } + /* include bios region for safety reasons */ + if (flashrom_layout_include_region(layout, "bios")) { + g_set_error_literal(error, + FWUPD_ERROR, + FWUPD_ERROR_NOT_SUPPORTED, + "invalid region name"); + return FALSE; + } } /* write region */