Re: [PATCH v5 23/23] sandbox: fwu: Add support for testing FWU feature on sandbox

Takahiro Akashi
2022-06-17T01:08:57Z

Sughosh,

On Wed, Jun 15, 2022 at 05:40:12PM +0530, Sughosh Ganu wrote:
> On Wed, 15 Jun 2022 at 11:07, Takahiro Akashi
> <takahiro.akashi@linaro.org> wrote:
> >
> > On Thu, Jun 09, 2022 at 06:00:10PM +0530, Sughosh Ganu wrote:
> > > Add a python test script for testing the FWU Multi Bank Update
> > > functionality on the sandbox platform. The script has test cases for
> > > updation of the u-boot binary and the u-boot environment image to the
> > > non active bank.
> > >
> > > The FWU metadata is being stored on the SPI NOR flash, along with the
> > > updatable images, and the FWU metadata driver for MTD devices is being
> > > used for accessing the metadata. Certain FWU boottime checks are
> > > bypassed due to the unavailability of the EFI variable access very
> > > early in the boot on the sandbox platform -- the variable access is
> > > only available once the block disk image has been bound through the
> > > host interface.
> > >
> > > The FWU Multi Bank feature being enabled on the sandbox64 platform is
> > > enabling the RAW Firmware Management Protocol(FMP) instance, therefore
> > > the FIT FMP instance is being removed -- the FIT FMP is already being
> > > tested on the sandbox flattree variant.
> >
> > IMO,
> > Thinking of the importance of this feature, FIT FMP should also be
> > tested *with FWU*.
>
> How will the FWU update feature work for FIT images? As I understand

So are you deliberately designing and proposing a solution that is
incompatible with (or not applicable to) an existing interface (FIT FMP)?

> FIT, it is a way of packaging different firmware images into a single
> package. At the time of writing the images, the FIT image parser would
> check the image configuration, and write the images to their
> respective locations. As you are aware, for the FWU feature, the
> information about the images, and the update bank is obtained from the
> structure called metadata. How does the FIT update mechanism map with
> the FWU metadata which is used to identify which bank needs to be
> updated. The bank to which the image is to be written translates into
> the DFU alt_num value for that image, and this gets computed at
> runtime. In the case of the FIT image, as per my understanding, the
> alt_num value is irrelevant. So my question is, how do we map the
> information obtained from the FWU metadata to tell the FIT image
> writing function(fit_update) which locations do the images need to be
> written to. I think this needs some more thought.
>
> >
> > > Signed-off-by: Sughosh Ganu <sughosh.ganu@linaro.org>
> > > ---
> > > arch/sandbox/Kconfig | 6 +
> > > arch/sandbox/dts/test.dts | 45 ++-
> > > board/sandbox/sandbox.c | 49 +++
> > > configs/sandbox64_defconfig | 12 +-
> > > include/fwu.h | 2 +
> > > lib/fwu_updates/Kconfig | 2 +-
> > > lib/fwu_updates/fwu.c | 18 +-
> > > lib/fwu_updates/fwu_mtd.c | 10 +-
> > > .../test_capsule_firmware_fit.py | 1 -
> > > .../py/tests/test_fwu_updates/capsule_defs.py | 10 +
> > > test/py/tests/test_fwu_updates/conftest.py | 78 ++++
> > > .../test_fwu_updates/test_fwu_updates.py | 367 ++++++++++++++++++
> > > 12 files changed, 587 insertions(+), 13 deletions(-)
> > > create mode 100644 test/py/tests/test_fwu_updates/capsule_defs.py
> > > create mode 100644 test/py/tests/test_fwu_updates/conftest.py
> > > create mode 100644 test/py/tests/test_fwu_updates/test_fwu_updates.py
> > >
>
> <snip>
>
> > > diff --git a/test/py/tests/test_fwu_updates/conftest.py b/test/py/tests/test_fwu_updates/conftest.py
> > > new file mode 100644
> > > index 0000000000..cdf824c3be
> > > --- /dev/null
> > > +++ b/test/py/tests/test_fwu_updates/conftest.py
> > > @@ -0,0 +1,78 @@
> > > +# SPDX-License-Identifier: GPL-2.0+
> > > +# Copyright (c) 2020, Linaro Limited
> > > +# Author: AKASHI Takahiro <takahiro.akashi@linaro.org>
> >
> > If this file is exactly same as test_efi_capsule/conftest.py,
> > why not move all the tests (test_fwu_updates.py) to test_efi_capsule?
>
> The files are not exactly the same. There is use of the mkfwumdata
> utility used for FWU tests, along with the capsule files that are
> being generated. I had tried putting the code under the
> test_efi_capsule directory, but the result was getting cluttered.

