Use PetaLinux Tools to complete the following steps:
- Create the PetaLinux master project in a suitable directory without any
spaces. In this guide it is named
<plnx-proj-root>:
$ petalinux-create -t project -s <PATH_TO_PETALINUX_ZYNQMP_PROJECT_BSP>
Note: The PetaLinux bsp's can be found at https://www.xilinx.com/support/download/index.html/content/xilinx/en/downloadNav/embedded-design-tools.html. - Navigate to the
directory:
$ cd <plnx-proj-root>
- Enable the required rootfs packages and
applications:
$ petalinux-config -c rootfs
- Ensure libmetal and l ibsysfs packages are
enabled:
Filesystem Packages---> misc ---> sysfsutils ---> [*] libsysfs libs ---> libmetal---> [*] libmetal
Ensure the libmetal demo application is enabled:Filesystem Packages ---> libs ---> libmetal--> [*] libmetal-demos
- Setting Device Tree for the Libmetal Linux Application Demonstration.
The device tree changes need to be added to system-user.dtsi.
PetaLinux system-user.dtsi path: <plnx-proj-root>/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi
For AMD Zynq™ UltraScale+™ based system use the following device tree overlay example:
/ {
reserved-memory {
#address-cells = <2>;
#size-cells = <2>;
ranges;
rproc_0_reserved: rproc@3ed000000 {
no-map;
reg = <0x0 0x3ed00000 0x0 0x2000000>;
};
};
tcm_0a@ffe00000 {
no-map;
reg = <0x0 0xffe00000 0x0 0x10000>;
phandle = <0x40>;
status = "okay";
compatible = "mmio-sram";
power-domain = <&zynqmp_firmware 15>;
};
tcm_0b@ffe20000 {
no-map;
reg = <0x0 0xffe20000 0x0 0x10000>;
phandle = <0x41>;
status = "okay";
compatible = "mmio-sram";
power-domain = <&zynqmp_firmware 16>;
};
rf5ss@ff9a0000 {
compatible = "xlnx,zynqmp-r5-remoteproc";
xlnx,cluster-mode = <1>;
ranges;
reg = <0x0 0xFF9A0000 0x0 0x10000>;
#address-cells = <0x2>;
#size-cells = <0x2>;
r5f_0 {
compatible = "xilinx,r5f";
#address-cells = <2>;
#size-cells = <2>;
ranges;
sram = <0x40 0x41>;
memory-region = <&rproc_0_reserved>;
power-domain = <&zynqmp_firmware 7>;
};
};
amba {
compatible = "simple-bus";
u-boot,dm-pre-reloc;
#address-cells = <0x2>;
#size-cells = <0x2>;
ranges;
/* Shared memory */
shm0: shm@0 {
compatible = "shm_uio";
reg = <0x0 0x3ed80000 0x0 0x1000000>;
};
/* Inter-Processor Interrupt */
ipi_amp: ipi@ff340000 {
compatible = "ipi_uio";
reg = <0x0 0xff340000 0x0 0x1000>;
interrupt-parent = <&gic>;
interrupts = <0 29 4>;
};
};
};
&ttc0 {
status = "okay";
};
The shm0 device tree node is used by the Libmetal application for shared memory starting at the address 0x3ed80000.
The tcm0a, tcm0b, and rf5ss nodes in the device tree overlay are needed only if system users plan to load their RPU firmware via the remoteproc Linux driver.
For a Versal device based system, change "power-domain = <&versal_firmware 0x18110005>; and replace the ipi_amp node with the following:
ipi_amp: ipi@ff360000 {
compatible = "ipi_uio";
reg = <0x0 0xff360000 0x0 0x1000>;
interrupt-parent = <&gic>;
interrupts = <0 33 4>;
};
For Zynq systems the device tree overlay:
/ {
reserved-memory {
#address-cells = <1>;
#size-cells = <1>;
ranges;
rproc_0_reserved: rproc@3e000000 {
no-map;
reg = <0x3e000000 0x400000>;
};
rproc_0_dma: rproc@3e800000 {
no-map;
compatible = "shared-dma-pool";
reg = <0x3e800000 0x100000>;
};
};
remoteproc0: remoteproc@0 {
compatible = "xlnx,zynq_remoteproc";
firmware = "firmware";
vring0 = <15>;
vring1 = <14>;
memory-region = <&rproc_0_reserved>, <&rproc_0_dma>;
};
};
The source code of the libmetal example on the Linux side can be found on the following web site:
https://github.com/OpenAMP/libmetal/tree/master/examples/system/linux/zynqmp/zynqmp_amp_demo
- common.h
- ipi_latency_demo.c
- ipi_shmem_demo.c
- ipi-uio.c
- libmetal_amp_demo.c
- shmem_atomic_demo.c
- shmem_demo.c
- shmem_latency_demo.c
- shmem_throughput_demo.c
- sys_init.c
- sys_init.h
- CONFIG_IPI_DEV_NAME
- CONFIG_TTC_DEV_NAME
- CONFIG_IPI_MASK