Skip to content

Commit eec8372

Browse files
committed
OpenBMC simulate with Neoverse V3 Reference Design
1 parent 3b55beb commit eec8372

File tree

15 files changed

+759
-2
lines changed

15 files changed

+759
-2
lines changed

assets/contributors.csv

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,6 @@ Chenying Kuo,Adlink,evshary,evshary,,
9595
William Liang,,,wyliang,,
9696
Waheed Brown,Arm,https://github.com/armwaheed,https://www.linkedin.com/in/waheedbrown/,,
9797
Aryan Bhusari,Arm,,https://www.linkedin.com/in/aryanbhusari,,
98-
Ken Zhang,Insyde,,,,
98+
Ken Zhang,Insyde,,kai-di-zhang-b1642a266,,
9999
Ann Cheng,Arm,anncheng-arm,hello-ann,,
100100
Fidel Makatia Omusilibwa,,,,,

content/learning-paths/cross-platform/zenoh-multinode-ros2/_index.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ further_reading:
5151
type: documentation
5252
- resource:
5353
title: Zenoh and ROS 2 Integration Guide
54-
link: https://github.com/eclipse-zenoh/zenoh-plugin-ros2
54+
link: https://github.com/eclipse-zenoh/zenoh-plugin-ros2dds
5555
type: documentation
5656

