[dpdk-dev] [RFC PATCH 1/2] build: rework Arm build options
Honnappa Nagarahalli
Honnappa.Nagarahalli at arm.com
Thu Sep 24 06:19:03 CEST 2020
Thanks Juraj for the quick RFC. Few comments inline.
<snip>
>
> 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š <juraj.linkes at pantheon.tech>
> ---
> 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"
Is it required to talk about the suffixes? I think the statement "Valid values for the machine property are the soc names identified by directories in config/arm" should be sufficient.
> +# the suffixes themselves need to be supported in
> +config/arm/<soc_dir>/meson.build machine = 'default'
IMO, "default" does not convey much information. Is it possible to change it without a deprecation notice? "generic" or "armv8" conveys more information.
Any opinions from others?
> 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'
Do we need a message here to the user?
> +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()
Isn't this for native build? Do we still need this?
> +# # 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
More information about the dev
mailing list