From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 26D8BA04B1; Wed, 23 Sep 2020 15:19:35 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 11CD11DB49; Wed, 23 Sep 2020 15:19:27 +0200 (CEST) Received: from lb.pantheon.sk (lb.pantheon.sk [46.229.239.20]) by dpdk.org (Postfix) with ESMTP id E29991D94A for ; Wed, 23 Sep 2020 15:19:24 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by lb.pantheon.sk (Postfix) with ESMTP id 01DFC970DD; Wed, 23 Sep 2020 15:19:23 +0200 (CEST) X-Virus-Scanned: amavisd-new at siecit.sk Received: from lb.pantheon.sk ([127.0.0.1]) by localhost (lb.pantheon.sk [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 2VaIwTC674BE; Wed, 23 Sep 2020 15:19:22 +0200 (CEST) Received: from service-node1.lab.pantheon.local (unknown [46.229.239.141]) by lb.pantheon.sk (Postfix) with ESMTP id 1F070970D9; Wed, 23 Sep 2020 15:19:22 +0200 (CEST) From: =?UTF-8?q?Juraj=20Linke=C5=A1?= To: bruce.richardson@intel.com, Ruifeng.Wang@arm.com, Honnappa.Nagarahalli@arm.com, Phil.Yang@arm.com, vcchunga@amazon.com, Dharmik.Thakkar@arm.com, jerinjacobk@gmail.com, hemant.agrawal@nxp.com Cc: dev@dpdk.org, =?UTF-8?q?Juraj=20Linke=C5=A1?= Date: Wed, 23 Sep 2020 15:19:20 +0200 Message-Id: <1600867161-15673-2-git-send-email-juraj.linkes@pantheon.tech> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1600867161-15673-1-git-send-email-juraj.linkes@pantheon.tech> References: <1600867161-15673-1-git-send-email-juraj.linkes@pantheon.tech> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Subject: [dpdk-dev] [RFC PATCH 1/2] build: rework Arm build options X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" The current system can identify only the implementer and part number of the arm device we're targeting, which is enough to identify the target CPU. However, even the full MIDR information is not enough to identify the SoC we're targeting. Expand the "machine" meson variable to allow specifying the target arm SoC. The SoC identification implies the CPU, so drop the current MIDR based CPU identification in favor of user input, which is the only way to identify the target SoC. This implies that native builds are not possible. Instead do a default (non-optimized, but executable on any aarch64 device) build. Also use the machine custom property in cross files for cross builds. An example of where the current system is insufficient is the cortex-a72 CPU. These cores are used in a variety of SoC from Broadcomm, NXP, Huawei and others. The MIDR information would only identify the core, but there's not way to identify the SoC to fine tune the build to it. Signed-off-by: Juraj Linkeš --- config/arm/arm64_armv8_linux_gcc | 28 ---- config/arm/default/arm64_armv8_linux_gcc | 23 +++ config/arm/default/meson.build | 8 + config/arm/meson.build | 139 +++++++++++------- .../{ => thunderx}/arm64_thunderx_linux_gcc | 2 +- config/arm/thunderx/meson.build | 18 +++ .../thunderxt88/arm64_thunderxt88_linux_gcc | 16 ++ config/arm/thunderxt88/meson.build | 18 +++ config/meson.build | 9 +- 9 files changed, 177 insertions(+), 84 deletions(-) delete mode 100644 config/arm/arm64_armv8_linux_gcc create mode 100644 config/arm/default/arm64_armv8_linux_gcc create mode 100644 config/arm/default/meson.build rename config/arm/{ => thunderx}/arm64_thunderx_linux_gcc (92%) create mode 100644 config/arm/thunderx/meson.build create mode 100644 config/arm/thunderxt88/arm64_thunderxt88_linux_gcc create mode 100644 config/arm/thunderxt88/meson.build diff --git a/config/arm/arm64_armv8_linux_gcc b/config/arm/arm64_armv8_linux_gcc deleted file mode 100644 index 88f0ff9da..000000000 --- a/config/arm/arm64_armv8_linux_gcc +++ /dev/null @@ -1,28 +0,0 @@ -[binaries] -c = 'aarch64-linux-gnu-gcc' -cpp = 'aarch64-linux-gnu-cpp' -ar = 'aarch64-linux-gnu-gcc-ar' -strip = 'aarch64-linux-gnu-strip' -pkgconfig = 'aarch64-linux-gnu-pkg-config' -pcap-config = '' - -[host_machine] -system = 'linux' -cpu_family = 'aarch64' -cpu = 'armv8-a' -endian = 'little' - -[properties] -implementor_id = 'generic' - -# Valid options for Arm's implementor_pn: -# 'default': valid for all armv8-a architectures (default value) -# '0xd03': cortex-a53 -# '0xd04': cortex-a35 -# '0xd05': cortex-a55 -# '0xd07': cortex-a57 -# '0xd08': cortex-a72 -# '0xd09': cortex-a73 -# '0xd0a': cortex-a75 -# '0xd0b': cortex-a76 -implementor_pn = 'default' diff --git a/config/arm/default/arm64_armv8_linux_gcc b/config/arm/default/arm64_armv8_linux_gcc new file mode 100644 index 000000000..56efd7a05 --- /dev/null +++ b/config/arm/default/arm64_armv8_linux_gcc @@ -0,0 +1,23 @@ +[binaries] +c = 'aarch64-linux-gnu-gcc' +cpp = 'aarch64-linux-gnu-cpp' +ar = 'aarch64-linux-gnu-gcc-ar' +strip = 'aarch64-linux-gnu-strip' +pkgconfig = 'aarch64-linux-gnu-pkg-config' +pcap-config = '' + +[host_machine] +system = 'linux' +cpu_family = 'aarch64' +cpu = 'armv8-a' +endian = 'little' + +[properties] +# Valid values for the machine property are the soc names identified by +# directories in config/arm +# Possible suffixes for socs: +# -mn-kc +# where m is the number of numa nodes and k is the number of lcores +# e.g. for thunderx soc the possible values are "thunderx" or "thunderx-1n-48c" +# the suffixes themselves need to be supported in config/arm//meson.build +machine = 'default' diff --git a/config/arm/default/meson.build b/config/arm/default/meson.build new file mode 100644 index 000000000..5714d0084 --- /dev/null +++ b/config/arm/default/meson.build @@ -0,0 +1,8 @@ +flags = [ + ['RTE_MACHINE', '"armv8a"'], + ['RTE_MAX_LCORE', 256], + ['RTE_USE_C11_MEM_MODEL', true], + ['RTE_CACHE_LINE_SIZE', 128] +] + +machine_args = ['-march=armv8-a+crc'] diff --git a/config/arm/meson.build b/config/arm/meson.build index 8728051d5..05b790f40 100644 --- a/config/arm/meson.build +++ b/config/arm/meson.build @@ -2,11 +2,11 @@ # Copyright(c) 2017 Intel Corporation. # Copyright(c) 2017 Cavium, Inc -# for checking defines we need to use the correct compiler flags -march_opt = '-march=@0@'.format(machine) - -arm_force_native_march = false -arm_force_default_march = (machine == 'default') +if machine == 'native' + # arm doesn't support a native build - user input of soc is required + # default to the portable build instead of native + machine = 'default' +endif flags_common_default = [ # Accelarate rte_memcpy. Be sure to run unit test (memcpy_perf_autotest) @@ -131,6 +131,7 @@ impl_dpaa = ['NXP DPAA', flags_dpaa, machine_args_generic] dpdk_conf.set('RTE_FORCE_INTRINSICS', 1) if not dpdk_conf.get('RTE_ARCH_64') + # armv7 build dpdk_conf.set('RTE_CACHE_LINE_SIZE', 64) dpdk_conf.set('RTE_ARCH_ARM', 1) dpdk_conf.set('RTE_ARCH_ARMv7', 1) @@ -138,41 +139,9 @@ if not dpdk_conf.get('RTE_ARCH_64') # mk/machine/armv7a/rte.vars.mk sets it too machine_args += '-mfpu=neon' else + # aarch64 build dpdk_conf.set('RTE_CACHE_LINE_SIZE', 128) dpdk_conf.set('RTE_ARCH_ARM64', 1) - - machine = [] - cmd_generic = ['generic', '', '', 'default', ''] - cmd_output = cmd_generic # Set generic by default - machine_args = [] # Clear previous machine args - if arm_force_default_march and not meson.is_cross_build() - machine = impl_generic - impl_pn = 'default' - elif not meson.is_cross_build() - # The script returns ['Implementer', 'Variant', 'Architecture', - # 'Primary Part number', 'Revision'] - detect_vendor = find_program(join_paths( - meson.current_source_dir(), 'armv8_machine.py')) - cmd = run_command(detect_vendor.path()) - if cmd.returncode() == 0 - cmd_output = cmd.stdout().to_lower().strip().split(' ') - endif - # Set to generic if variable is not found - machine = get_variable('impl_' + cmd_output[0], ['generic']) - if machine[0] == 'generic' - machine = impl_generic - cmd_output = cmd_generic - endif - impl_pn = cmd_output[3] - if arm_force_native_march == true - impl_pn = 'native' - endif - else - impl_id = meson.get_cross_property('implementor_id', 'generic') - impl_pn = meson.get_cross_property('implementor_pn', 'default') - machine = get_variable('impl_' + impl_id) - endif - # Apply Common Defaults. These settings may be overwritten by machine # settings later. foreach flag: flags_common_default @@ -181,30 +150,89 @@ else endif endforeach - message('Implementer : ' + machine[0]) - foreach flag: machine[1] + soc = machine.split('-')[0] + # TODO make sure the subdir exists + subdir(soc) + + if soc != 'default' + # combine common and soc specific flags + # TODO check that soc is in the dict + flags = flags['common'] + flags[soc] + endif + + foreach flag: flags if flag.length() > 0 dpdk_conf.set(flag[0], flag[1]) endif endforeach - foreach marg: machine[2] - if marg[0] == impl_pn - foreach flag: marg[1] - if cc.has_argument(flag) - machine_args += flag - endif - endforeach - # Apply any extra machine specific flags. - foreach flag: marg.get(2, flags_default_extra) - if flag.length() > 0 - dpdk_conf.set(flag[0], flag[1]) - endif - endforeach + verified_machine_args = [] + + foreach flag: machine_args + if cc.has_argument(flag) + verified_machine_args += flag + else + message('Unsupported machine flag "@0@", ignoring'.format(flag)) endif endforeach + machine_args = verified_machine_args + +# machine = [] +# cmd_generic = ['generic', '', '', 'default', ''] +# cmd_output = cmd_generic # Set generic by default +# machine_args = [] # Clear previous machine args +# if arm_force_default_march and not meson.is_cross_build() +# machine = impl_generic +# impl_pn = 'default' +# elif not meson.is_cross_build() +# # The script returns ['Implementer', 'Variant', 'Architecture', +# # 'Primary Part number', 'Revision'] +# detect_vendor = find_program(join_paths( +# meson.current_source_dir(), 'armv8_machine.py')) +# cmd = run_command(detect_vendor.path()) +# if cmd.returncode() == 0 +# cmd_output = cmd.stdout().to_lower().strip().split(' ') +# endif +# # Set to generic if variable is not found +# machine = get_variable('impl_' + cmd_output[0], ['generic']) +# if machine[0] == 'generic' +# machine = impl_generic +# cmd_output = cmd_generic +# endif +# impl_pn = cmd_output[3] +# if arm_force_native_march == true +# impl_pn = 'native' +# endif +# else +# impl_id = meson.get_cross_property('implementor_id', 'generic') +# impl_pn = meson.get_cross_property('implementor_pn', 'default') +# machine = get_variable('impl_' + impl_id) +# endif +# +# message('Implementer : ' + machine[0]) +# foreach flag: machine[1] +# if flag.length() > 0 +# dpdk_conf.set(flag[0], flag[1]) +# endif +# endforeach +# +# foreach marg: machine[2] +# if marg[0] == impl_pn +# foreach flag: marg[1] +# if cc.has_argument(flag) +# machine_args += flag +# endif +# endforeach +# # Apply any extra machine specific flags. +# foreach flag: marg.get(2, flags_default_extra) +# if flag.length() > 0 +# dpdk_conf.set(flag[0], flag[1]) +# endif +# endforeach +# endif +# endforeach endif -message(machine_args) +message('Using machine args: @0@'.format(machine_args)) if (cc.get_define('__ARM_NEON', args: machine_args) != '' or cc.get_define('__aarch64__', args: machine_args) != '') @@ -225,3 +253,6 @@ if cc.get_define('__ARM_FEATURE_CRYPTO', args: machine_args) != '' compile_time_cpuflags += ['RTE_CPUFLAG_AES', 'RTE_CPUFLAG_PMULL', 'RTE_CPUFLAG_SHA1', 'RTE_CPUFLAG_SHA2'] endif + +message('dpdk conf options after arm stuff: @0@'.format(dpdk_conf)) + diff --git a/config/arm/arm64_thunderx_linux_gcc b/config/arm/thunderx/arm64_thunderx_linux_gcc similarity index 92% rename from config/arm/arm64_thunderx_linux_gcc rename to config/arm/thunderx/arm64_thunderx_linux_gcc index 6572ab615..e53a86e8f 100644 --- a/config/arm/arm64_thunderx_linux_gcc +++ b/config/arm/thunderx/arm64_thunderx_linux_gcc @@ -13,4 +13,4 @@ cpu = 'armv8-a' endian = 'little' [properties] -implementor_id = '0x43' +machine = 'thunderx' diff --git a/config/arm/thunderx/meson.build b/config/arm/thunderx/meson.build new file mode 100644 index 000000000..873d79a64 --- /dev/null +++ b/config/arm/thunderx/meson.build @@ -0,0 +1,18 @@ +flags = { + 'common': [ + ['RTE_CACHE_LINE_SIZE', 128], + ['RTE_MAX_VFIO_GROUPS', 128], + ['RTE_MACHINE', '"thunderx"'], + ['RTE_USE_C11_MEM_MODEL', false] + ], + 'thunderx': [ + ['RTE_MAX_NUMA_NODES', 2], + ['RTE_MAX_LCORE', 96] + ], + 'thunderx-1n-48c': [ + ['RTE_MAX_NUMA_NODES', 1], + ['RTE_MAX_LCORE', 48] + ] +} + +machine_args = ['-march=armv8-a+crc+crypto','-mcpu=thunderx'] diff --git a/config/arm/thunderxt88/arm64_thunderxt88_linux_gcc b/config/arm/thunderxt88/arm64_thunderxt88_linux_gcc new file mode 100644 index 000000000..9a622786c --- /dev/null +++ b/config/arm/thunderxt88/arm64_thunderxt88_linux_gcc @@ -0,0 +1,16 @@ +[binaries] +c = 'aarch64-linux-gnu-gcc' +cpp = 'aarch64-linux-gnu-cpp' +ar = 'aarch64-linux-gnu-gcc-ar' +strip = 'aarch64-linux-gnu-strip' +pkgconfig = 'aarch64-linux-gnu-pkg-config' +pcap-config = '' + +[host_machine] +system = 'linux' +cpu_family = 'aarch64' +cpu = 'armv8-a' +endian = 'little' + +[properties] +machine = 'thunderxt88' diff --git a/config/arm/thunderxt88/meson.build b/config/arm/thunderxt88/meson.build new file mode 100644 index 000000000..2aa5d2cdd --- /dev/null +++ b/config/arm/thunderxt88/meson.build @@ -0,0 +1,18 @@ +flags = { + 'common': [ + ['RTE_CACHE_LINE_SIZE', 128], + ['RTE_MAX_VFIO_GROUPS', 128], + ['RTE_MACHINE', '"thunderx"'], + ['RTE_USE_C11_MEM_MODEL', false] + ], + 'thunderxt88': [ + ['RTE_MAX_NUMA_NODES', 2], + ['RTE_MAX_LCORE', 96] + ], + 'thunderxt88-1n-48c': [ + ['RTE_MAX_NUMA_NODES', 1], + ['RTE_MAX_LCORE', 48] + ] +} + +machine_args = ['-mcpu=thunderxt88'] diff --git a/config/meson.build b/config/meson.build index 69f2aeb60..177cbd49c 100644 --- a/config/meson.build +++ b/config/meson.build @@ -63,7 +63,14 @@ meson.add_install_script('../buildtools/symlink-drivers-solibs.sh', # set the machine type and cflags for it if meson.is_cross_build() - machine = host_machine.cpu() + if not host_machine.cpu_family().startswith('aarch') + # don't change the machine config for aarch32/64 builds + # that config is set in the cross file to identify the soc + # we're building for + machine = host_machine.cpu() + else + machine = meson.get_cross_property('machine', 'default') + endif else machine = get_option('machine') endif -- 2.20.1