[PATCH 00/10] efi_loader: add capsule update support

Heinrich Schuchardt xypron.glpk at gmx.de
Mon Apr 27 22:33:41 CEST 2020


On 4/27/20 11:48 AM, AKASHI Takahiro wrote:
> Summary
> =======
> 'UpdateCapsule' is one of runtime services defined in UEFI specification
> and its aim is to allow a caller (OS) to pass information to the firmware,
> i.e. U-Boot. This is mostly used to update firmware binary on devices by
> instructions from OS.
>
> While 'UpdateCapsule' is a runtime services function, it is, at least
> initially, suported only before exiting boot services alike other runtime
> functions, [Get/]SetVariable. This is because modifying storage which may
> be shared with OS must be carefully designed and there is no general
> assumption that we can do it.
>
> Therefore, we practically support only "capsule on disk"; any capsule can
> be handed over to UEFI subsystem as a file on a specific file system.
>
> In this patch series, all the related definitions and structures are given
> as UEFI specification describes, and basic framework for capsule support
> is provided. Currently supported is
>  * firmware update (Firmware Management Protocol or simply FMP)
>
> Most of functionality of firmware update is provided by FMP driver and
> it will be, by nature, system/platform-specific. So you can and should
> implement your own FMP driver(s) based on your system requirements.
> Only a simple FMP driver based on FIT image for a single region is
> provided here.  (So it is "for reference only")

Do think this FMP driver will be actually used?
Or should it be moved to lib/efi_selftest?

>                            ^^^^^^^^^^^^^^^^^^
> See more details in the commit, "efi_loader: capsule: add simple firmware
> management protocol."

In this patch series I am missing the update of the documentation in
doc/uefi/.

Best regards

Heinrich

>
> Patch structure
> ===============
> Patch#1-#2: preparatory patches
> Patch#3-#7: main part of implementation
> Patch#8-#10: utilities and tests
>
> [1] https://git.linaro.org/people/takahiro.akashi/u-boot.git efi/capsule
>
> Prerequisite patches
> ====================
> [2] part: detect EFI system partition
>     https://lists.denx.de/pipermail/u-boot/2020-March/403562.html
> [3] common: update_tftp: remove unnecessary build check
>     https://lists.denx.de/pipermail/u-boot/2020-March/401727.html
> [4] sandbox: drop CONFIG_SYS_RELOC_GD_ENV_ADDR
>     https://lists.denx.de/pipermail/u-boot/2020-April/408711.html
>
> Test
> ====
> * passed all the pytests which are included in this patch series
>   on sandbox build.
> * passed Travis CI.
>
> Please note that, while Travic CI passed, the capsule pytest
> itself won't be run in the CI because some specific configuration
> for sandbox build is required. See test_efi_capsule_firmware.py.
>
> Issues
> ======
> * Timing of executing capsules-on-disk
>   Currently, processing a capsule is triggered only as part of
>   UEFI subsystem initialization. This means that, for example,
>   firmware update, may not take place at system booting time and
>   will potentially be delayed until a first call of any UEFI functions.
>
>     => See patch#4 for my proposal
>
> TODO's
> ======
> (May not be addressed in future versions of this series.)
> * capsule authentication
> * capsule dependency (dependency expression instruction set)
> * loading drivers in a capsule
> * handling RESET flag in a capsule and QeuryCapsuleCaps
> * full semantics of ESRT (EFI System Resource Table)
> * enabling capsule API at runtime
> * json capsule
> * recovery from update failure
>
> Changes
> =======
> v1 (April 27, 2020)
> * rebased to v2020.07-rc
> * removed already-merged patches (RFC's #1 to #4)
> * dropped 'variable update' capsule support (RFC's patch#10)
> * dropped 'variable configuration table' support (RFC's patch#11)
>   (Those two should be discussed separately.)
> * add preparatory patches (patch#1/#2)
> * fix several build errors
> * rename some Kconfig options to be aligned with UEFI specification's terms
>   (patch#3,4,6,7)
> * enforce UpdateCapsule API to be disabled after ExitBootServices (patch#3)
> * use config table, runtime_services_supported, instead of variable (patch#3)
> * make EFI_CAPSULE_ON_DISK buildable even if UpdateCapsule API is disabled
>   (patch4)
> * support OsIndications, invoking capsule-on-disk only if the variable
>   indicates so (patch#4)
> * introduced EFI_CAPSULE_ON_DISK_EARLY to invoke capsule-on-disk in U-Boot
>   initialization (patch#4)
> * detect capsule files only if they are on EFI system partition (patch#4)
> * use printf, rather than EFI_PRINT, in error cases (patch#4)
> * use 'header_size' field to retrieve capsule data, adding sanity checks
>   against capsule size (patch#6)
> * call fmpt driver interfaces with EFI_CALL (patch#6)
> * remove 'variable update capsule'-related code form mkeficapsule (patch#9)
> * add a test case of OsIndications not being set properly (patch#10)
> * adjust test scenario for EFI_CAPSULE_ON_DISK_EARLY (patch#10)
> * revise pytest scripts (patch#10)
>
> Initial release as RFC (March 17, 2020)
>
> AKASHI Takahiro (10):
>   efi_loader: disk: add efi_disk_is_system_part()
>   efi_loader: add option to initialise EFI subsystem early
>   efi_loader: define UpdateCapsule api
>   efi_loader: capsule: add capsule_on_disk support
>   efi_loader: capsule: add memory range capsule definitions
>   efi_loader: capsule: support firmware update
>   efi_loader: add simple firmware management protocol for FIT image
>   cmd: add "efidebug capsule" command
>   tools: add mkeficapsule command for UEFI capsule update test
>   test/py: add a test for efi firmware update capsule
>
>  cmd/efidebug.c                                | 234 +++++
>  common/board_r.c                              |   6 +
>  common/main.c                                 |   4 +
>  include/efi_api.h                             | 156 ++++
>  include/efi_loader.h                          |  35 +
>  lib/efi_loader/Kconfig                        |  69 ++
>  lib/efi_loader/Makefile                       |   2 +
>  lib/efi_loader/efi_capsule.c                  | 802 ++++++++++++++++++
>  lib/efi_loader/efi_disk.c                     |  22 +
>  lib/efi_loader/efi_firmware.c                 | 191 +++++
>  lib/efi_loader/efi_runtime.c                  | 104 ++-
>  lib/efi_loader/efi_setup.c                    |  44 +-
>  test/py/tests/test_efi_capsule/conftest.py    |  73 ++
>  test/py/tests/test_efi_capsule/defs.py        |  24 +
>  .../test_efi_capsule/test_capsule_firmware.py | 198 +++++
>  test/py/tests/test_efi_capsule/uboot_env.its  |  25 +
>  tools/Makefile                                |   3 +
>  tools/mkeficapsule.c                          | 209 +++++
>  18 files changed, 2150 insertions(+), 51 deletions(-)
>  create mode 100644 lib/efi_loader/efi_capsule.c
>  create mode 100644 lib/efi_loader/efi_firmware.c
>  create mode 100644 test/py/tests/test_efi_capsule/conftest.py
>  create mode 100644 test/py/tests/test_efi_capsule/defs.py
>  create mode 100644 test/py/tests/test_efi_capsule/test_capsule_firmware.py
>  create mode 100644 test/py/tests/test_efi_capsule/uboot_env.its
>  create mode 100644 tools/mkeficapsule.c
>



More information about the U-Boot mailing list