Rational
Given LEG members interest in UEFI, a significant effort is needed to add core functionality to UEFI to be a commercially viable bootloader for servers on ARM. This epic is meant to capture the basic effort needed. Productization will require additional work.
The use cases capture here are the scenarios expected to be important for ARM servers. The use cases are further broken down into derived requirements which are the individual features that need to be working in UEFI for the use case to be supported. Ideally all of the derived requirements describe functionality which already exists. Wherever possible Linaro will adopt existing work to satisfy the derived requirements, and particularly the engineering work provided by ARM.
Background
Leveraging on the Tianocore port maintained by ARM and the corresponding Self Certification Test kit, the Linaro Enterprise Group (LEG) focuses its efforts in making sure the Enterprise market requirements and use cases are fulfilled. If any gap is identified, LEG and ARM engineers work together in defining the right solution.
LEG engineers work on LEG members HW platforms. So far these are the Samsung Arndale board and the ARM v7 Fast model for the 32-bit platforms and the ARM Foundation model for the v8 architecture. Basic enbalement may take place for validation and testing purposes. However, complete enablement and productization are done by the member's internal teams or BIOS vendors serving the ecosystem.
Use Cases
For all of the use cases, the following assumptions are made:
- No custom binaries are required for the bootloader, kernel or root filesystem. Distribution provided binaries are sufficient to boot system into a usable state
- Within the scope of the use-case, firmware behaviour is consistent between systems provided by different vendors
- UEFI firmware ABIs conform to the published UEFI specifications
The following use cases drive the requirements for UEFI on ARM:
- UC1: Unattended boot from network server (DHCP/TFTP) of system image
- UC2: Unattended boot from network server (DHCP/TFTP) for install to local storage
- UC3: Unattended boot from local storage (SATA/USB/eMMC)
- UC4: Attended boot from local storage (SATA/USB/eMMC/Console)
- UC5: Attended boot from network (DHCP/TFTP/Console)
- UC6: Remote control of boot sequence
- UC7: Install to local storage from within Linux
- UC8: Support KVM virtual machines - System left in state that KVM will work
- UC9: Debug UEFI core & executables via external debugger (GDB?)
- UC10: Update UEFI firmware safely and securely
- UC11: UEFI running inside a EL1/Supervisor mode virtual machine
Additional use cases will be added as required.
Member Requirements
- MR1: Support using Cobbler and MAAS to manage network boot server. Involvement of Red Hat and Canonical will be required to further define this requirement. However at this time (2013.03) it is premature.
Derived Deliverables
Boot from Network
| ID |
Relevant UC |
Description |
Comments |
| DR1.1 |
[UC1,UC2,UC5] |
Obtain IP configuration, boot binary, and boot configuration via DHCP (use PXE extensions to TFTP) |
|
| DR1.2 |
[UC1,UC2,UC5] |
Fetch uefi executable boot loader binary from TFTP server |
|
| DR1.3 |
[UC1,UC2,UC5] |
(uefi-abi) read DHCP obtained boot configuration data |
|
| DR1.4 |
[UC1,UC2,UC5] |
(uefi-abi) Use networking ABI to retrieve additional files for booting (kernel, initramfs, config file) |
|
| DR1.5 |
[DR1.1,DR1.2,DR1.3,DR1.4] |
IP stack, DHCP and TFTP modules (stack should exist, drivers needed) |
|
| DR1.6 |
[UC1,UC2,UC5] |
Boot loader suitable for network booting (ie. GRUB2, syslinux or efilinux) |
|
| DR1.7 |
[UC1,UC2,DR1.6] |
Method for boot server to identify machine and provide boot configuration |
|
Boot from Local Storage
| ID |
Relevant UC |
Description |
Comments |
| DR2.1 |
[UC3] |
Load and execute UEFI binary from local storage |
|
| DR2.2 |
[DR2.1] |
SATA disk support (stack should exist, drivers needed) |
|
| DR2.3 |
[DR2.1] |
USB stack and USB storage modules (stack should exist, host controller drivers needed) |
|
| DR2.4 |
[DR2.1] |
eMMC storage support |
|
| DR2.5 |
[UC3,UC4] |
Boot loader suitable for booting from local storage (ie. GRUB2) |
|
| DR2.6 |
[UC3,UC4] |
GUID Partition Table (GPT) support (should exist) |
|
| DR2.7 |
[UC3,UC4] |
ext2 filesystem support in UEFI (not required, but useful) |
|
Booting the Kernel
| ID |
Relevant UC |
Description |
Comment |
| DR3.1 |
[UC1,UC2,UC3,UC4,UC5] |
(uefi-abi) Execute kernel binary from UEFI with optional extra binary images (initramfs, devicetree, etc) |
|
| DR3.2 |
[UC1,UC2,UC3] |
Sane defaults on selecting and ordering boot devices |
|
| DR3.3 |
[UC4,UC5] |
Console commands to initiate network and local booting (should exist) |
|
| DR3.4 |
[UC7] |
Modify UEFI variables to set default boot device |
|
| DR3.5 |
[DR3.4] |
UEFI Runtime service for writing firmware variables |
|
| DR3.6 |
[DR3.4] |
Persistent storage for UEFI variables |
|
| DR3.7 |
[DR3.1] |
Retrieve UEFI boot configuration from within Linux (uefi boot services & uefi runtime services) |
|
Virtualization Support
| ID |
Relevant UC |
Description |
Comments |
| DR4.1 |
[UC8] |
Mechanism for kernel to obtain control over hypervisor mode (via a hypervisor call; UEFI passes control to the kernel in supervisor mode. Hypervisor mode must be ‘parked’ in a safe state before booting OS) |
|
| DR4.2 |
[UC11] |
UEFI running as KVM guest |
|
| DR4.3 |
[DR4.2] |
Add virtio console device driver to UEFI |
|
| DR4.4 |
[DR4.2] |
Add virtio uart device driver to UEFI |
|
| DR4.5 |
[DR4.2] |
Add virtio Ethernet device driver to UEFI |
|
| DR4.6 |
[DR4.2] |
Add virtio block/disk device driver to UEFI |
|
Working Firmware
| ID |
Relevant UC |
Description |
Comments |
| DR5.1 |
[UC10] |
Develop tool for performing safe firmware updates |
Not sure how board specific this will be yet. |
| DR5.2 |
[UC9] |
GDBstub for UEFI |
|
Additional Requirements
| Integrate LEG members test suites into LAVA to address deeper testing |
|
| Add different models and hardware to validate Linaro Tianocore work on multiple platforms |
|
| LAVA boot loader testing infrastructure |
Work in progress |
| Support using Cobbler to manage network boot server |
|
| Support using MAAS to manage network boot server |
|
Misc work items that need to be completed
| Work Item |
Details |
Status |
| Maintainership model |
Identify a long term Linaro UEFI maintainer and co-maintainers |
Making good progress |
| Resolve TC2 dropping characters on serial port |
affects LAVA automated testing) (bug) |
|
| Identify the release cycle, and cadence |
|
|
| Port SCT |
Port UEFI Self Certification Tests (SCT) to EDK2 and integrate the suite into LAVA |
|
| Refactoring code structure |
|
|
All work will be targeted for upstream. However, it is important to note that board support will continue to live in Linaro Tianocore. Linaro will maintain Linaro UEFI trees and will properly validate, document, and regularly release it.
Acceptance Criteria
| Criteria |
Status |
| Boot system image from network server (DHCP/TFTP) unattended |
|
| Boot from network (DHCP/TFTP/Console) attended |
DHCP/TFTP: Console: |
| Boot to install to local storage from network server (DHCP/TFTP) |
|
| Boot from local storage (SATA/USB/eMMC) unattended |
eMMC: SATA: USB: |
| Boot from local storage (SATA/USB/eMMC/Console) attended |
eMMC: SATA: USB: Console: |
| Remote control of boot sequence |
|
| Install to local storage from within Linux |
|
| Support KVM virtual machines on the host |
|
| Support KVM virtual machine on the guest OS |
|
| Debug UEFI core & executables via external debugger (GDB?) |
|
| Update UEFI firmware safely and securely |
|
| UEFI running inside a EL1/Supervisor mode virtual machine |
|
| UEFI maintainership and source code hosting is followed and documented |
In Progress |
| CI Loops for Linaro Tianocore are in place and active |
|
| Linaro Tianocore tree is tested using LAVA infrastructure on V7 and V8 models, Versatile Express and Arndale boards |
|
| Linaro engineering adopt UEFI for supported boards/models |
|
| Publicly document the presence, progress and output of LEG UEFI work on www.linaro.org |
|
| Upstream all relevant Tiancore work |
|
| MAAS and Cobbler are able to use Linaro Tianocore on a LEG supported board |
|
Future Work
Features that require further discussion
| Feature |
Next Step |
| Support PCIe / Option ROM |
Consult with interested members to further define the target use cases and requirements |
| Support for IPMI |
Further input from the LEG-SC is required to further define the use cases |
| Runtime services |
Currently, only one defined runtime service requirement [DR3.5] it outlined. Further requirements need to be investigated |
| QEMU upgrades to run unchanged UEFI binary |
Expect work to be defined and executed by the virtualization/toolchain teams |
Part of the challenge is finding/defining a good development model for Tianocore: how will support for various boards be maintained? Obviously Linaro will maintain support for all the boards it cares for in a common tree, but it's less clear how this will play with upstream's development model.