5757

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
---
2+
title: Introduction to OpenBMC and UEFI
3+
weight: 2
4+
5+
### FIXED, DO NOT MODIFY
6+
layout: learningpathall
7+
---
8+
9+
OpenBMC and UEFI are foundational components in Arm-based server platforms. In this module, you’ll learn what they are, how they interact, and why simulating their integration on a pre-silicon reference design like RD-V3 is valuable for early-stage development and testing.
10+
11+
## Introduction to OpenBMC
12+
13+
[OpenBMC](https://www.openbmc.org/) is a collaborative open-source firmware stack for Baseboard Management Controllers (BMC), hosted by the Linux Foundation.
14+
BMCs are embedded microcontrollers on server motherboards that enable both in-band and out-of-band system management.
15+
Out-of-band access allows remote management even when the host system is powered off or unresponsive, while in-band interfaces support communication with the host operating system during normal operation.
16+
17+
The OpenBMC stack is built using the Yocto Project and includes a Linux kernel, system services, D-Bus interfaces, Redfish/IPMI APIs, and support for hardware monitoring, fan control, power sequencing, and more.
18+
19+
It is widely adopted by hyperscalers and enterprise vendors to manage servers, storage systems, and network appliances.
20+
OpenBMC is particularly well-suited to Arm-based server platforms like **Neoverse RD-V3**, where it provides early-stage platform control and boot orchestration even before silicon is available.
21+
22+
**Key features of OpenBMC include:**
23+
- **Remote management:** power control, Serial over LAN (SOL), and virtual media
24+
- **Hardware health monitoring:** sensors, fans, temperature, voltage, and power rails
25+
- **Firmware update mechanisms:** support for signed image updates and secure boot
26+
- **Industry-standard APIs:** IPMI, Redfish, PLDM, and MCTP
27+
- **Modular and extensible design:** device tree-based configuration and layered architecture
28+
29+
OpenBMC enables faster development cycles, open innovation, and reduced vendor lock-in across data centers, cloud platforms, and edge environments.
30+
31+
**In this Learning Path**, you’ll simulate how OpenBMC manages the early-stage boot process, power sequencing, and remote access for a virtual Neoverse RD-V3 server. You will interact with the BMC console, inspect boot logs, and verify serial-over-LAN and UART communication with the host.
32+
33+
## Introduction to UEFI
34+
35+
The [Unified Extensible Firmware Interface (UEFI)](https://uefi.org/) is the modern replacement for legacy BIOS, responsible for initializing hardware and loading the operating system.
36+
UEFI provides a robust, modular, and extensible interface between platform firmware and OS loaders. It supports:
37+
38+
- A modular and extensible architecture
39+
- Faster boot times and reliable system initialization
40+
- Large storage device support using GPT (GUID Partition Table)
41+
- Secure Boot for verifying boot integrity
42+
- Pre-boot networking and diagnostics via UEFI Shell or applications
43+
44+
UEFI executes after the platform powers on and before the OS kernel takes over.
45+
It discovers and initializes system hardware, configures memory and I/O, and launches the bootloader.
46+
It is governed by the UEFI Forum and is now the standard firmware interface across server-class, desktop, and embedded systems.
47+
48+
In platforms that integrate OpenBMC, the BMC operates independently from the host CPU and manages platform power, telemetry, and recovery.
49+
During system boot, UEFI and OpenBMC coordinate via mechanisms such as IPMI over KCS, PLDM over MCTP, or shared memory buffers.
50+
51+
These interactions are especially critical in Arm server-class platforms—like Neoverse RD-V3—for secure boot, remote diagnostics, and system recovery during pre-silicon or bring-up phases.
52+
53+
**In this Learning Path**, you will build and run UEFI firmware on the RD-V3 FVP host platform, observe boot log output, and simulate how UEFI coordinates with OpenBMC via shared interfaces to complete system initialization.
54+
Lines changed: 323 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,323 @@
1+
---
2+
title: Set Up OpenBMC Development Environment
3+
weight: 3
4+
5+
### FIXED, DO NOT MODIFY
6+
layout: learningpathall
7+
---
8+
9+
## Set Up Development Environment
10+
11+
This module guides you through installing dependencies, configuring repositories, and preparing your workspace to simulate the OpenBMC and UEFI firmware stack on the Arm Neoverse RD-V3 platform using Fixed Virtual Platforms (FVPs).
12+
13+
Before getting started, it’s strongly recommended to review the previous Learning Path: [CSS-V3 Pre-Silicon Software Development Using Neoverse Servers](https://learn.arm.com/learning-paths/servers-and-cloud-computing/neoverse-rdv3-swstack).
14+
That guide walks you through how to use the CSSv3 reference design on FVP to perform early-stage development and validation.
15+
16+
Ensure your system meets the following requirements:
17+
- Access to an Arm Neoverse-based Linux machine (either cloud-based or local) is required, with at least 80 GB of free disk space, 48 GB of RAM, and running Ubuntu 22.04 LTS.
18+
- Working knowledge of Docker, Git, and Linux terminal tools
19+
- Basic understanding of server firmware stack (UEFI, BMC, TF-A, etc.)
20+
- Docker installed, or GitHub Codespaces-compatible development environment
21+
22+
### Install Required Packages
23+
24+
Install the base packages for building OpenBMC with the Yocto Project:
25+
26+
```bash
27+
sudo apt update
28+
sudo apt install git gcc g++ make file wget gawk diffstat bzip2 cpio chrpath zstd lz4 bzip2 unzip
29+
```
30+
31+
### Set Up the repo Tool
32+
33+
```bash
34+
mkdir -p ~/.bin
35+
PATH="${HOME}/.bin:${PATH}"
36+
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/.bin/repo
37+
chmod a+rx ~/.bin/repo
38+
```
39+
40+
### Download the Arm FVP Model (RD-V3)
41+
42+
Download and extract the RD-V3 FVP binary from Arm:
43+
```bash
44+
mkdir ~/fvp
45+
cd ~/fvp
46+
wget https://developer.arm.com/-/cdn-downloads/permalink/FVPs-Neoverse-Infrastructure/RD-V3-r1/FVP_RD_V3_R1_11.29_35_Linux64_armv8l.tgz
47+
tar -xvf FVP_RD_V3_R1_11.29_35_Linux64_armv8l.tgz
48+
./FVP_RD_V3_R1.sh
49+
```
50+
51+
The FVP installation may prompt you with a few questions—choosing the default options is sufficient for this learning path. By default, the FVP will be installed in /home/ubuntu/FVP_RD_V3_R1.
52+
53+
54+
### Initialize the Host Build Environment
55+
56+
Set up a workspace for host firmware builds:
57+
58+
```bash
59+
mkdir ~/host
60+
cd host
61+
62+
~/.bin/repo init -u "https://git.gitlab.arm.com/infra-solutions/reference-design/infra-refdesign-manifests.git" \
63+
-m "pinned-rdv3r1-bmc.xml" \
64+
-b "refs/tags/RD-INFRA-2025.07.03" \
65+
--depth=1
66+
67+
repo sync -c -j $(nproc) --fetch-submodules --force-sync --no-clone-bundle
68+
```
69+
70+
Then, use following commands to apply the pitch from Arm gitlab repo:
71+
72+
```bash
73+
git init
74+
git remote add -f origin https://gitlab.arm.com/server_management/PoCs/fvp-poc
75+
git config core.sparsecheckout true
76+
echo /patch >> .git/info/sparse-checkout
77+
git pull origin main
78+
```
79+
80+
This approach avoids downloading the entire repository, fetching only the folder you need.
81+
82+
### +++++ pitch +++++
83+
84+
```bash
85+
unzip ~/patch.zip
86+
```
87+
88+
Create a file `~/apply_patch.sh` and copy following content into.
89+
90+
```patch
91+
FVP_DIR="host"
92+
SOURCE=${PWD}
93+
94+
GREEN='\033[0;32m'
95+
NC='\033[0m'
96+
97+
pushd ${FVP_DIR} > /dev/null
98+
echo -e "${GREEN}\n===== Apply patches to edk2 =====\n${NC}"
99+
pushd uefi/edk2
100+
git am --keep-cr ${SOURCE}/patch/edk2/*.patch
101+
popd > /dev/null
102+
103+
echo -e "${GREEN}\n===== Apply patches to edk2-platforms =====\n${NC}"
104+
pushd uefi/edk2/edk2-platforms > /dev/null
105+
git am --keep-cr ${SOURCE}/patch/edk2-platforms/*.patch
106+
popd > /dev/null
107+
108+
echo -e "${GREEN}\n===== Apply patches to edk2-redfish-client =====\n${NC}"
109+
git clone https://github.com/tianocore/edk2-redfish-client.git
110+
pushd edk2-redfish-client > /dev/null
111+
git checkout 4f204b579b1d6b5e57a411f0d4053b0a516839c8
112+
git am --keep-cr ${SOURCE}/patch/edk2-redfish-client/*.patch
113+
popd > /dev/null
114+
115+
echo -e "${GREEN}\n===== Apply patches to buildroot =====\n${NC}"
116+
pushd buildroot > /dev/null
117+
git am ${SOURCE}/patch/buildroot/*.patch
118+
popd > /dev/null
119+
120+
echo -e "${GREEN}\n===== Apply patches to build-scripts =====\n${NC}"
121+
pushd build-scripts > /dev/null
122+
git am ${SOURCE}/patch/build-scripts/*.patch
123+
popd > /dev/null
124+
popd > /dev/null
125+
```
126+
127+
Next, apply patches to the `host`.
128+
129+
```bash
130+
chmod +x ./apply_patch.sh
131+
./apply_patch.sh
132+
```
133+
134+
### ---- pitch ----
135+
136+
A patch is a set of changes to source code or files that can fix bugs, add features, improveperformance, and enhance security.
137+
It can be applied to a repository without downloading the entireproject.
138+
* Fix Bugs: Correct defects or security issues.
139+
* Add Features: Introduce new modules or APIs.
140+
* Synchronize Versions: Keep multiple branches or forks consistent.
141+
* Test or Prototype: Try changes in a development environment (e.g., FVP).
142+
143+
144+
### Build RDv3 R1 Host Docker Image
145+
146+
Before building the host image, update the following line in `~/host/grub/bootstrap` to replace the `git://` protocol.
147+
Some networks or corporate environments restrict `git://` access due to firewall or security policies. Switching to `https://` ensures reliable and secure access to external Git repositories.
148+
149+
```
150+
diff --git a/bootstrap b/bootstrap
151+
index 5b08e7e2d..031784582 100755
152+
--- a/bootstrap
153+
+++ b/bootstrap
154+
@@ -47,7 +47,7 @@ PERL="${PERL-perl}"
155+
me=$0
156+
-default_gnulib_url=git://git.sv.gnu.org/gnulib
157+
+default_gnulib_url=https://git.savannah.gnu.org/git/gnulib.git
158+
usage() {
159+
cat <<EOF
160+
```
161+
162+
```bash
163+
cd ~/host/container-scripts
164+
./container.sh build
165+
```
166+
167+
Within the `host` directory, run:
168+
169+
```bash
170+
docker run --rm \
171+
-v $HOME/host:$HOME/host \
172+
-w $HOME/host \
173+
--env ARCADE_USER=$(id -un) \
174+
--env ARCADE_UID=$(id -u) \
175+
--env ARCADE_GID=$(id -g) \
176+
-t -i rdinfra-builder \
177+
bash -c "./build-scripts/rdinfra/build-test-busybox.sh -p rdv3r1 all"
178+
```
179+
180+
Once complete, you can observe the build binary in `~/host/output/rdv3r1/rdv3r1/`
181+
182+
```
183+
ls -la host/output/rdv3r1/rdv3r1/
184+
total 4308
185+
drwxr-xr-x 2 ubuntu ubuntu 4096 Aug 18 10:19 .
186+
drwxr-xr-x 4 ubuntu ubuntu 4096 Aug 18 10:20 ..
187+
lrwxrwxrwx 1 ubuntu ubuntu 25 Aug 18 10:19 Image -> ../components/linux/Image
188+
lrwxrwxrwx 1 ubuntu ubuntu 35 Aug 18 10:19 Image.defconfig -> ../components/linux/Image.defconfig
189+
-rw-r--r-- 1 ubuntu ubuntu 4402315 Aug 18 10:19 fip-uefi.bin
190+
lrwxrwxrwx 1 ubuntu ubuntu 34 Aug 18 10:19 lcp_ramfw.bin -> ../components/rdv3r1/lcp_ramfw.bin
191+
lrwxrwxrwx 1 ubuntu ubuntu 33 Aug 18 10:19 lcp_ramfw_ns -> ../components/rdv3r1/lcp_ramfw_ns
192+
lrwxrwxrwx 1 ubuntu ubuntu 26 Aug 18 10:19 lkvm -> ../components/kvmtool/lkvm
193+
lrwxrwxrwx 1 ubuntu ubuntu 34 Aug 18 10:19 mcp_ramfw.bin -> ../components/rdv3r1/mcp_ramfw.bin
194+
lrwxrwxrwx 1 ubuntu ubuntu 33 Aug 18 10:19 mcp_ramfw_ns -> ../components/rdv3r1/mcp_ramfw_ns
195+
lrwxrwxrwx 1 ubuntu ubuntu 28 Aug 18 10:19 rmm.img -> ../components/rdv3r1/rmm.img
196+
lrwxrwxrwx 1 ubuntu ubuntu 34 Aug 18 10:19 scp_ramfw.bin -> ../components/rdv3r1/scp_ramfw.bin
197+
lrwxrwxrwx 1 ubuntu ubuntu 33 Aug 18 10:19 scp_ramfw_ns -> ../components/rdv3r1/scp_ramfw_ns
198+
lrwxrwxrwx 1 ubuntu ubuntu 41 Aug 18 10:19 signed_lcp_ramfw.bin -> ../components/rdv3r1/signed_lcp_ramfw.bin
199+
lrwxrwxrwx 1 ubuntu ubuntu 41 Aug 18 10:19 signed_mcp_ramfw.bin -> ../components/rdv3r1/signed_mcp_ramfw.bin
200+
lrwxrwxrwx 1 ubuntu ubuntu 41 Aug 18 10:19 signed_scp_ramfw.bin -> ../components/rdv3r1/signed_scp_ramfw.bin
201+
lrwxrwxrwx 1 ubuntu ubuntu 31 Aug 18 10:19 tf-bl1.bin -> ../components/rdv3r1/tf-bl1.bin
202+
lrwxrwxrwx 1 ubuntu ubuntu 30 Aug 18 10:19 tf-bl1_ns -> ../components/rdv3r1/tf-bl1_ns
203+
lrwxrwxrwx 1 ubuntu ubuntu 31 Aug 18 10:19 tf-bl2.bin -> ../components/rdv3r1/tf-bl2.bin
204+
lrwxrwxrwx 1 ubuntu ubuntu 32 Aug 18 10:19 tf-bl31.bin -> ../components/rdv3r1/tf-bl31.bin
205+
lrwxrwxrwx 1 ubuntu ubuntu 55 Aug 18 10:19 tf_m_flash.bin -> ../components/arm/rse/neoverse_rd/rdv3r1/tf_m_flash.bin
206+
lrwxrwxrwx 1 ubuntu ubuntu 48 Aug 18 10:19 tf_m_rom.bin -> ../components/arm/rse/neoverse_rd/rdv3r1/rom.bin
207+
lrwxrwxrwx 1 ubuntu ubuntu 50 Aug 18 10:19 tf_m_vm0_0.bin -> ../components/arm/rse/neoverse_rd/rdv3r1/vm0_0.bin
208+
lrwxrwxrwx 1 ubuntu ubuntu 50 Aug 18 10:19 tf_m_vm0_1.bin -> ../components/arm/rse/neoverse_rd/rdv3r1/vm0_1.bin
209+
lrwxrwxrwx 1 ubuntu ubuntu 50 Aug 18 10:19 tf_m_vm1_0.bin -> ../components/arm/rse/neoverse_rd/rdv3r1/vm1_0.bin
210+
lrwxrwxrwx 1 ubuntu ubuntu 50 Aug 18 10:19 tf_m_vm1_1.bin -> ../components/arm/rse/neoverse_rd/rdv3r1/vm1_1.bin
211+
lrwxrwxrwx 1 ubuntu ubuntu 33 Aug 18 10:19 uefi.bin -> ../components/css-common/uefi.bin
212+
```
213+
214+
215+
{{% notice Note %}}
216+
The other [Arm Learning Path](https://learn.arm.com/learning-paths/servers-and-cloud-computing/neoverse-rdv3-swstack/3_rdv3_sw_build/) provides a complete introduction to setting up the RDv3 development environment — feel free to refer to it for more details.
217+
{{% /notice %}}
218+
219+
220+
### Build OpenBMC Image
221+
222+
OpenBMC is built on the Yocto Project, which uses BitBake as its build tool.
223+
You don’t need to download BitBake separately, as it is included in the OpenBMC build environment.
224+
Once you’ve set up the OpenBMC repository and initialized the build environment, BitBake is already available for building images, compiling packages, or running other tasks.
225+
226+
Start by cloning and building the OpenBMC image using the bitbake build system:
227+
228+
```bash
229+
cd ~
230+
git clone https://github.com/openbmc/openbmc.git
231+
cd openbmc
232+
source setup fvp
233+
bitbake obmc-phosphor-image
234+
```
235+
236+
During the OpenBMC build process, you may encounter a native compilation error when building Node.js (especially version 22+) due to high memory usage during the V8 engine build phase depends on your build machine.
237+
238+
```
239+
g++: fatal error: Killed signal terminated program cc1plus
240+
compilation terminated.
241+
ERROR: oe_runmake failed
242+
```
243+
244+
This is a typical Out-of-Memory (OOM) failure, where the system forcibly terminates the compiler due to insufficient available memory.
245+
246+
To reduce memory pressure, explicitly limit parallel tasks in `conf/local.conf`:
247+
248+
```bash
249+
BB_NUMBER_THREADS = "2"
250+
PARALLEL_MAKE = "-j2"
251+
```
252+
253+
This ensures that BitBake only runs two parallel tasks and that each Makefile invocation limits itself to two threads. It significantly reduces peak memory usage and avoids OOM terminations.
254+
255+
Once success build, you will observe the message like:
256+
257+
```
258+
Loading cache: 100% | | ETA: --:--:--
259+
Loaded 0 entries from dependency cache.
260+
Parsing recipes: 100% |#############################################################################################################| Time: 0:00:09
261+
Parsing of 3054 .bb files complete (0 cached, 3054 parsed). 5148 targets, 770 skipped, 0 masked, 0 errors.
262+
NOTE: Resolving any missing task queue dependencies
263+
264+
Build Configuration:
265+
BB_VERSION = "2.12.0"
266+
BUILD_SYS = "aarch64-linux"
267+
NATIVELSBSTRING = "ubuntu-22.04"
268+
TARGET_SYS = "aarch64-openbmc-linux"
269+
MACHINE = "fvp"
270+
DISTRO = "openbmc-phosphor"
271+
DISTRO_VERSION = "nodistro.0"
272+
TUNE_FEATURES = "aarch64 armv8-4a"
273+
TARGET_FPU = ""
274+
meta
275+
meta-oe
276+
meta-networking
277+
meta-python
278+
meta-phosphor
279+
meta-arm
280+
meta-arm-toolchain
281+
meta-arm-bsp
282+
meta-evb
283+
meta-evb-fvp-base = "master:1b6b75a7d22262ec1bf5ab8e2bfa434ac84d981b"
284+
285+
Sstate summary: Wanted 0 Local 0 Mirrors 0 Missed 0 Current 2890 (0% match, 100% complete)############################### | ETA: 0:00:00
286+
Initialising tasks: 100% |##########################################################################################################| Time: 0:00:03
287+
NOTE: Executing Tasks
288+
289+
```
290+
291+
{{% notice Note %}}
292+
The first build may take up to an hour depending on your system performance, as it downloads and compiles the entire firmware stack.
293+
{{% /notice %}}
294+
295+
296+
```text
297+
├── FVP_RD_V3_R1
298+
├── apply_patch.sh
299+
├── fvp
300+
│   ├── FVP_RD_V3_R1.sh
301+
│   ├── FVP_RD_V3_R1_11.29_35_Linux64_armv8l.tgz
302+
│   └── license_terms
303+
├── host
304+
│   ├── build-scripts
305+
│   ├── buildroot
306+
│   ├── ...
307+
├── openbmc
308+
│   ├── ...
309+
│   ├── build
310+
│   ├── meta-arm
311+
│   ├── ...
312+
│   ├── poky
313+
│   └── setup
314+
├── patch
315+
│   ├── build-scripts
316+
│   ├── buildroot
317+
│   ├── edk2
318+
│   ├── edk2-platforms
319+
│   └── edk2-redfish-client
320+
├── patch.zip
321+
└── run.sh
322+
323+
``

0 commit comments

Comments
 (0)