Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Dasharo BenchRack ASRock TURIND8UD-2T/X550

BenchRack is 3mdeb’s modular test-bench reference design for open-source firmware development and validation.

This case study covers the Dasharo BenchRack ASRock TURIND8UD-2T/X550 configuration, in which the DUT boots with coreboot (as distributed by 3mdeb) performing silicon initialization and LinuxBoot serving as the payload, following the same LinuxBoot adoption approach described in the Ampere and Google case studies.

It contains the following sections:

Reference design and goals

BenchRack is intended as a reference design, not a one-off test rig. By standardizing how a DUT is powered, flashed, and observed, it serves several business and engineering goals:

  • Compliance optimization showcasing — demonstrating how an open firmware stack can be tuned and evidenced to meet compliance and certification requirements.
  • Firmware due diligence and patching loop — providing a repeatable environment to audit firmware, reproduce issues, and validate patches in a tight build-flash-test loop.
  • Decomposition of complex rack systems — breaking a complex rack system into individually manageable components, enabling a divide-and-conquer strategy for reasoning about and validating large systems.

Because BenchRack is defined by this control-and-validation harness rather than by a specific board, future BenchRack configurations may host entirely different motherboards. This case study documents the ASRock TURIND8UD-2T/X550 configuration.

Platform overview

The device under test (DUT) in this configuration is the ASRock Rack TURIND8UD-2T/X550, a single-socket AMD EPYC server board:

  • CPU: single socket SP5 (LGA 6096), supporting AMD EPYC 9005 series processors.
  • Memory: 8 DDR5 RDIMM slots (1 DIMM per channel).
  • Expansion: 4 PCIe 5.0 slots and 2 M.2 (PCIe 5.0 NVMe) slots.
  • Networking: onboard 10 GbE.

The DUT is mounted in a BenchRack, which supplies remote power control, firmware flashing, and serial capture so the board can be validated automatically. Both silicon initialization (coreboot) and the payload (LinuxBoot) are open source, though — as on most modern x86 platforms — a few binary blobs are still required for silicon initialization (for example AMD PSP firmware and microcode). This places the platform at the most advanced practical stage of the LinuxBoot adoption model described in the Ampere case study.

Firmware architecture

The boot firmware for the DUT is largely open source, with a few binary blobs required for silicon initialization:

  • coreboot: performs early hardware and silicon initialization. Source is available at Dasharo/coreboot.
  • LinuxBoot: built as the coreboot payload (u-root initramfs + flashkernel), responsible for boot device selection and kexec into the target OS.

Build process

The firmware image is a single coreboot.rom containing coreboot plus the LinuxBoot payload.

Prerequisites

The recommended, reproducible build path uses the Dasharo/coreboot SDK container, which pins the toolchain and build dependencies.

git clone https://github.com/Dasharo/coreboot.git
cd coreboot
git checkout asrock_turind8ud_linuxboot_v0.9.0
git submodule update --init --checkout

You must also obtain and extract blobs necessary for memory and silicon initialization. Please familiarize yourself with the Dasharo terms of service, then download and extract them:

wget https://dl.3mdeb.com/open-source-firmware/Dasharo/gigabyte_mz33_ar1/uefi/v0.9.0/Turin.zip
unzip Turin.zip -d 3rdparty/blobs/soc/amd/

Enter the Dasharo SDK container:

# Enter the pinned Dasharo SDK container
docker run --rm -it \
  -v "$PWD:/home/coreboot/coreboot" \
  -w /home/coreboot/coreboot \
  ghcr.io/dasharo/dasharo-sdk:v1.9.2 \
  /bin/bash

Build the firmware image

From inside the SDK container:

# Select the BenchRack DUT board target and the LinuxBoot payload
./build.sh asrock_turind8ud_linuxboot

The resulting flashable image is at asrock_turind8ud_linuxboot_<version>.rom.

Flashing and operation

BenchRack provides remote flashing, power control, and serial capture for each DUT, enabling automated (CI) firmware deployment and testing. These are driven by benchctl, a single command-line tool that controls the bench from a workstation or from the bench itself. For BenchRack it operates the Remote Test Environment (RTE), driving the GPIO lines, the SPI mux, and host power through the RTE REST API and running flashrom over SSH — so the low-level SPI sequencing no longer has to be performed by hand.

Select the BenchRack platform and DUT through flags (or the matching BENCHCTL_* environment variables). The benchrack platform defaults to the asrock-turin board profile, so --board can be omitted for this DUT. When run from a workstation, --host points at the RTE by IP or hostname; run directly on the RTE, the host is implied and the flag is dropped.

To flash the host boot flash with the image built above:

# From a workstation, targeting the RTE:
benchctl --host <RTE-IP> \
  flash host ./asrock_turind8ud_linuxboot_<version>.rom

benchctl checks the firmware size, copies it to the RTE with scp, takes control of the SPI bus, runs the blocking flash, confirms it succeeded, and cleans up the temporary file. Power and serial console are managed through the same tool:

