xref: /dpdk/doc/guides/linux_gsg/cross_build_dpdk_for_riscv.rst (revision e24b8ad46b2124d09a97d2f9e911ba197b4f83d1)
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