Okay, but from my curiosity, how cluttered was it?
It seems to me that you are simply adding extra setup steps.

My simple concern is that, if there is a fair amount of common code
between two tests, it should be unified for maintainability.

-Takahiro Akashi

> Which is why I decided to put the changes separately under the
> test_fwu_updates directory.
>
> >
> > The basic scenario of updating firmware, u-boot.bin and u-boot.env,
> > is also the same, isn't it? The only difference is whether FWU_MULTI_BANK_UPDATE
> > is enabled or not.
>
> There are two capsule files per image, one per bank. Also, the FWU
> metadata is being written to the SPI NOR device, which is being
> formatted as a MTD partitioned device. The underlying update mechanism
> is the same, yes.
>
> -sughosh
>
> >
> > -Takahiro Akashi
> >
> > > +
> > > +import os
> > > +import os.path
> > > +import re
> > > +from subprocess import call, check_call, check_output, CalledProcessError
> > > +import pytest
> > > +from capsule_defs import *
> > > +
> > > +#
> > > +# Fixture for UEFI capsule test
> > > +#
> > > +
> > > +@pytest.fixture(scope='session')
> > > +def efi_capsule_data(request, u_boot_config):
> > > + """Set up a file system to be used in UEFI capsule and
> > > + authentication test.
> > > +
> > > + Args:
> > > + request: Pytest request object.
> > > + u_boot_config: U-boot configuration.
> > > +
> > > + Return:
> > > + A path to disk image to be used for testing
> > > + """
> > > + global CAPSULE_DATA_DIR, CAPSULE_INSTALL_DIR
> > > +
> > > + mnt_point = u_boot_config.persistent_data_dir + '/test_efi_capsule'
> > > + data_dir = mnt_point + CAPSULE_DATA_DIR
> > > + install_dir = mnt_point + CAPSULE_INSTALL_DIR
> > > + image_path = u_boot_config.persistent_data_dir + '/test_efi_capsule.img'
> > > +
> > > + try:
> > > + # Create a target device
> > > + check_call('dd if=/dev/zero of=./spi.bin bs=1MiB count=16', shell=True)
> > > +
> > > + check_call('rm -rf %s' % mnt_point, shell=True)
> > > + check_call('mkdir -p %s' % data_dir, shell=True)
> > > + check_call('mkdir -p %s' % install_dir, shell=True)
> > > +
> > > + # Create capsule files
> > > + # two regions: one for u-boot.bin and the other for u-boot.env
> > > + check_call('cd %s; echo -n u-boot-a:Old > u-boot-a.bin.old; echo -n u-boot-env-a:Old > u-boot-env-a.old; echo -n u-boot-a:New > u-boot-a.bin.new; echo -n u-boot-env-a:New > u-boot-env-a.new; echo -n u-boot-b:Old > u-boot-b.bin.old; echo -n u-boot-env-b:Old > u-boot-env-b.old; echo -n u-boot-b:New > u-boot-b.bin.new; echo -n u-boot-env-b:New > u-boot-env-b.new;' % data_dir,
> > > + shell=True)
> > > + check_call('cd %s; %s/tools/mkfwumdata -i 2 -b 2 -a 0 -g af9e8c96-bec5-48be-9dab-3491c04b1366,09D7CF52-0720-4710-91D1-08469B7FE9C8,a8f61787-5d68-4c9d-9e4a-37bb0df99da7,52377abf-c4e4-4d0b-aafd-ba081a500847 af9e8c96-bec5-48be-9dab-3491c04b1366,5A7021F5-FEF2-48B4-AABA-832E777418C0,ea9d59af-e0e8-4ef5-9b16-4c80ff67524c,4e01d1fa-eebb-437e-9cfe-e7dfbcd04bb3 metadata_bank0.bin' %(data_dir, u_boot_config.build_dir), shell=True)
> > > + check_call('cd %s; %s/tools/mkfwumdata -i 2 -b 2 -a 1 -g af9e8c96-bec5-48be-9dab-3491c04b1366,09D7CF52-0720-4710-91D1-08469B7FE9C8,a8f61787-5d68-4c9d-9e4a-37bb0df99da7,52377abf-c4e4-4d0b-aafd-ba081a500847 af9e8c96-bec5-48be-9dab-3491c04b1366,5A7021F5-FEF2-48B4-AABA-832E777418C0,ea9d59af-e0e8-4ef5-9b16-4c80ff67524c,4e01d1fa-eebb-437e-9cfe-e7dfbcd04bb3 metadata_bank1.bin' %(data_dir, u_boot_config.build_dir), shell=True)
> > > +
> > > + check_call('cd %s; %s/tools/mkeficapsule --index 1 --guid 09D7CF52-0720-4710-91D1-08469B7FE9C8 u-boot-b.bin.new Test01' %
> > > + (data_dir, u_boot_config.build_dir),
> > > + shell=True)
> > > + check_call('cd %s; %s/tools/mkeficapsule --index 1 --guid 5A7021F5-FEF2-48B4-AABA-832E777418C0 u-boot-env-b.new Test02' %
> > > + (data_dir, u_boot_config.build_dir),
> > > + shell=True)
> > > +
> > > + check_call('cd %s; %s/tools/mkeficapsule --index 1 --guid 09D7CF52-0720-4710-91D1-08469B7FE9C8 u-boot-a.bin.new Test03' %
> > > + (data_dir, u_boot_config.build_dir),
> > > + shell=True)
> > > + check_call('cd %s; %s/tools/mkeficapsule --index 1 --guid 5A7021F5-FEF2-48B4-AABA-832E777418C0 u-boot-env-a.new Test04' %
> > > + (data_dir, u_boot_config.build_dir),
> > > + shell=True)
> > > +
> > > + # Create a disk image with EFI system partition
> > > + check_call('virt-make-fs --partition=gpt --size=+1M --type=vfat %s %s' %
> > > + (mnt_point, image_path), shell=True)
> > > + check_call('sgdisk %s -A 1:set:0 -t 1:C12A7328-F81F-11D2-BA4B-00A0C93EC93B' %
> > > + image_path, shell=True)
> > > +
> > > + except CalledProcessError as exception:
> > > + pytest.skip('Setup failed: %s' % exception.cmd)
> > > + return
> > > + else:
> > > + yield image_path
> > > + finally:
> > > + call('rm -rf %s' % mnt_point, shell=True)
> > > + call('rm -f %s' % image_path, shell=True)
> > > + call('rm -f ./spi.bin', shell=True)
> > > diff --git a/test/py/tests/test_fwu_updates/test_fwu_updates.py b/test/py/tests/test_fwu_updates/test_fwu_updates.py
> > > new file mode 100644
> > > index 0000000000..d9dff3afaf
> > > --- /dev/null
> > > +++ b/test/py/tests/test_fwu_updates/test_fwu_updates.py
> > > @@ -0,0 +1,367 @@
> > > +# SPDX-License-Identifier: GPL-2.0+
> > > +# Copyright (c) 2022, Linaro Limited
> > > +#
> > > +# FWU Multi Bank Firmware Update Test
> > > +
> > > +"""
> > > +This test verifies FWU Multi Bank firmware update for raw images
> > > +"""
> > > +
> > > +from subprocess import check_call, check_output, CalledProcessError
> > > +import pytest
> > > +from capsule_defs import *
> > > +
> > > +
> > > +@pytest.mark.boardspec('sandbox64')
> > > +@pytest.mark.buildconfigspec('efi_capsule_firmware_raw')
> > > +@pytest.mark.buildconfigspec('efi_capsule_on_disk')
> > > +@pytest.mark.buildconfigspec('dfu')
> > > +@pytest.mark.buildconfigspec('dfu_sf')
> > > +@pytest.mark.buildconfigspec('cmd_efidebug')
> > > +@pytest.mark.buildconfigspec('cmd_fat')
> > > +@pytest.mark.buildconfigspec('cmd_memory')
> > > +@pytest.mark.buildconfigspec('cmd_nvedit_efi')
> > > +@pytest.mark.buildconfigspec('cmd_sf')
> > > +@pytest.mark.buildconfigspec('fwu_multi_bank_update')
> > > +@pytest.mark.buildconfigspec('dm_fwu_mdata')
> > > +@pytest.mark.buildconfigspec('fwu_mdata_mtd')
> > > +@pytest.mark.slow
> > > +class TestEfiCapsuleFirmwareRaw(object):
> > > + def test_fwu_updates_fw1(
> > > + self, u_boot_config, u_boot_console, efi_capsule_data):
> > > + """
> > > + Test Case 1 - Update U-Boot Bank 1 binary on SPI Flash
> > > + 0x100000-0x150000: U-Boot binary Bank 0 (but dummy)
> > > + 0x150000-0x200000: U-Boot binary Bank 1 (but dummy)
> > > + """
> > > +
> > > + # other tests might have run and the
> > > + # system might not be in a clean state.
> > > + # Restart before starting the tests.
> > > + u_boot_console.restart_uboot()
> > > +
> > > + disk_img = efi_capsule_data
> > > + with u_boot_console.log.section('Test Case 1-a, before reboot'):
> > > + output = u_boot_console.run_command_list([
> > > + 'host bind 0 %s' % disk_img,
> > > + 'efidebug boot add -b 1 TEST host 0:1 /helloworld.efi -s ""',
> > > + 'efidebug boot order 1',
> > > + 'env set -e -nv -bs -rt OsIndications =0x0000000000000004',
> > > + 'env save'])
> > > +
> > > + # initialize contents
> > > + output = u_boot_console.run_command_list([
> > > + 'sf probe 0:0',
> > > + 'fatload host 0:1 4000000 %s/u-boot-a.bin.old' % CAPSULE_DATA_DIR,
> > > + 'sf write 4000000 100000 10',
> > > + 'fatload host 0:1 4000000 %s/u-boot-b.bin.old' % CAPSULE_DATA_DIR,
> > > + 'sf write 4000000 140000 10'])
> > > +
> > > + output = u_boot_console.run_command_list([
> > > + 'sf read 5000000 100000 10',
> > > + 'md.b 5000000 10'
> > > + ])
> > > + assert 'u-boot-a:Old' in ''.join(output)
> > > +
> > > + output = u_boot_console.run_command_list([
> > > + 'sf read 5100000 140000 10',
> > > + 'md.b 5100000 10'
> > > + ])
> > > + assert 'u-boot-b:Old' in ''.join(output)
> > > +
> > > + output = u_boot_console.run_command_list([
> > > + 'sf probe 0:0',
> > > + 'fatload host 0:1 4000000 %s/metadata_bank0.bin' % CAPSULE_DATA_DIR,
> > > + 'sf write 4000000 0 $filesize',
> > > + 'sf write 4000000 10000 $filesize'])
> > > +
> > > + output = u_boot_console.run_command(
> > > + 'fwu_mdata_read')
> > > + assert 'active_index: 0x0' in ''.join(output)
> > > + assert 'previous_active_index: 0x1' in ''.join(output)
> > > +
> > > + # place a capsule file
> > > + output = u_boot_console.run_command_list([
> > > + 'fatload host 0:1 4000000 %s/Test01' % CAPSULE_DATA_DIR,
> > > + 'fatwrite host 0:1 4000000 %s/Test01 $filesize' % CAPSULE_INSTALL_DIR,
> > > + 'fatls host 0:1 %s' % CAPSULE_INSTALL_DIR])
> > > + assert 'Test01' in ''.join(output)
> > > +
> > > + # reboot
> > > + u_boot_console.restart_uboot()
> > > +
> > > + with u_boot_console.log.section('Test Case 1-b, after reboot'):
> > > + # make sure that dfu_alt_info exists even persistent variables
> > > + # are not available.
> > > + output = u_boot_console.run_command_list([
> > > + 'host bind 0 %s' % disk_img,
> > > + 'fatls host 0:1 %s' % CAPSULE_INSTALL_DIR])
> > > + assert 'Test01' in ''.join(output)
> > > +
> > > + # need to run uefi command to initiate capsule handling
> > > + output = u_boot_console.run_command(
> > > + 'efidebug capsule disk-update', wait_for_reboot = True)
> > > +
> > > + output = u_boot_console.run_command(
> > > + 'fwu_mdata_read')
> > > + assert 'active_index: 0x1' in ''.join(output)
> > > + assert 'previous_active_index: 0x0' in ''.join(output)
> > > +
> > > + output = u_boot_console.run_command_list([
> > > + 'sf probe 0:0',
> > > + 'sf read 4000000 100000 10',
> > > + 'md.b 4000000 10'])
> > > + assert 'u-boot-a:Old' in ''.join(output)
> > > +
> > > + output = u_boot_console.run_command_list([
> > > + 'sf read 4000000 140000 10',
> > > + 'md.b 4000000 10'])
> > > + assert 'u-boot-b:New' in ''.join(output)
> > > +
> > > + def test_fwu_updates_fw2(
> > > + self, u_boot_config, u_boot_console, efi_capsule_data):
> > > + """
> > > + Test Case 2 - Update U-Boot and U-Boot Env Bank 1 binary on SPI Flash
> > > + 0x100000-0x110000: U-Boot binary Bank 0 (but dummy)
> > > + 0x120000-0x130000: U-Boot Env binary Bank 0 (but dummy)
> > > + 0x140000-0x150000: U-Boot binary Bank 1 (but dummy)
> > > + 0x160000-0x170000: U-Boot Env binary Bank 1 (but dummy)
> > > + """
> > > +
> > > + # other tests might have run and the
> > > + # system might not be in a clean state.
> > > + # Restart before starting the tests.
> > > + u_boot_console.restart_uboot()
> > > +
> > > + disk_img = efi_capsule_data
> > > + with u_boot_console.log.section('Test Case 2-a, before reboot'):
> > > + output = u_boot_console.run_command_list([
> > > + 'host bind 0 %s' % disk_img,
> > > + 'efidebug boot add -b 1 TEST host 0:1 /helloworld.efi -s ""',
> > > + 'efidebug boot order 1',
> > > + 'env set -e -nv -bs -rt OsIndications =0x0000000000000004',
> > > + 'env save'])
> > > +
> > > + # initialize contents
> > > + output = u_boot_console.run_command_list([
> > > + 'sf probe 0:0',
> > > + 'fatload host 0:1 4000000 %s/u-boot-a.bin.old' % CAPSULE_DATA_DIR,
> > > + 'sf write 4000000 100000 10',
> > > + 'fatload host 0:1 4000000 %s/u-boot-env-a.old' % CAPSULE_DATA_DIR,
> > > + 'sf write 4000000 120000 10',
> > > + 'fatload host 0:1 4000000 %s/u-boot-b.bin.old' % CAPSULE_DATA_DIR,
> > > + 'sf write 4000000 140000 10',
> > > + 'fatload host 0:1 4000000 %s/u-boot-env-b.old' % CAPSULE_DATA_DIR,
> > > + 'sf write 4000000 160000 10'])
> > > +
> > > + output = u_boot_console.run_command_list([
> > > + 'sf read 5000000 100000 10',
> > > + 'md.b 5000000 10'
> > > + ])
> > > + assert 'u-boot-a:Old' in ''.join(output)
> > > +
> > > + output = u_boot_console.run_command_list([
> > > + 'sf read 5000000 120000 10',
> > > + 'md.b 5000000 10'
> > > + ])
> > > + assert 'u-boot-env-a:Old' in ''.join(output)
> > > +
> > > + output = u_boot_console.run_command_list([
> > > + 'sf read 5100000 140000 10',
> > > + 'md.b 5100000 10'
> > > + ])
> > > + assert 'u-boot-b:Old' in ''.join(output)
> > > +
> > > + output = u_boot_console.run_command_list([
> > > + 'sf read 5000000 160000 10',
> > > + 'md.b 5000000 10'
> > > + ])
> > > + assert 'u-boot-env-b:Old' in ''.join(output)
> > > +
> > > + output = u_boot_console.run_command_list([
> > > + 'sf probe 0:0',
> > > + 'fatload host 0:1 4000000 %s/metadata_bank0.bin' % CAPSULE_DATA_DIR,
> > > + 'sf write 4000000 0 100',
> > > + 'sf write 4000000 10000 100'])
> > > +
> > > + output = u_boot_console.run_command(
> > > + 'fwu_mdata_read')
> > > + assert 'active_index: 0x0' in ''.join(output)
> > > + assert 'previous_active_index: 0x1' in ''.join(output)
> > > +
> > > + # place a capsule file
> > > + output = u_boot_console.run_command_list([
> > > + 'fatload host 0:1 4000000 %s/Test01' % CAPSULE_DATA_DIR,
> > > + 'fatwrite host 0:1 4000000 %s/Test01 $filesize' % CAPSULE_INSTALL_DIR,
> > > + 'fatload host 0:1 4000000 %s/Test02' % CAPSULE_DATA_DIR,
> > > + 'fatwrite host 0:1 4000000 %s/Test02 $filesize' % CAPSULE_INSTALL_DIR,
> > > + 'fatls host 0:1 %s' % CAPSULE_INSTALL_DIR])
> > > + assert 'Test01' in ''.join(output)
> > > + assert 'Test02' in ''.join(output)
> > > +
> > > + # reboot
> > > + u_boot_console.restart_uboot()
> > > +
> > > + with u_boot_console.log.section('Test Case 2-b, after reboot'):
> > > + # make sure that dfu_alt_info exists even persistent variables
> > > + # are not available.
> > > + output = u_boot_console.run_command_list([
> > > + 'host bind 0 %s' % disk_img,
> > > + 'fatls host 0:1 %s' % CAPSULE_INSTALL_DIR])
> > > + assert 'Test01' in ''.join(output)
> > > + assert 'Test02' in ''.join(output)
> > > +
> > > + # need to run uefi command to initiate capsule handling
> > > + output = u_boot_console.run_command(
> > > + 'efidebug capsule disk-update', wait_for_reboot = True)
> > > +
> > > + output = u_boot_console.run_command(
> > > + 'fwu_mdata_read')
> > > + assert 'active_index: 0x1' in ''.join(output)
> > > + assert 'previous_active_index: 0x0' in ''.join(output)
> > > +
> > > + output = u_boot_console.run_command_list([
> > > + 'sf probe 0:0',
> > > + 'sf read 4000000 100000 10',
> > > + 'md.b 4000000 10'])
> > > + assert 'u-boot-a:Old' in ''.join(output)
> > > +
> > > + output = u_boot_console.run_command_list([
> > > + 'sf probe 0:0',
> > > + 'sf read 4000000 120000 10',
> > > + 'md.b 4000000 10'])
> > > + assert 'u-boot-env-a:Old' in ''.join(output)
> > > +
> > > + output = u_boot_console.run_command_list([
> > > + 'sf read 4000000 140000 10',
> > > + 'md.b 4000000 10'])
> > > + assert 'u-boot-b:New' in ''.join(output)
> > > +
> > > + output = u_boot_console.run_command_list([
> > > + 'sf read 4000000 160000 10',
> > > + 'md.b 4000000 10'])
> > > + assert 'u-boot-env-b:New' in ''.join(output)
> > > +
> > > + def test_fwu_updates_fw3(
> > > + self, u_boot_config, u_boot_console, efi_capsule_data):
> > > + """
> > > + Test Case 3 - Update U-Boot and U-Boot Env Bank 0 binary on SPI Flash
> > > + 0x100000-0x110000: U-Boot binary Bank 0 (but dummy)
> > > + 0x120000-0x130000: U-Boot Env binary Bank 0 (but dummy)
> > > + 0x140000-0x150000: U-Boot binary Bank 1 (but dummy)
> > > + 0x160000-0x170000: U-Boot Env binary Bank 1 (but dummy)
> > > + """
> > > +
> > > + # other tests might have run and the
> > > + # system might not be in a clean state.
> > > + # Restart before starting the tests.
> > > + u_boot_console.restart_uboot()
> > > +
> > > + disk_img = efi_capsule_data
> > > + with u_boot_console.log.section('Test Case 3-a, before reboot'):
> > > + output = u_boot_console.run_command_list([
> > > + 'host bind 0 %s' % disk_img,
> > > + 'efidebug boot add -b 1 TEST host 0:1 /helloworld.efi -s ""',
> > > + 'efidebug boot order 1',
> > > + 'env set -e -nv -bs -rt OsIndications =0x0000000000000004',
> > > + 'env save'])
> > > +
> > > + # initialize contents
> > > + output = u_boot_console.run_command_list([
> > > + 'sf probe 0:0',
> > > + 'fatload host 0:1 4000000 %s/u-boot-a.bin.old' % CAPSULE_DATA_DIR,
> > > + 'sf write 4000000 100000 10',
> > > + 'fatload host 0:1 4000000 %s/u-boot-env-a.old' % CAPSULE_DATA_DIR,
> > > + 'sf write 4000000 120000 10',
> > > + 'fatload host 0:1 4000000 %s/u-boot-b.bin.old' % CAPSULE_DATA_DIR,
> > > + 'sf write 4000000 140000 10',
> > > + 'fatload host 0:1 4000000 %s/u-boot-env-b.old' % CAPSULE_DATA_DIR,
> > > + 'sf write 4000000 160000 10'])
> > > +
> > > + output = u_boot_console.run_command_list([
> > > + 'sf read 5000000 100000 10',
> > > + 'md.b 5000000 10'
> > > + ])
> > > + assert 'u-boot-a:Old' in ''.join(output)
> > > +
> > > + output = u_boot_console.run_command_list([
> > > + 'sf read 5000000 120000 10',
> > > + 'md.b 5000000 10'
> > > + ])
> > > + assert 'u-boot-env-a:Old' in ''.join(output)
> > > +
> > > + output = u_boot_console.run_command_list([
> > > + 'sf read 5100000 140000 10',
> > > + 'md.b 5100000 10'
> > > + ])
> > > + assert 'u-boot-b:Old' in ''.join(output)
> > > +
> > > + output = u_boot_console.run_command_list([
> > > + 'sf read 5000000 160000 10',
> > > + 'md.b 5000000 10'
> > > + ])
> > > + assert 'u-boot-env-b:Old' in ''.join(output)
> > > +
> > > + output = u_boot_console.run_command_list([
> > > + 'sf probe 0:0',
> > > + 'fatload host 0:1 4000000 %s/metadata_bank1.bin' % CAPSULE_DATA_DIR,
> > > + 'sf write 4000000 0 100',
> > > + 'sf write 4000000 10000 100'])
> > > +
> > > + output = u_boot_console.run_command(
> > > + 'fwu_mdata_read')
> > > + assert 'active_index: 0x1' in ''.join(output)
> > > + assert 'previous_active_index: 0x0' in ''.join(output)
> > > +
> > > + # place a capsule file
> > > + output = u_boot_console.run_command_list([
> > > + 'fatload host 0:1 4000000 %s/Test03' % CAPSULE_DATA_DIR,
> > > + 'fatwrite host 0:1 4000000 %s/Test03 $filesize' % CAPSULE_INSTALL_DIR,
> > > + 'fatload host 0:1 4000000 %s/Test04' % CAPSULE_DATA_DIR,
> > > + 'fatwrite host 0:1 4000000 %s/Test04 $filesize' % CAPSULE_INSTALL_DIR,
> > > + 'fatls host 0:1 %s' % CAPSULE_INSTALL_DIR])
> > > + assert 'Test03' in ''.join(output)
> > > + assert 'Test04' in ''.join(output)
> > > +
> > > + # reboot
> > > + u_boot_console.restart_uboot()
> > > +
> > > + with u_boot_console.log.section('Test Case 3-b, after reboot'):
> > > + # make sure that dfu_alt_info exists even persistent variables
> > > + # are not available.
> > > + output = u_boot_console.run_command_list([
> > > + 'host bind 0 %s' % disk_img,
> > > + 'fatls host 0:1 %s' % CAPSULE_INSTALL_DIR])
> > > + assert 'Test03' in ''.join(output)
> > > + assert 'Test04' in ''.join(output)
> > > +
> > > + # need to run uefi command to initiate capsule handling
> > > + output = u_boot_console.run_command(
> > > + 'efidebug capsule disk-update', wait_for_reboot = True)
> > > +
> > > + output = u_boot_console.run_command(
> > > + 'fwu_mdata_read')
> > > + assert 'active_index: 0x0' in ''.join(output)
> > > + assert 'previous_active_index: 0x1' in ''.join(output)
> > > +
> > > + output = u_boot_console.run_command_list([
> > > + 'sf probe 0:0',
> > > + 'sf read 4000000 100000 10',
> > > + 'md.b 4000000 10'])
> > > + assert 'u-boot-a:New' in ''.join(output)
> > > +
> > > + output = u_boot_console.run_command_list([
> > > + 'sf probe 0:0',
> > > + 'sf read 4000000 120000 10',
> > > + 'md.b 4000000 10'])
> > > + assert 'u-boot-env-a:New' in ''.join(output)
> > > +
> > > + output = u_boot_console.run_command_list([
> > > + 'sf read 4000000 140000 10',
> > > + 'md.b 4000000 10'])
> > > + assert 'u-boot-b:Old' in ''.join(output)
> > > +
> > > + output = u_boot_console.run_command_list([
> > > + 'sf read 4000000 160000 10',
> > > + 'md.b 4000000 10'])
> > > + assert 'u-boot-env-b:Old' in ''.join(output)
> > > --
> > > 2.25.1
> > >