6. Cross compiling DPDK for RISC-V
This chapter describes how to cross compile DPDK for RISC-V from x86 build hosts.
Note
While it’s possible to compile DPDK natively on a RISC-V host, it is
currently recommended to cross-compile as Linux kernel does not offer any
way for userspace to discover the vendor and architecture identifiers of the
CPU and therefore any per-chip optimization options have to be chosen via
a cross-file or c_args
.
6.1. Prerequisites
Ensure that you have all pre-requisites for building DPDK natively as those will be required also for cross-compilation.
6.1.1. Linux kernel
Make sure that RISC-V host is running Linux kernel 5.13 or newer. This version introduces patches necessary for PCIe BAR mapping to userspace.
6.2. GNU toolchain
6.2.1. Obtain the cross toolchain
The build process was tested using:
- Ubuntu toolchain (the
crossbuild-essential-riscv64
package). - Latest RISC-V GNU toolchain on Ubuntu or Arch Linux.
Alternatively the toolchain may be built straight from the source, to do that follow the instructions on the riscv-gnu-toolchain github page.
6.2.2. Unzip and add into the PATH
This step is only required for the riscv-gnu-toolchain. The Ubuntu toolchain is in the PATH already.
tar -xvf riscv64-glibc-ubuntu-20.04-<version>.tar.gz
export PATH=$PATH:<cross_install_dir>/riscv/bin
6.2.3. Cross Compiling DPDK with GNU toolchain using Meson
To cross-compile DPDK for a desired target machine use the following command:
meson setup cross-build --cross-file <target_machine_configuration>
ninja -C cross-build
For example if the target machine is a generic rv64gc RISC-V, use the following command:
meson setup riscv64-build-gcc --cross-file config/riscv/riscv64_linux_gcc
ninja -C riscv64-build-gcc
If riscv-gnu-toolchain is used, binary names should be updated to match. Update the following lines in the cross-file:
[binaries]
c = 'riscv64-unknown-linux-gnu-gcc'
cpp = 'riscv64-unknown-linux-gnu-g++'
ar = 'riscv64-unknown-linux-gnu-ar'
strip = 'riscv64-unknown-linux-gnu-strip'
...
Some toolchains (such as freedom-u-sdk one) require also setting --sysroot
,
otherwise include paths might not be resolved. To do so, add the appropriate
paths to the cross-file:
[properties]
...
sys_root = ['--sysroot', '<path/to/toolchain/sysroot>']
...
6.3. Supported cross-compilation targets
Currently the following targets are supported:
- Generic rv64gc ISA:
config/riscv/riscv64_linux_gcc
- SiFive U740 SoC:
config/riscv/riscv64_sifive_u740_linux_gcc
To add a new target support, config/riscv/meson.build
has to be modified by
adding a new vendor/architecture id and a corresponding cross-file has to be
added to config/riscv
directory.