Firmware requirements

UEFI support

Ubuntu boots via UEFI. The requirements specified in the Embedded Base Boot Requirements (EBBR) specification must be fulfilled.

Either a device-tree or ACPI tables must be provided.

U-Boot

In U-Boot the following configuration settings are needed:

  • CONFIG_EFI_LOADER=y

  • CONFIG_CMD_EFICONFIG=y

  • CONFIG_CMD_BOOTEFI_BOOTMGR=y

  • CONFIG_BOOTMETH_EFI_BOOTMGR=y (or deprecated CONFIG_DISTRO_DEFAULTS=y)

  • CONFIG_CMD_NVEDIT_EFI=y

  • CONFIG_EFI_CMD_EFIDEBUG=y

  • CONFIG_HEXDUMP=y

Device-tree

Ideally the device-tree provided by the firmware is a full description of the device and can directly be used to boot the Linux kernel. As device-trees in Linux change of the years, differences between the firmware device-tree and the Linux device-tree arise.

To provide full device functionality, Ubuntu tries to load a kernel device-tree matching both the device and the kernel version. This requires that the following properties provided in the device’s device-tree exactly match the corresponding kernel definitions:

  • /compatible - This property is used by systemd-boot or stubble for matching.

  • /model
    • This property is used by flash-kernel for matching.

Kernel device-trees often lack memory reservations (e.g. for OpenSBI) and other required information, like MAC addresses of network interfaces. Therefore, a firmware using device-trees should implement the EFI_DT_FIXUP_PROTOCOL. As of 26.04, Ubuntu is still using version v0.05 of the protocol with GUID e617d64c-fe08-46da-f4dc-bbd5870c7300. It is advisable to also implement the newer version with GUID 60ed6ba9-dfef-4799-ac7b-75e0f833456c.

SMBIOS

An SMBIOS table should be present. It needs to provide accurate data to manage the infrastructure. This includes:

  • Platform Firmware Information (Type 0)

    • Vendor

    • Firmware version

    • Firmware release date

  • System Information (Type 1)

    • Manufacturer

    • Product name

    • Version

    • Serial number

  • Processor Information (Type 4)

    • Processor version

EDK II

In EDK II the following driver is needed:

  • MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf

U-Boot

The following configuration setting is needed:

  • CONFIG_GENERATE_SMBIOS_TABLE=y

Network booting

During network booting the GRUB binary is discovered via PXE booting. The GRUB configuration file (grub.cfg) will contain HTTP(s) URLs for the Linux kernel and the initial RAM disk.

The following UEFI protocol need to be enabled:

  • HTTP Protocol

  • HTTP Utilities Protocol

  • IPv4 Configuration II Protocol

  • Simple Network Protocol

EDK II

In EDK II the following drivers should be enabled:

Configuration Flag

Driver

NETWORK_HTTP_BOOT_ENABLE

NetworkPkg/DnsDxe/DnsDxe.inf NetworkPkg/HttpDxe/HttpDxe.inf NetworkPkg/HttpUtilitiesDxe/HttpUtilitiesDxe.inf

NETWORK_IP4_ENABLE

NetworkPkg/ArpDxe/ArpDxe.inf NetworkPkg/Dhcp4Dxe/Dhcp4Dxe.inf NetworkPkg/Ip4Dxe/Ip4Dxe.inf NetworkPkg/Udp4Dxe/Udp4Dxe.inf NetworkPkg/Mtftp4Dxe/Mtftp4Dxe.inf

NETWORK_IP6_ENABLE

NetworkPkg/Dhcp6Dxe/Dhcp6Dxe.inf NetworkPkg/Ip6Dxe/Ip6Dxe.inf NetworkPkg/Udp6Dxe/Udp6Dxe.inf NetworkPkg/Mtftp6Dxe/Mtftp6Dxe.inf

NETWORK_TLS_ENABLE

CryptoPkg/Library/OpensslLib/OpensslLib.inf NetworkPkg/TlsDxe/TlsDxe.inf NetworkPkg/TlsAuthConfigDxe/TlsAuthConfigDxe.inf

NETWORK_PXE_BOOT_ENABLE

NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf

NETWORK_SNP_ENABLE

NetworkPkg/SnpDxe/SnpDxe.inf

U-Boot

In U-Boot the following configuration settings are needed:

  • CONFIG_NET_LWIP=y

  • CONFIG_DNS=y

  • CONFIG_WGET=y

  • CONFIG_EFI_IP4_CONFIG2_PROTOCOL=y

  • CONFIG_EFI_HTTP_PROTOCOL=y

For testing these additional settings are recommended:

  • CONFIG_CMD_DNS

  • CONFIG_CMD_WGET