1f22e705eSMichal Mazurek.. SPDX-License-Identifier: BSD-3-Clause 2f22e705eSMichal Mazurek Copyright(c) 2020 ARM Corporation. 3f22e705eSMichal Mazurek Copyright(c) 2022 StarFive 4f22e705eSMichal Mazurek Copyright(c) 2022 SiFive 5f22e705eSMichal Mazurek Copyright(c) 2022 Semihalf 6f22e705eSMichal Mazurek 7f22e705eSMichal MazurekCross compiling DPDK for RISC-V 8f22e705eSMichal Mazurek=============================== 9f22e705eSMichal Mazurek 10f22e705eSMichal MazurekThis chapter describes how to cross compile DPDK for RISC-V from x86 build 11f22e705eSMichal Mazurekhosts. 12f22e705eSMichal Mazurek 13f22e705eSMichal Mazurek.. note:: 14f22e705eSMichal Mazurek 15f22e705eSMichal Mazurek While it's possible to compile DPDK natively on a RISC-V host, it is 16f22e705eSMichal Mazurek currently recommended to cross-compile as Linux kernel does not offer any 17f22e705eSMichal Mazurek way for userspace to discover the vendor and architecture identifiers of the 18f22e705eSMichal Mazurek CPU and therefore any per-chip optimization options have to be chosen via 19f22e705eSMichal Mazurek a cross-file or ``c_args``. 20f22e705eSMichal Mazurek 21f22e705eSMichal Mazurek 22f22e705eSMichal MazurekPrerequisites 23f22e705eSMichal Mazurek------------- 24f22e705eSMichal Mazurek 25f22e705eSMichal MazurekEnsure that you have all pre-requisites for building DPDK natively as those will 26f22e705eSMichal Mazurekbe required also for cross-compilation. 27f22e705eSMichal Mazurek 28f22e705eSMichal Mazurek 29f22e705eSMichal MazurekLinux kernel 30f22e705eSMichal Mazurek~~~~~~~~~~~~ 31f22e705eSMichal Mazurek 32f22e705eSMichal MazurekMake sure that RISC-V host is running Linux kernel 5.13 or newer. This version 33f22e705eSMichal Mazurekintroduces patches necessary for PCIe BAR mapping to userspace. 34f22e705eSMichal Mazurek 35f22e705eSMichal Mazurek 36f22e705eSMichal MazurekGNU toolchain 37f22e705eSMichal Mazurek------------- 38f22e705eSMichal Mazurek 39f22e705eSMichal MazurekObtain the cross toolchain 40f22e705eSMichal Mazurek~~~~~~~~~~~~~~~~~~~~~~~~~~ 41f22e705eSMichal Mazurek 42f22e705eSMichal MazurekThe build process was tested using: 43f22e705eSMichal Mazurek 44f22e705eSMichal Mazurek* Ubuntu toolchain (the ``crossbuild-essential-riscv64`` package). 45f22e705eSMichal Mazurek 46f22e705eSMichal Mazurek* Latest `RISC-V GNU toolchain 47f22e705eSMichal Mazurek <https://github.com/riscv/riscv-gnu-toolchain/releases>`_ on Ubuntu or Arch 48f22e705eSMichal Mazurek Linux. 49f22e705eSMichal Mazurek 50f22e705eSMichal MazurekAlternatively the toolchain may be built straight from the source, to do that 51f22e705eSMichal Mazurekfollow the instructions on the riscv-gnu-toolchain github page. 52f22e705eSMichal Mazurek 53f22e705eSMichal Mazurek 54f22e705eSMichal MazurekUnzip and add into the PATH 55f22e705eSMichal Mazurek~~~~~~~~~~~~~~~~~~~~~~~~~~~ 56f22e705eSMichal Mazurek 57f22e705eSMichal MazurekThis step is only required for the riscv-gnu-toolchain. The Ubuntu toolchain is 58f22e705eSMichal Mazurekin the PATH already. 59f22e705eSMichal Mazurek 60f22e705eSMichal Mazurek.. code-block:: console 61f22e705eSMichal Mazurek 62f22e705eSMichal Mazurek tar -xvf riscv64-glibc-ubuntu-20.04-<version>.tar.gz 63f22e705eSMichal Mazurek export PATH=$PATH:<cross_install_dir>/riscv/bin 64f22e705eSMichal Mazurek 65f22e705eSMichal Mazurek 66f22e705eSMichal MazurekCross Compiling DPDK with GNU toolchain using Meson 67f22e705eSMichal Mazurek~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 68f22e705eSMichal Mazurek 69f22e705eSMichal MazurekTo cross-compile DPDK for a desired target machine use the following command:: 70f22e705eSMichal Mazurek 71*e24b8ad4SStephen Hemminger meson setup cross-build --cross-file <target_machine_configuration> 72f22e705eSMichal Mazurek ninja -C cross-build 73f22e705eSMichal Mazurek 74f22e705eSMichal MazurekFor example if the target machine is a generic rv64gc RISC-V, use the following 75f22e705eSMichal Mazurekcommand:: 76f22e705eSMichal Mazurek 77*e24b8ad4SStephen Hemminger meson setup riscv64-build-gcc --cross-file config/riscv/riscv64_linux_gcc 78f22e705eSMichal Mazurek ninja -C riscv64-build-gcc 79f22e705eSMichal Mazurek 80f22e705eSMichal MazurekIf riscv-gnu-toolchain is used, binary names should be updated to match. Update 81f22e705eSMichal Mazurekthe following lines in the cross-file: 82f22e705eSMichal Mazurek 83f22e705eSMichal Mazurek.. code-block:: console 84f22e705eSMichal Mazurek 85f22e705eSMichal Mazurek [binaries] 86f22e705eSMichal Mazurek c = 'riscv64-unknown-linux-gnu-gcc' 87f22e705eSMichal Mazurek cpp = 'riscv64-unknown-linux-gnu-g++' 88f22e705eSMichal Mazurek ar = 'riscv64-unknown-linux-gnu-ar' 89f22e705eSMichal Mazurek strip = 'riscv64-unknown-linux-gnu-strip' 90f22e705eSMichal Mazurek ... 91f22e705eSMichal Mazurek 92f22e705eSMichal MazurekSome toolchains (such as freedom-u-sdk one) require also setting ``--sysroot``, 93f22e705eSMichal Mazurekotherwise include paths might not be resolved. To do so, add the appropriate 94f22e705eSMichal Mazurekpaths to the cross-file: 95f22e705eSMichal Mazurek 96f22e705eSMichal Mazurek.. code-block:: console 97f22e705eSMichal Mazurek 98f22e705eSMichal Mazurek [properties] 99f22e705eSMichal Mazurek ... 100f22e705eSMichal Mazurek sys_root = ['--sysroot', '<path/to/toolchain/sysroot>'] 101f22e705eSMichal Mazurek ... 102f22e705eSMichal Mazurek 103f22e705eSMichal Mazurek 104f22e705eSMichal MazurekSupported cross-compilation targets 105f22e705eSMichal Mazurek----------------------------------- 106f22e705eSMichal Mazurek 107f22e705eSMichal MazurekCurrently the following targets are supported: 108f22e705eSMichal Mazurek 109f22e705eSMichal Mazurek* Generic rv64gc ISA: ``config/riscv/riscv64_linux_gcc`` 110f22e705eSMichal Mazurek 111f22e705eSMichal Mazurek* SiFive U740 SoC: ``config/riscv/riscv64_sifive_u740_linux_gcc`` 112f22e705eSMichal Mazurek 113f22e705eSMichal MazurekTo add a new target support, ``config/riscv/meson.build`` has to be modified by 114f22e705eSMichal Mazurekadding a new vendor/architecture id and a corresponding cross-file has to be 115f22e705eSMichal Mazurekadded to ``config/riscv`` directory. 116