benchctl --host <RTE-IP> power reset   # power-cycle the DUT
benchctl --host <RTE-IP> console       # attach to serial

Booting with LinuxBoot

On power-on, the DUT runs coreboot, hands off to the LinuxBoot payload, boots into u-root, and kexecs into the target OS.

Welcome to LinuxBoot's Menu

Enter a number to boot a kernel:

01. Ubuntu

02. Ubuntu, with Linux 7.0.0-27-generic

03. Ubuntu, with Linux 7.0.0-27-generic (recovery mode)

04. Ubuntu, with Linux 7.0.0-22-generic

05. Ubuntu, with Linux 7.0.0-22-generic (recovery mode)

06. Memory test (mt86+x64)

07. Memory test (mt86+x64)

08. Memory test (mt86+x64, serial console)

09. Memory test (mt86+x64, serial console)

10. Memory test (mt86+ia32)

11. Memory test (mt86+ia32)

12. Memory test (mt86+ia32, serial console)

13. Memory test (mt86+ia32, serial console)

14. Reboot

15. Enter a LinuxBoot shell


Enter an option ('01' is the default, 'e' to edit kernel cmdline):
 >

Attempting to boot LinuxImage(
  Name: Ubuntu
  Kernel: file:///tmp/u-root-mounts1460215710/nvme0n1p2/boot/vmlinuz-7.0.0-27-generic
  Initrd: file:///tmp/u-root-mounts1460215710/nvme0n1p2/boot/initrd.img-7.0.0-27-generic
  Cmdline: root=UUID=d6f381c6-1549-4560-87e9-f26d9e317ab1 ro quiet splash crashkernel=2G-4G:320M,4G-32G:512M,32G-64G:1024M,64G-128G:2048M,128G-:4096M console=ttyS0,115200
  DTB: <nil>
)

Benchmarks

Boot Time

coreboot timestamps may be obtained using cbmem -t:

ubuntu@3mdeb:~$ sudo cbmem -t
36 entries total:

   0:1st timestamp                                     29,106,318 (0)
  11:start of bootblock                                29,106,553 (235)
  12:end of bootblock                                  29,109,232 (2,678)
  13:starting to load romstage                         29,109,232 (0)
  17:starting LZ4 decompress (ignore for x86)          29,174,661 (65,428)
  18:finished LZ4 decompress (ignore for x86)          29,174,726 (65)
  14:finished loading romstage                         29,174,730 (3)
   1:start of romstage                                 29,174,734 (3)
   4:end of romstage                                   29,174,885 (151)
   8:starting to load ramstage                         29,174,885 (0)
  15:starting LZMA decompress (ignore for x86)         29,536,943 (362,058)
  16:finished LZMA decompress (ignore for x86)         29,583,677 (46,733)
   9:finished loading ramstage                         29,586,162 (2,485)
  10:start of ramstage                                 29,587,320 (1,158)
  30:device enumeration                                29,587,383 (62)
 112:started reading uCode                             29,587,766 (383)
 113:finished reading uCode                            29,617,222 (29,455)
  31:<unknown>                                         31,365,077 (1,747,855)
  40:device configuration                              31,371,820 (6,742)
  50:device enable                                     31,379,595 (7,775)
  60:device initialization                             31,381,611 (2,015)
  70:device setup done                                 31,884,811 (503,199)
 920:starting APOB read                                31,884,813 (2)
 921:starting APOB erase                               31,954,244 (69,431)
 922:starting APOB write                               39,357,767 (7,403,523)
 923:finished APOB                                     40,321,934 (964,166)
  75:cbmem post                                        40,343,709 (21,775)
  80:write tables                                      40,343,713 (3)
  85:finalize chips                                    40,352,487 (8,774)
  90:starting to load payload                          40,352,494 (6)
  15:starting LZMA decompress (ignore for x86)         54,335,177 (13,982,683)
  16:finished LZMA decompress (ignore for x86)         54,335,213 (35)
  15:starting LZMA decompress (ignore for x86)         56,242,188 (1,906,975)
  16:finished LZMA decompress (ignore for x86)         56,242,324 (136)
  15:starting LZMA decompress (ignore for x86)         56,242,327 (2)
  16:finished LZMA decompress (ignore for x86)         56,242,350 (23)
  99:selfboot jump                                     57,809,271 (1,566,921)

Stock ASRock UEFI can be easily measured with systemd-analyze, though that’s excluding PSP time, which should be the same as in coreboot:

ubuntu@3mdeb:~$ sudo systemd-analyze
[sudo] password for ubuntu:
Startup finished in 2min 58.748s (firmware) + 1.126s (loader) + 539ms (kernel) + 10.353s (initrd) + 10.407s (userspace) = 3min 21.174s
graphical.target reached after 10.402s in userspace.

Including time spent in PSP firmware, coreboot + LinuxBoot reduces the boot time from 3:27 to 57 seconds.

Support

Hardware support

Hardware support is provided by 3mdeb, and BenchRack units are available from the 3mdeb shop.

Community support

Professional support

Professional support services are provided by 3mdeb.

See also