| # SPDX-License-Identifier: GPL-2.0+ | |
| # Copyright (c) 2023, Linaro Limited | |
| """Common function for UEFI capsule test.""" | |
| from capsule_defs import CAPSULE_DATA_DIR, CAPSULE_INSTALL_DIR | |
| def capsule_setup(u_boot_console, disk_img, osindications): | |
| """setup the test | |
| Args: | |
| u_boot_console -- A console connection to U-Boot. | |
| disk_img -- A path to disk image to be used for testing. | |
| osindications -- String of osindications value. | |
| """ | |
| u_boot_console.run_command_list([ | |
| f'host bind 0 {disk_img}', | |
| 'printenv -e PlatformLangCodes', # workaround for terminal size determination | |
| 'efidebug boot add -b 1 TEST host 0:1 /helloworld.efi', | |
| 'efidebug boot order 1', | |
| 'env set dfu_alt_info "sf 0:0=u-boot-bin raw 0x100000 0x50000;' | |
| 'u-boot-env raw 0x150000 0x200000"']) | |
| if osindications is None: | |
| u_boot_console.run_command('env set -e OsIndications') | |
| else: | |
| u_boot_console.run_command(f'env set -e -nv -bs -rt OsIndications ={osindications}') | |
| u_boot_console.run_command('env save') | |
| def init_content(u_boot_console, target, filename, expected): | |
| """initialize test content | |
| Args: | |
| u_boot_console -- A console connection to U-Boot. | |
| target -- Target address to place the content. | |
| filename -- File name of the content. | |
| expected -- Expected string of the content. | |
| """ | |
| output = u_boot_console.run_command_list([ | |
| 'sf probe 0:0', | |
| f'fatload host 0:1 4000000 {CAPSULE_DATA_DIR}/{filename}', | |
| f'sf write 4000000 {target} 10', | |
| 'sf read 5000000 100000 10', | |
| 'md.b 5000000 10']) | |
| assert expected in ''.join(output) | |
| def place_capsule_file(u_boot_console, filenames): | |
| """place the capsule file | |
| Args: | |
| u_boot_console -- A console connection to U-Boot. | |
| filenames -- File name array of the target capsule files. | |
| """ | |
| for name in filenames: | |
| u_boot_console.run_command_list([ | |
| f'fatload host 0:1 4000000 {CAPSULE_DATA_DIR}/{name}', | |
| f'fatwrite host 0:1 4000000 {CAPSULE_INSTALL_DIR}/{name} $filesize']) | |
| output = u_boot_console.run_command(f'fatls host 0:1 {CAPSULE_INSTALL_DIR}') | |
| for name in filenames: | |
| assert name in ''.join(output) | |
| def exec_manual_update(u_boot_console, disk_img, filenames, need_reboot = True): | |
| """execute capsule update manually | |
| Args: | |
| u_boot_console -- A console connection to U-Boot. | |
| disk_img -- A path to disk image to be used for testing. | |
| filenames -- File name array of the target capsule files. | |
| need_reboot -- Flag indicates whether system reboot is required. | |
| """ | |
| # make sure that dfu_alt_info exists even persistent variables | |
| # are not available. | |
| output = u_boot_console.run_command_list([ | |
| 'env set dfu_alt_info ' | |
| '"sf 0:0=u-boot-bin raw 0x100000 0x50000;' | |
| 'u-boot-env raw 0x150000 0x200000"', | |
| f'host bind 0 {disk_img}', | |
| f'fatls host 0:1 {CAPSULE_INSTALL_DIR}']) | |
| for name in filenames: | |
| assert name in ''.join(output) | |
| # need to run uefi command to initiate capsule handling | |
| u_boot_console.run_command( | |
| 'env print -e Capsule0000', wait_for_reboot = need_reboot) | |
| def check_file_removed(u_boot_console, disk_img, filenames): | |
| """check files are removed | |
| Args: | |
| u_boot_console -- A console connection to U-Boot. | |
| disk_img -- A path to disk image to be used for testing. | |
| filenames -- File name array of the target capsule files. | |
| """ | |
| output = u_boot_console.run_command_list([ | |
| f'host bind 0 {disk_img}', | |
| f'fatls host 0:1 {CAPSULE_INSTALL_DIR}']) | |
| for name in filenames: | |
| assert name not in ''.join(output) | |
| def check_file_exist(u_boot_console, disk_img, filenames): | |
| """check files exist | |
| Args: | |
| u_boot_console -- A console connection to U-Boot. | |
| disk_img -- A path to disk image to be used for testing. | |
| filenames -- File name array of the target capsule files. | |
| """ | |
| output = u_boot_console.run_command_list([ | |
| f'host bind 0 {disk_img}', | |
| f'fatls host 0:1 {CAPSULE_INSTALL_DIR}']) | |
| for name in filenames: | |
| assert name in ''.join(output) | |
| def verify_content(u_boot_console, target, expected): | |
| """verify the content | |
| Args: | |
| u_boot_console -- A console connection to U-Boot. | |
| target -- Target address to verify. | |
| expected -- Expected string of the content. | |
| """ | |
| output = u_boot_console.run_command_list([ | |
| 'sf probe 0:0', | |
| f'sf read 4000000 {target} 10', | |
| 'md.b 4000000 10']) | |
| assert expected in ''.join(output) | |
| def do_reboot_dtb_specified(u_boot_config, u_boot_console, dtb_filename): | |
| """do reboot with specified DTB | |
| Args: | |
| u_boot_config -- U-boot configuration. | |
| u_boot_console -- A console connection to U-Boot. | |
| dtb_filename -- DTB file name. | |
| """ | |
| mnt_point = u_boot_config.persistent_data_dir + '/test_efi_capsule' | |
| u_boot_console.config.dtb = mnt_point + CAPSULE_DATA_DIR \ | |
| + f'/{dtb_filename}' | |
| u_boot_console.restart_uboot() |