Lopper Step 2: Generate OpenAMP Nodes - Lopper Step 2: Generate OpenAMP Nodes - 2026.1 English - UG1186

Libmetal and OpenAMP User Guide (UG1186)

Document ID
UG1186
Release Date
2026-06-24
Version
2026.1 English

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
Table 1. Command Breakdown
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 elfload relation 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-consumer node as the legacy method.
    mbox-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";
    };
    For OpenAMP demos 2026.1 and later, the plugin updates the chosen node with zephyr,ipc by 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 the mbox-consumer approach 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.