Skip to content

Required EFI protocols

Grant Likely edited this page Jan 18, 2021 · 23 revisions

Currently EBBR indicates the mandatory EFI protocols primarily by citing from the UEFI specification (section 2.6 Requirements). This brings in a lot of conditional platform specific requirements that are not approprate for embedded systems (see #60).

What is implemented (today) in u-boot?

Protocol Comment
EFI_DEVICE_PATH_PROTOCOL available
EFI_DEVICE_PATH_TO_TEXT_PROTOCOL Only nodes used in U-Boot supported
EFI_DEVICE_PATH_UTILITIES_PROTOCOL available
EFI_UNICODE_COLLATION_PROTOCOL2 available
EFI_DRIVER_BINDING_PROTOCOL can be consumed by ConnectController()
EFI_SIMPLE_TEXT_INPUT_PROTOCOL available
EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL available, toggle key cannot be set
EFI_SIMPLE_TEXT_OUTPUT available
EFI_BLOCK_IO_PROTOCOL available
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL available, FAT bugs to be resolved, _EX functions not implemented
EFI_LOADED_IMAGE_PROTOCOL available
EFI_GRAPHICS_OUTPUT_PROTOCOL available
EFI_HII_STRING_PROTOCOL stub for SCT -- needs to be rewritten. Used by Shell/SCT
EFI_HII_DATABASE_PROTOCOL available, only needed for shell (and hence needed by SCT)
EFI_HII_CONFIG_ROUTING_PROTOCOL removed as was only stub. Not needed for shell
EFI_LOAD_FILE2_PROTOCOL experimental support to provide initrd to Linux
EFI_RNG_PROTOCOL available if DM_RNG driver available
EFI_SIMPLE_NETWORK_PROTOCOL available, only required services
EFI_PXE_BASE_CODE_PROTOCOL stub for old versions of GRUB

Cf. https://github.com/U-Boot-EFI/u-boot-sct-results/blob/master/PlatformConfig.ini

Variables

The following variables are set by U-Boot:

  • BootCurrent
  • BootNext (deleted by U-Boot)
  • PlatformLangCodes
  • PlatformLang (if initial)
  • SignatureSupport
  • OsIndicationsSupported
  • SecureBoot
  • SetupMode
  • AuditMode
  • DeployedMode
  • PK (attributes changed)
  • VendorKeys
  • Capsule####
  • CapsuleLast
  • CapsuleMax

The following variables are read by U-Boot:

  • Boot####
  • BootNext
  • BootOrder
  • CapsuleLast
  • CapsuleMax
  • OsIndications
  • PlatformLang (only to avoid overwriting, ignored otherwise)
  • PK
  • KEK
  • dbx
  • db

What is currently implicitly included via section 2.6?

  • LoadImage() should support EFI_LOAD_FILE2_PROTOCOL and EFI_LOAD_FILE_PROTOCOL
  • ConnectController() should support EFI_DRIVER_FAMILY_OVERRIDE_PROTOCOL, EFI_PLATFORM_DRIVER_OVERRIDE_PROTOCOL, EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL

Draft Text for Requirements List

EBBR compliant platform shall conform to a subset of the [UEFI]_ spec as listed in this section. Normally, UEFI compliance would require full compliance with all items listed in section 2.6 of the UEFI spec. However, the EBBR target market has a reduced set of requirements, and so some UEFI features are omitted as unnecessary.

This section overrides the requirements of [UEFI]_ § 2.6 for EBBR compliance.

Required Elements

EFI_SYSTEM_TABLE

Implement full access to UEFI Boot services, UEFI Runtime Services, consoles, and the system configuration tables.

EFI_BOOT_SERVICES

All methods for boot services must be exist, even for behaviour that is not implemented. Methods shall return the appropriate error code for any unimplemented behaviour.

Method Specific Notes

Method Note
ConnectController The ConnectController() method is not required to implement support for EFI_PLATFORM_DRIVER_OVERRIDE_PROTOCOL, EFI_DRIVER_FAMILY_OVERRIDE_PROTOCOL, or EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL.
LoadImage LoadImage is only required to implement support for EFI_SIMPLE_FILE_SYSTEM_PROTOCOL, and does not need to implement EFI_LOAD_FILE_PROTOCOL or EFI_LOAD_FILE2_PROTOCOL support.

** ACTION from 23/11/2020: Determine if U-Boot should just go ahead and implement full LoadImage support for the above.

EFI_RUNTIME_SERVICES

All methods for runtime services must be implemented, even for behaviour that is not implemented. Methods shall return the appropriate error code for any unimplemented behaviour.

**Action: Deal with EFI_RUNTIME_SERVICES requirements table to be clearer ** Put table in this location

Required Protocols

Heinrich: We should separate 2.6.1, 2.6.2, and 2.6.3 requirements

The following protocols must be implemented as described below

Protocol Notes
EFI_LOADED_IMAGE_PROTOCOL must be installed for each loaded image
EFI_LOADED_IMAGE_DEVICE_PATH_PROTOCOL must be installed for each loaded image
EFI_DEVICE_PATH_PROTOCOL
EFI_DEVICE_PATH_UTILITIES_PROTOCOL
EFI_DEVICE_PATH_TO_TEXT_PROTOCOL U-Boot does not support all node types
EFI_SIMPLE_TEXT_INPUT_PROTOCOL
EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL
EFI_BLOCK_IO_PROTOCOL if platform has block device
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL if platform supports booting from block device
EFI_SIMPLE_NETWORK_PROTOCOL if platform supports booting from network
EFI_RNG_PROTOCOL Required if platform has a suitable hardware entropy source
EFI_HII_STRING_PROTOCOL required for EFI shell
EFI_HII_DATABASE_PROTOCOL required for EFI shell
EFI_UNICODE_COLLATION2_PROTOCOL required for EFI Shell

Optional Protocols

Heinrich: We should separate 2.6.1, 2.6.2, and 2.6.3 requirements

The following protocols are required by UEFI section 2.6, but are optional for EBBR compliance. Reasoning for protocols being optional is given below

Protocol Reason for being optional
EFI_DECOMPRESS_PROTOCOL Seldom used interface, deemed unnecessary for primary use cases. Biggest benefit would be for drivers delivered by PCI card EPROMS like on graphics cards. But as these typically are x86 we would not be able run them without emulation on other architectures.
EFI_DISK_IO_PROTOCOL Deemed unnecessary as primary use cases use either the SIMPLE_FILE_SYSTEM_PROTOCOL, or the BLOCK_IO_PROTOCOL directly. The benefit of the EFI_DISK_IO_PROTOCOL over the EFI_BLOCK_IO_PROTOCOL is that it does not require alignment of buffers.
EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL
EFI_EDID_* Deemed unnecessary for primary use cases
EFI_GRAPHICS_OUTPUT_PROTOCOL text output should be good enough for most use cases
EFI_PXE_BASE_CODE_PROTOCOL TFTP is really insecure.
EFI_HII_CONFIG_ACCESS_PROTOCOL neither needed for EFI shell nor for SCT
EFI_HII_CONFIG_ROUTING_PROTOCOL neither needed for EFI shell nor for SCT

Required Global Variables

EBBR compliant platforms are required to implement the following Global Variables as found in [UEFI]_ § 3.3. All other Global Variables are optional.

Variable Name Description
Boot#### A boot load option. #### is a numerical hex value
BootCurrent The boot option that was selected for the current boot
BootNext The boot option that will be used for the next boot only
BootOrder An ordered list of boot options. Firmware will attempt each Boot#### entry in this order
OsIndications
Clone this wiki locally