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