5.1 Purpose
In this step, you invoke the OpenAMP lopper plugin to generate OpenAMP-specific device tree nodes. The plugin uses the relation information from the overlay. It creates these items:
- ELFLOAD region: DDR memory for firmware loading
- IPI configuration: Mailbox nodes for inter-processor interrupts
- Shared memory regions: VRings and buffers for RPMsg
- Chosen node updates: Zephyr-specific chosen properties
Use the following command to generate the OpenAMP
nodes:
LOPPER_DTC_FLAGS="-b 0 -@" \
lopper \
-O <output-directory> \
-f \
--enhanced \
<input-rpu-zephyr-yaml-dts> \
<output-cortexr52-openamp-dts> \
-- openamp <cpu-name> zephyr_dt
The following example shows this step for the VEK385
platform:
LOPPER_DTC_FLAGS="-b 0 -@" \
build/tmp/work/x86_64-linux/esw-conf-native/2026.1+git/recipe-sysroot-native/usr/bin/lopper \
-O . \
-f \
--enhanced \
rpu_zephyr-yaml.dts \
cortexr52_0-openamp.dts \
-- openamp cortexr52_0 zephyr_dt
| Parameter | Description |
|---|---|
<input-dts>
|
Device tree with overlay applied (from Step 1) |
<output-dts>
|
Output device tree with OpenAMP nodes generated |
-- openamp
|
Invokes the OpenAMP lopper plugin |
<cpu-name>
|
Target CPU (for example, cortexr52_0) |
zephyr_dt
|
Output format: Zephyr device tree bindings |
OpenAMP Plugin Actions
The OpenAMP lopper plugin performs the following transformations:
- ELFLOAD Region Generation: Based on the
elfloadrelation from the YAML overlay, the plugin ensures the DDR boot region is properly configured:reserved-memory { ddrboot@9800100 { phandle = <0x269>; device_type = "memory"; no-map; reg = <0x0 0x9800100 0x0 0x5ff00>; }; }; - IPI Mailbox Configuration: The plugin generates IPI mailbox nodes for the
RPU.
ipi_nobuf2: mailbox@eb3b1000 { compatible = "xlnx,mbox-versal-ipi-mailbox"; interrupt-parent = <&gic_r52>; interrupts = <0x0 0x41 0x4 0xa0>; reg = <0x0 0xeb3b1000 0x0 0x1000>; xlnx,ipi-id = <0xb>; #address-cells = <0x2>; #size-cells = <0x2>; ranges; ipi_2_nobuf_to_ipi_1_nobuf: child@eb3b0000 { compatible = "xlnx,mbox-versal-ipi-dest-mailbox"; #mbox-cells = <0x1>; xlnx,ipi-id = <0xa>; reg = <0x0 0xeb3b0000 0x0 0x1000>; reg-names = "ctrl"; }; }; - Shared Memory IPC Region: The plugin creates the combined IPC region for vrings
and buffers.
reserved-memory { ipc@9860000 { phandle = <0x26b>; compatible = "mmio-sram"; reg = <0x0 0x9860000 0x0 0x48000>; /* 288 KB: vrings + buffers */ }; }; - Chosen Node Updates: For OpenAMP demos 2025.2 and earlier, the plugin generates
an
mbox-consumernode as the legacy method.
For OpenAMP demos 2026.1 and later, the plugin updates thembox-consumer { compatible = "vnd,mbox-consumer"; mboxes = <&ipi_2_nobuf_to_ipi_1_nobuf 0x0>, <&ipi_2_nobuf_to_ipi_1_nobuf 0x1>; mbox-names = "tx", "rx"; };chosennode withzephyr,ipcby using an MBOX IPM port node.... mbox_ipi_eb3b0000_eb3b1000 { compatible = "zephyr,mbox-ipm"; mbox-names = "tx", "rx"; status = "okay"; mboxes = <&ipi_2_nobuf_to_ipi_1_nobuf 0x0>, <&ipi_2_nobuf_to_ipi_1_nobuf 0x1>; }; ... chosen { zephyr,ipc = "/mbox_ipi_eb3b0000_eb3b1000"; zephyr,ipc_shm = "/reserved-memory/ipc@9860000"; zephyr,sram = "/reserved-memory/ddrboot@9800100"; /* ... other chosen properties ... */ };Note: The plugin behavior depends on the OpenAMP plugin version. For 2025.2 builds, you use thembox-consumerapproach for backward compatibility.
Output: cortexr52_0-openamp.dts
This file contains the R52 domain system nodes after pruning. It also contains the
generated OpenAMP nodes for IPI, shared memory, and ELFLOAD. The file includes the
chosen node and either an IPM MBOX node or an
mbox-consumer node for IPC bindings. It also preserves relation
metadata for the next transformation.