xref: /dpdk/doc/guides/linux_gsg/cross_build_dpdk_for_arm64.rst (revision e24b8ad46b2124d09a97d2f9e911ba197b4f83d1)
101add9daSGavin Hu..  SPDX-License-Identifier: BSD-3-Clause
280e9ccc2SPhil Yang    Copyright(c) 2021 ARM Corporation.
301add9daSGavin Hu
480e9ccc2SPhil YangCross compiling DPDK for aarch64 and aarch32
580e9ccc2SPhil Yang============================================
680e9ccc2SPhil Yang
780e9ccc2SPhil YangThis chapter describes how to cross compile DPDK for aarch64 on x86 build
880e9ccc2SPhil Yangmachine and compile 32-bit aarch32 DPDK on aarch64 build machine.
901add9daSGavin Hu
1001add9daSGavin Hu.. note::
1101add9daSGavin Hu
1280e9ccc2SPhil Yang   Whilst it is recommended to natively build DPDK on aarch64 (just
1380e9ccc2SPhil Yang   like with x86), it is also possible to cross compile DPDK for aarch64.
1480e9ccc2SPhil Yang   An aarch64 cross compiler GNU toolchain or an LLVM/clang toolchain
15eb0e12c0SJuraj Linkeš   may be used for cross-compilation.
1601add9daSGavin Hu
1701add9daSGavin Hu
18eb0e12c0SJuraj LinkešPrerequisites
19eb0e12c0SJuraj Linkeš-------------
2001add9daSGavin Hu
21eb0e12c0SJuraj LinkešNUMA library
22eb0e12c0SJuraj Linkeš~~~~~~~~~~~~
2301add9daSGavin Hu
2401add9daSGavin HuNUMA is required by most modern machines, not needed for non-NUMA architectures.
2501add9daSGavin Hu
2601add9daSGavin Hu.. note::
2701add9daSGavin Hu
2801add9daSGavin Hu   For compiling the NUMA lib, run libtool --version to ensure the libtool version >= 2.2,
2901add9daSGavin Hu   otherwise the compilation will fail with errors.
3001add9daSGavin Hu
3101add9daSGavin Hu.. code-block:: console
3201add9daSGavin Hu
3301add9daSGavin Hu   git clone https://github.com/numactl/numactl.git
3401add9daSGavin Hu   cd numactl
350fc0edb9SAli Alnubani   git checkout v2.0.13 -b v2.0.13
3601add9daSGavin Hu   ./autogen.sh
3701add9daSGavin Hu   autoconf -i
3888566746SJuraj Linkeš   ./configure --host=aarch64-linux-gnu CC=aarch64-none-linux-gnu-gcc --prefix=<numa install dir>
3901add9daSGavin Hu   make install
4001add9daSGavin Hu
41eb0e12c0SJuraj Linkeš.. note::
4201add9daSGavin Hu
4388566746SJuraj Linkeš   The compiler is ``aarch64-none-linux-gnu-gcc`` if you download GCC
4488566746SJuraj Linkeš   using the below guide. If you're using a different compiler,
4588566746SJuraj Linkeš   make sure you're using the proper executable name.
4601add9daSGavin Hu
47eb0e12c0SJuraj LinkešThe numa header files and lib file is generated in the include and lib folder
48eb0e12c0SJuraj Linkešrespectively under ``<numa install dir>``.
49eb0e12c0SJuraj Linkeš
50eb0e12c0SJuraj LinkešMeson prerequisites
51eb0e12c0SJuraj Linkeš~~~~~~~~~~~~~~~~~~~
52eb0e12c0SJuraj Linkeš
53eb0e12c0SJuraj LinkešMeson depends on pkgconfig to find the dependencies.
54eb0e12c0SJuraj LinkešThe package ``pkg-config-aarch64-linux-gnu`` is required for aarch64.
55eb0e12c0SJuraj LinkešTo install it in Ubuntu::
56eb0e12c0SJuraj Linkeš
57eb0e12c0SJuraj Linkeš   sudo apt install pkg-config-aarch64-linux-gnu
58eb0e12c0SJuraj Linkeš
5980e9ccc2SPhil YangFor aarch32, install ``pkg-config-arm-linux-gnueabihf``::
6080e9ccc2SPhil Yang
6180e9ccc2SPhil Yang   sudo apt install pkg-config-arm-linux-gnueabihf
6280e9ccc2SPhil Yang
63eb0e12c0SJuraj Linkeš
64eb0e12c0SJuraj LinkešGNU toolchain
65eb0e12c0SJuraj Linkeš-------------
66eb0e12c0SJuraj Linkeš
67eb0e12c0SJuraj Linkeš.. _obtain_GNU_toolchain:
68eb0e12c0SJuraj Linkeš
6980e9ccc2SPhil YangGet the cross toolchain
7080e9ccc2SPhil Yang~~~~~~~~~~~~~~~~~~~~~~~
71eb0e12c0SJuraj Linkeš
72eb0e12c0SJuraj LinkešThe latest GNU cross compiler toolchain can be downloaded from:
73eb0e12c0SJuraj Linkešhttps://developer.arm.com/open-source/gnu-toolchain/gnu-a/downloads.
74eb0e12c0SJuraj Linkeš
75eb0e12c0SJuraj LinkešIt is always recommended to check and get the latest compiler tool
76eb0e12c0SJuraj Linkešfrom the page and use it to generate better code.
77eb0e12c0SJuraj LinkešAs of this writing 9.2-2019.12 is the newest,
78eb0e12c0SJuraj Linkešthe following description is an example of this version.
79eb0e12c0SJuraj Linkeš
8080e9ccc2SPhil YangFor aarch64::
81eb0e12c0SJuraj Linkeš
82eb0e12c0SJuraj Linkeš   wget https://developer.arm.com/-/media/Files/downloads/gnu-a/9.2-2019.12/binrel/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz
83eb0e12c0SJuraj Linkeš   tar -xvf gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz
84eb0e12c0SJuraj Linkeš   export PATH=$PATH:<cross_install_dir>/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/bin
85eb0e12c0SJuraj Linkeš
8680e9ccc2SPhil YangFor aarch32::
8780e9ccc2SPhil Yang
8880e9ccc2SPhil Yang   wget https://developer.arm.com/-/media/Files/downloads/gnu-a/9.2-2019.12/binrel/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf.tar.xz
8980e9ccc2SPhil Yang   tar -xvf gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf.tar.xz
9080e9ccc2SPhil Yang   export PATH=$PATH:<cross_install_dir>/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/bin
9180e9ccc2SPhil Yang
92eb0e12c0SJuraj Linkeš.. note::
93eb0e12c0SJuraj Linkeš
9480e9ccc2SPhil Yang   For the host requirements and other info, refer to the release note section:
9580e9ccc2SPhil Yang   https://releases.linaro.org/components/toolchain/binaries/
96eb0e12c0SJuraj Linkeš
97eb0e12c0SJuraj Linkeš.. _augment_the_gnu_toolchain_with_numa_support:
98eb0e12c0SJuraj Linkeš
99eb0e12c0SJuraj LinkešAugment the GNU toolchain with NUMA support
100eb0e12c0SJuraj Linkeš~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
10101add9daSGavin Hu
10201add9daSGavin HuCopy the NUMA header files and lib to the cross compiler's directories:
10301add9daSGavin Hu
10401add9daSGavin Hu.. code-block:: console
10501add9daSGavin Hu
106eb0e12c0SJuraj Linkeš   cp <numa_install_dir>/include/numa*.h <cross_install_dir>/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/aarch64-none-linux-gnu/libc/usr/include/
107eb0e12c0SJuraj Linkeš   cp <numa_install_dir>/lib/libnuma.a <cross_install_dir>/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/lib/gcc/aarch64-none-linux-gnu/9.2.1/
108eb0e12c0SJuraj Linkeš   cp <numa_install_dir>/lib/libnuma.so <cross_install_dir>/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/lib/gcc/aarch64-none-linux-gnu/9.2.1/
10901add9daSGavin Hu
1106a4b58b8SJuraj Linkeš.. note::
1116a4b58b8SJuraj Linkeš
1126a4b58b8SJuraj Linkeš   Using LDFLAGS and CFLAGS is not a viable alternative to copying the files.
1136a4b58b8SJuraj Linkeš   The Meson docs say it is not recommended, as there are many caveats
1146a4b58b8SJuraj Linkeš   to their use with Meson, especially when rebuilding the project.
1156a4b58b8SJuraj Linkeš   A viable alternative would be to use the ``c_args`` and ``c_link_args``
1166a4b58b8SJuraj Linkeš   options with Meson 0.51.0 and higher:
1176a4b58b8SJuraj Linkeš
1186a4b58b8SJuraj Linkeš   .. code-block:: console
1196a4b58b8SJuraj Linkeš
1206a4b58b8SJuraj Linkeš      -Dc_args=-I<numa_install_dir>/include -Dc_link_args=-L<numa_install_dir>/lib
1216a4b58b8SJuraj Linkeš
1226a4b58b8SJuraj LinkešFor Meson versions lower than 0.51.0, the ``c_args`` and ``c_link_args``
1236a4b58b8SJuraj Linkešoptions do not apply to cross compilation.
1246a4b58b8SJuraj LinkešHowever, the compiler/linker flags may be added to cross files under [properties]:
1256a4b58b8SJuraj Linkeš
1266a4b58b8SJuraj Linkeš.. code-block:: console
1276a4b58b8SJuraj Linkeš
1286a4b58b8SJuraj Linkeš   c_args = ['-I<numa_install_dir>/include']
1296a4b58b8SJuraj Linkeš   c_link_args = ['-L<numa_install_dir>/lib']
1306a4b58b8SJuraj Linkeš
131eb0e12c0SJuraj LinkešCross Compiling DPDK with GNU toolchain using Meson
132eb0e12c0SJuraj Linkeš~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
133f31d1780SAli Alnubani
1346dad5e1eSJuraj Linkeš.. note::
1356dad5e1eSJuraj Linkeš
1366dad5e1eSJuraj Linkeš   The names of GCC binaries in cross files differ from the downloaded ones,
1376dad5e1eSJuraj Linkeš   which have an extra ``-none-`` in their name.
1386dad5e1eSJuraj Linkeš   Please modify the cross file binaries accordingly
1396dad5e1eSJuraj Linkeš   when using the downloaded cross compilers.
1406dad5e1eSJuraj Linkeš
1414d69a76aSJuraj Linkeš   An example cross file with modified names and added NUMA paths
1424d69a76aSJuraj Linkeš   would look like this:
1434d69a76aSJuraj Linkeš
1444d69a76aSJuraj Linkeš   .. code-block:: console
1454d69a76aSJuraj Linkeš
1464d69a76aSJuraj Linkeš      [binaries]
1474d69a76aSJuraj Linkeš      c = 'aarch64-none-linux-gnu-gcc'
1484d69a76aSJuraj Linkeš      cpp = 'aarch64-none-linux-gnu-cpp'
1494d69a76aSJuraj Linkeš      ar = 'aarch64-none-linux-gnu-gcc-ar'
1504d69a76aSJuraj Linkeš      strip = 'aarch64-none-linux-gnu-strip'
1514d69a76aSJuraj Linkeš      pkgconfig = 'aarch64-linux-gnu-pkg-config' # the downloaded binaries
1524d69a76aSJuraj Linkeš         # do not contain a pkgconfig binary, so it is not modified
1534d69a76aSJuraj Linkeš      pcap-config = ''
1544d69a76aSJuraj Linkeš
1554d69a76aSJuraj Linkeš      [host_machine]
1564d69a76aSJuraj Linkeš      system = 'linux'
1574d69a76aSJuraj Linkeš      cpu_family = 'aarch64'
1584d69a76aSJuraj Linkeš      cpu = 'armv8-a'
1594d69a76aSJuraj Linkeš      endian = 'little'
1604d69a76aSJuraj Linkeš
1614d69a76aSJuraj Linkeš      [properties]
1624d69a76aSJuraj Linkeš      # Generate binaries that are portable across all Armv8 machines
1634d69a76aSJuraj Linkeš      platform = 'generic'
1644d69a76aSJuraj Linkeš      c_args = ['-I<numa_install_dir>/include']  # replace <numa_install_dir>
1654d69a76aSJuraj Linkeš      c_link_args = ['-L<numa_install_dir>/lib'] # with your path
1664d69a76aSJuraj Linkeš
16750f5aa10SBruce RichardsonTo cross-compile DPDK on a desired target machine we can use the following
16850f5aa10SBruce Richardsoncommand::
16950f5aa10SBruce Richardson
170*e24b8ad4SStephen Hemminger   meson setup cross-build --cross-file <target_machine_configuration>
17150f5aa10SBruce Richardson   ninja -C cross-build
17250f5aa10SBruce Richardson
173eb0e12c0SJuraj LinkešFor example if the target machine is aarch64 we can use the following
1746dad5e1eSJuraj Linkešcommand, provided the cross file has been modified accordingly::
17550f5aa10SBruce Richardson
176*e24b8ad4SStephen Hemminger   meson setup aarch64-build-gcc --cross-file config/arm/arm64_armv8_linux_gcc
177eb0e12c0SJuraj Linkeš   ninja -C aarch64-build-gcc
178eb0e12c0SJuraj Linkeš
1796dad5e1eSJuraj LinkešIf the target machine is aarch32 we can use the following command,
1806dad5e1eSJuraj Linkešprovided the cross file has been modified accordingly::
18180e9ccc2SPhil Yang
182*e24b8ad4SStephen Hemminger   meson setup aarch32-build --cross-file config/arm/arm32_armv8_linux_gcc
18380e9ccc2SPhil Yang   ninja -C aarch32-build
184eb0e12c0SJuraj Linkeš
185eb0e12c0SJuraj LinkešLLVM/Clang toolchain
186eb0e12c0SJuraj Linkeš--------------------
187eb0e12c0SJuraj Linkeš
188eb0e12c0SJuraj LinkešObtain the cross tool chain
189eb0e12c0SJuraj Linkeš~~~~~~~~~~~~~~~~~~~~~~~~~~~
190eb0e12c0SJuraj Linkeš
191eb0e12c0SJuraj LinkešThe latest LLVM/Clang cross compiler toolchain can be downloaded from:
192eb0e12c0SJuraj Linkešhttps://developer.arm.com/tools-and-software/open-source-software/developer-tools/llvm-toolchain.
193eb0e12c0SJuraj Linkeš
194eb0e12c0SJuraj Linkeš.. code-block:: console
195eb0e12c0SJuraj Linkeš
196eb0e12c0SJuraj Linkeš   # Ubuntu binaries
197eb0e12c0SJuraj Linkeš   wget https://github.com/llvm/llvm-project/releases/download/llvmorg-10.0.0/clang+llvm-10.0.0-x86_64-linux-gnu-ubuntu-18.04.tar.xz
198eb0e12c0SJuraj Linkeš
199eb0e12c0SJuraj LinkešThe LLVM/Clang toolchain does not implement the standard c library.
200eb0e12c0SJuraj LinkešThe GNU toolchain ships an implementation we can use.
201eb0e12c0SJuraj LinkešRefer to obtain_GNU_toolchain_ to get the GNU toolchain.
202eb0e12c0SJuraj Linkeš
203eb0e12c0SJuraj LinkešUnzip and add into the PATH
204eb0e12c0SJuraj Linkeš~~~~~~~~~~~~~~~~~~~~~~~~~~~
205eb0e12c0SJuraj Linkeš
206eb0e12c0SJuraj Linkeš.. code-block:: console
207eb0e12c0SJuraj Linkeš
208eb0e12c0SJuraj Linkeš   tar -xvf clang+llvm-10.0.0-x86_64-linux-gnu-ubuntu-18.04.tar.xz
209eb0e12c0SJuraj Linkeš   export PATH=$PATH:<cross_install_dir>/clang+llvm-10.0.0-x86_64-linux-gnu-ubuntu-18.04/bin
210eb0e12c0SJuraj Linkeš
211eb0e12c0SJuraj LinkešCross Compiling DPDK with LLVM/Clang toolchain using Meson
212eb0e12c0SJuraj Linkeš~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
213eb0e12c0SJuraj Linkeš
214eb0e12c0SJuraj Linkeš.. note::
215eb0e12c0SJuraj Linkeš
216eb0e12c0SJuraj Linkeš   To use the NUMA library follow the same steps as for
217eb0e12c0SJuraj Linkeš   augment_the_gnu_toolchain_with_numa_support_.
218eb0e12c0SJuraj Linkeš
219eb0e12c0SJuraj LinkešThe paths to GNU stdlib must be specified in a cross file.
220eb0e12c0SJuraj LinkešAugmenting the default cross-file's ``c_args`` and ``c_link_args``
221eb0e12c0SJuraj Linkeš``config/arm/arm64_armv8_linux_clang_ubuntu1804`` would look like this:
222eb0e12c0SJuraj Linkeš
223eb0e12c0SJuraj Linkeš.. code-block:: console
224eb0e12c0SJuraj Linkeš
225eb0e12c0SJuraj Linkeš   ...
226eb0e12c0SJuraj Linkeš   c_args = ['-target', 'aarch64-linux-gnu', '--sysroot', '<cross_install_dir>/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/aarch64-none-linux-gnu/libc']
227eb0e12c0SJuraj Linkeš   c_link_args = ['-target', 'aarch64-linux-gnu', '-fuse-ld=lld', '--sysroot', '<cross_install_dir>/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/aarch64-none-linux-gnu/libc', '--gcc-toolchain=<cross_install_dir>/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu']
228eb0e12c0SJuraj Linkeš
229eb0e12c0SJuraj LinkešAssuming the file with augmented ``c_args`` and ``c_link_args``
230eb0e12c0SJuraj Linkešis named ``arm64_armv8_linux_clang``,
231eb0e12c0SJuraj Linkešuse the following command to cross-compile DPDK for the target machine::
232eb0e12c0SJuraj Linkeš
233*e24b8ad4SStephen Hemminger   meson setup aarch64-build-clang --cross-file config/arm/arm64_armv8_linux_clang
234eb0e12c0SJuraj Linkeš   ninja -C aarch64-build-clang
235eb0e12c0SJuraj Linkeš
236eb0e12c0SJuraj LinkešCross Compiling DPDK with LLVM/Clang toolchain using Meson on Ubuntu 18.04
237eb0e12c0SJuraj Linkeš~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
238eb0e12c0SJuraj Linkeš
239eb0e12c0SJuraj LinkešOn most popular Linux distribution it is not necessary to download
240eb0e12c0SJuraj Linkešthe toolchains, but rather use the packages provided by said distributions.
241eb0e12c0SJuraj LinkešOn Ubuntu 18.04, these packages are needed:
242eb0e12c0SJuraj Linkeš
243eb0e12c0SJuraj Linkeš.. code-block:: console
244eb0e12c0SJuraj Linkeš
245eb0e12c0SJuraj Linkeš   sudo apt-get install pkg-config-aarch64-linux-gnu clang llvm llvm-dev lld
246eb0e12c0SJuraj Linkeš   libc6-dev-arm64-cross libatomic1-arm64-cross libgcc-8-dev-arm64-cross
247eb0e12c0SJuraj Linkeš
248eb0e12c0SJuraj LinkešUse the following command to cross-compile DPDK for the target machine::
249eb0e12c0SJuraj Linkeš
250*e24b8ad4SStephen Hemminger   meson setup aarch64-build-clang --cross-file config/arm/arm64_armv8_linux_clang_ubuntu1804
251eb0e12c0SJuraj Linkeš   ninja -C aarch64-build-clang
252e7109798SJuraj Linkeš
253f2340c85SJuraj LinkešBuilding for an aarch64 SoC on an aarch64 build machine
254f2340c85SJuraj Linkeš-------------------------------------------------------
255e7109798SJuraj Linkeš
256f2340c85SJuraj LinkešIf you wish to build on an aarch64 build machine for a different aarch64 SoC,
257f2340c85SJuraj Linkešyou don't need a separate cross toolchain, just a different set of
258f2340c85SJuraj Linkešconfiguration options. To build for an aarch64 SoC, use the -Dplatform meson
259f2340c85SJuraj Linkešoption::
260e7109798SJuraj Linkeš
261*e24b8ad4SStephen Hemminger   meson setup soc_build -Dplatform=<target_soc>
262e7109798SJuraj Linkeš
263c3946acfSDavid MarchandSubstitute <target_soc> with one of the supported SoCs
2649ca2f16fSJuraj Linkeš
265c3946acfSDavid Marchand.. literalinclude:: ../../../config/arm/meson.build
266c3946acfSDavid Marchand   :start-after: Start of SoCs list
267c3946acfSDavid Marchand   :end-before: End of SoCs list
268e7109798SJuraj Linkeš
269f2340c85SJuraj LinkešThese SoCs are also used in cross files, e.g.::
270e7109798SJuraj Linkeš
271f2340c85SJuraj Linkeš   [properties]
272f2340c85SJuraj Linkeš   # Generate binaries that are portable across all Armv8 machines
273f2340c85SJuraj Linkeš   platform = 'generic'
274fe4ae325SJuraj Linkeš
275f2340c85SJuraj LinkešSupported SoC configuration
276f2340c85SJuraj Linkeš---------------------------
277fe4ae325SJuraj Linkeš
278f2340c85SJuraj LinkešThe SoC configuration is a combination of implementer and CPU part number
279f2340c85SJuraj Linkešconfiguration and SoC-specific configuration::
280fe4ae325SJuraj Linkeš
281f2340c85SJuraj Linkeš   soc_<name> = {
282f2340c85SJuraj Linkeš      'description': 'SoC Description',  # mandatory
283f2340c85SJuraj Linkeš      'implementer': <implementer_id>,   # mandatory
284f2340c85SJuraj Linkeš      'part_number': <part_number>,      # mandatory
285f2340c85SJuraj Linkeš      'numa': false,  # optional, specify for non-NUMA SoCs
286f2340c85SJuraj Linkeš      'enable_drivers': 'common/*,bus/*',  # optional, comma-separated list of
287f2340c85SJuraj Linkeš                              # drivers to build, wildcards are accepted
288f2340c85SJuraj Linkeš      'disable_drivers': 'crypto/*',       # optional, comma-separated list of
289f2340c85SJuraj Linkeš                              # drivers to disable, wildcards are accepted
290f2340c85SJuraj Linkeš      'flags': [
291f2340c85SJuraj Linkeš         ['RTE_MAX_LCORE', '16'],
292f2340c85SJuraj Linkeš         ['RTE_MAX_NUMA_NODES', '1']
293f2340c85SJuraj Linkeš      ]               # optional, list of DPDK options that will be added
294f2340c85SJuraj Linkeš                      # or overwritten
295f2340c85SJuraj Linkeš   }
29605a732f7SJuraj Linkeš
297f2340c85SJuraj LinkešWhere <implementer_id> is a key defined in the implementers dictionary
298f2340c85SJuraj Linkešin config/arm/meson.build (e.g. 0x41) and part_number is a key defined
299f2340c85SJuraj Linkešin implementers[<implementer_id>]['part_number_config'] dictionary
300f2340c85SJuraj Linkeš(i.e. the part number must be defined for the implementer,
301f2340c85SJuraj Linkeše.g. for 0x41, a valid value is 0xd49, which is the neoverse-n2 SoC).
302