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.lin...@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

Reply via email to