Add Arm SoC configuration to Arm meson.build and add a meson option to
enable those options for native builds. This is preferable to
specifying a cross file when doing aarch64 -> aarch64 builds, since the
cross file specifies the toolchain as well.

Signed-off-by: Juraj Linkeš <juraj.lin...@pantheon.tech>
Reviewed-by: Honnappa Nagarahalli <honnappa.nagaraha...@arm.com>
---
 config/arm/arm64_armada_linux_gcc             |   7 +-
 config/arm/arm64_armv8_linux_gcc              |   5 +-
 config/arm/arm64_bluefield_linux_gcc          |   6 +-
 config/arm/arm64_dpaa_linux_gcc               |   6 +-
 config/arm/arm64_emag_linux_gcc               |   5 +-
 config/arm/arm64_graviton2_linux_gcc          |   6 +-
 config/arm/arm64_n1sdp_linux_gcc              |   6 +-
 config/arm/arm64_n2_linux_gcc                 |   6 +-
 config/arm/arm64_octeontx2_linux_gcc          |   6 +-
 config/arm/arm64_stingray_linux_gcc           |   6 +-
 config/arm/arm64_thunderx2_linux_gcc          |   5 +-
 config/arm/arm64_thunderxt88_linux_gcc        |   5 +-
 config/arm/meson.build                        | 136 +++++++++++++++++-
 .../linux_gsg/cross_build_dpdk_for_arm64.rst  |  80 ++++-------
 meson_options.txt                             |   2 +
 15 files changed, 174 insertions(+), 113 deletions(-)

diff --git a/config/arm/arm64_armada_linux_gcc 
b/config/arm/arm64_armada_linux_gcc
index 487cb2923..7cc40d1f4 100644
--- a/config/arm/arm64_armada_linux_gcc
+++ b/config/arm/arm64_armada_linux_gcc
@@ -14,9 +14,4 @@ cpu = 'armv8-a'
 endian = 'little'
 
 [properties]
-implementer_id = '0x56'
-part_number = '0xd08'
-max_lcores = 16
-max_numa_nodes = 1
-numa = false
-disabled_drivers = ['bus/dpaa', 'bus/fslmc', 'common/dpaax']
+soc = 'armada'
diff --git a/config/arm/arm64_armv8_linux_gcc b/config/arm/arm64_armv8_linux_gcc
index 5451a01da..64d44ead8 100644
--- a/config/arm/arm64_armv8_linux_gcc
+++ b/config/arm/arm64_armv8_linux_gcc
@@ -14,7 +14,4 @@ endian = 'little'
 
 [properties]
 # Generate binaries that are portable across all Armv8 machines
-implementer_id = 'generic'
-part_number = 'generic'
-max_lcores = 256
-max_numa_nodes = 4
+soc = 'generic'
diff --git a/config/arm/arm64_bluefield_linux_gcc 
b/config/arm/arm64_bluefield_linux_gcc
index 6bef87fbd..7b1fae8b9 100644
--- a/config/arm/arm64_bluefield_linux_gcc
+++ b/config/arm/arm64_bluefield_linux_gcc
@@ -13,8 +13,4 @@ cpu = 'armv8-a'
 endian = 'little'
 
 [properties]
-implementer_id = '0x41'
-part_number = '0xd08'
-max_lcores = 16
-max_numa_nodes = 1
-numa = false
+soc = 'bluefield'
diff --git a/config/arm/arm64_dpaa_linux_gcc b/config/arm/arm64_dpaa_linux_gcc
index 37398c762..e52188842 100644
--- a/config/arm/arm64_dpaa_linux_gcc
+++ b/config/arm/arm64_dpaa_linux_gcc
@@ -14,8 +14,4 @@ cpu = 'armv8-a'
 endian = 'little'
 
 [properties]
-implementer_id = 'dpaa'
-part_number = '0xd08'
-max_lcores = 16
-max_numa_nodes = 1
-numa = false
+soc = 'dpaa'
diff --git a/config/arm/arm64_emag_linux_gcc b/config/arm/arm64_emag_linux_gcc
index 7cbb05510..6c24b4bca 100644
--- a/config/arm/arm64_emag_linux_gcc
+++ b/config/arm/arm64_emag_linux_gcc
@@ -13,7 +13,4 @@ cpu = 'armv8-a'
 endian = 'little'
 
 [properties]
-implementer_id = '0x50'
-part_number = '0x0'
-max_lcores = 32
-max_numa_nodes = 1
+soc = 'emag'
diff --git a/config/arm/arm64_graviton2_linux_gcc 
b/config/arm/arm64_graviton2_linux_gcc
index cfe239797..bae35d6be 100644
--- a/config/arm/arm64_graviton2_linux_gcc
+++ b/config/arm/arm64_graviton2_linux_gcc
@@ -13,8 +13,4 @@ cpu = 'armv8-a'
 endian = 'little'
 
 [properties]
-implementor_id = '0x41'
-implementor_pn = '0xd0c'
-max_lcores = 64
-max_numa_nodes = 1
-numa = false
+soc = 'graviton2'
diff --git a/config/arm/arm64_n1sdp_linux_gcc b/config/arm/arm64_n1sdp_linux_gcc
index b00f2d1ef..249ff4738 100644
--- a/config/arm/arm64_n1sdp_linux_gcc
+++ b/config/arm/arm64_n1sdp_linux_gcc
@@ -13,8 +13,4 @@ cpu = 'armv8-a'
 endian = 'little'
 
 [properties]
-implementer_id = '0x41'
-part_number = '0xd0c'
-max_lcores = 4
-max_numa_nodes = 1
-numa = false
+soc = 'n1sdp'
diff --git a/config/arm/arm64_n2_linux_gcc b/config/arm/arm64_n2_linux_gcc
index 817b8ee28..157a88192 100644
--- a/config/arm/arm64_n2_linux_gcc
+++ b/config/arm/arm64_n2_linux_gcc
@@ -13,8 +13,4 @@ cpu = 'armv8-a'
 endian = 'little'
 
 [properties]
-implementer_id = '0x41'
-part_number = '0xd49'
-max_lcores = 64
-max_numa_nodes = 1
-numa = false
+soc = 'n2'
diff --git a/config/arm/arm64_octeontx2_linux_gcc 
b/config/arm/arm64_octeontx2_linux_gcc
index 593769709..063018e8f 100644
--- a/config/arm/arm64_octeontx2_linux_gcc
+++ b/config/arm/arm64_octeontx2_linux_gcc
@@ -13,8 +13,4 @@ cpu = 'armv8-a'
 endian = 'little'
 
 [properties]
-implementer_id = '0x43'
-part_number = '0xb2'
-max_lcores = 36
-max_numa_nodes = 1
-numa = false
+soc = 'octeontx2'
diff --git a/config/arm/arm64_stingray_linux_gcc 
b/config/arm/arm64_stingray_linux_gcc
index 6bef87fbd..1209a8c0b 100644
--- a/config/arm/arm64_stingray_linux_gcc
+++ b/config/arm/arm64_stingray_linux_gcc
@@ -13,8 +13,4 @@ cpu = 'armv8-a'
 endian = 'little'
 
 [properties]
-implementer_id = '0x41'
-part_number = '0xd08'
-max_lcores = 16
-max_numa_nodes = 1
-numa = false
+soc = 'stingray'
diff --git a/config/arm/arm64_thunderx2_linux_gcc 
b/config/arm/arm64_thunderx2_linux_gcc
index c06dcdc2b..348650712 100644
--- a/config/arm/arm64_thunderx2_linux_gcc
+++ b/config/arm/arm64_thunderx2_linux_gcc
@@ -13,7 +13,4 @@ cpu = 'armv8-a'
 endian = 'little'
 
 [properties]
-implementer_id = '0x43'
-part_number = '0xaf'
-max_lcores = 256
-max_numa_nodes = 2
+soc = 'thunderx2'
diff --git a/config/arm/arm64_thunderxt88_linux_gcc 
b/config/arm/arm64_thunderxt88_linux_gcc
index 3ba1528e4..d31d0c6d8 100644
--- a/config/arm/arm64_thunderxt88_linux_gcc
+++ b/config/arm/arm64_thunderxt88_linux_gcc
@@ -13,7 +13,4 @@ cpu = 'armv8-a'
 endian = 'little'
 
 [properties]
-implementer_id = '0x43'
-part_number = '0xa1'
-max_lcores = 96
-max_numa_nodes = 1
+soc = 'thunderxt88'
diff --git a/config/arm/meson.build b/config/arm/meson.build
index bf3adb2c6..eb91e80ff 100644
--- a/config/arm/meson.build
+++ b/config/arm/meson.build
@@ -29,7 +29,7 @@ native_machine_args = ['-mcpu=native']
 ## Part numbers are specific to Arm implementers
 # implementer specific aarch64 flags have middle priority
 #     (will overwrite common flags)
-# part number specific aarch64 flags have the highest priority
+# part number specific aarch64 flags have higher priority
 #     (will overwrite both common and implementer specific flags)
 implementer_generic = {
        'description': 'Generic armv8',
@@ -181,6 +181,106 @@ implementers = {
        'dpaa': implementer_dpaa
 }
 
+# soc specific aarch64 flags have the highest priority
+#     (will overwrite all other flags)
+soc_generic = {
+       'description': 'Generic un-optimized build for all aarch64 machines.',
+       'implementer': 'generic',
+       'part_number': 'generic'
+}
+
+soc_armada = {
+       'description': 'Marvell ARMADA',
+       'implementer': '0x56',
+       'part_number': '0xd08',
+       'numa': false,
+       'disabled_drivers': ['bus/dpaa', 'bus/fslmc', 'common/dpaax']
+}
+
+soc_bluefield = {
+       'description': 'NVIDIA BlueField',
+       'implementer': '0x41',
+       'part_number': '0xd08',
+       'numa': false
+}
+
+soc_dpaa = {
+       'description': 'NXP DPAA',
+       'implementer': 'dpaa',
+       'part_number': '0xd08',
+       'numa': false
+}
+
+soc_emag = {
+       'description': 'Ampere eMAG',
+       'implementer': '0x50',
+       'part_number': '0x0'
+}
+
+soc_graviton2 = {
+       'description': 'AWS Graviton2',
+       'implementer': '0x41',
+       'part_number': '0xd0c',
+       'numa': false
+}
+
+soc_n1sdp = {
+       'description': 'Arm Neoverse N1SDP',
+       'implementer': '0x41',
+       'part_number': '0xd0c',
+       'flags': [
+               ['RTE_MAX_LCORE', 4]
+       ],
+       'numa': false
+}
+
+soc_n2 = {
+       'description': 'Arm Neoverse N2',
+       'implementer': '0x41',
+       'part_number': '0xd49',
+       'numa': false
+}
+
+soc_octeontx2 = {
+       'description': 'Marvell OCTEON TX2',
+       'implementer': '0x43',
+       'part_number': '0xb2',
+       'numa': false
+}
+
+soc_stingray = {
+       'description': 'Broadcom Stingray',
+       'implementer': '0x41',
+       'part_number': '0xd08',
+       'numa': false
+}
+
+soc_thunderx2 = {
+       'description': 'Marvell ThunderX2 T99',
+       'implementer': '0x43',
+       'part_number': '0xaf'
+}
+
+soc_thunderxt88 = {
+       'description': 'Marvell ThunderX T88',
+       'implementer': '0x43',
+       'part_number': '0xa1'
+}
+
+socs = {
+       'generic': soc_generic,
+       'armada': soc_armada,
+       'bluefield': soc_bluefield,
+       'dpaa': soc_dpaa,
+       'emag': soc_emag,
+       'graviton2': soc_graviton2,
+       'n1sdp': soc_n1sdp,
+       'octeontx2': soc_octeontx2,
+       'stingray': soc_stingray,
+       'thunderx2': soc_thunderx2,
+       'thunderxt88': soc_thunderxt88
+}
+
 dpdk_conf.set('RTE_ARCH_ARM', 1)
 dpdk_conf.set('RTE_FORCE_INTRINSICS', 1)
 
@@ -193,11 +293,18 @@ if dpdk_conf.get('RTE_ARCH_32')
 else
        # aarch64 build
        use_native_machine_args = false
+       arm_soc = get_option('arm_soc')
+       soc_config = {}
        if not meson.is_cross_build()
                if machine == 'default'
                        # default build
+                       if arm_soc != ''
+                               error('Arm SoC is unsupported with default 
build.')
+                       endif
                        implementer_id = 'generic'
                        part_number = 'generic'
+               elif arm_soc != ''
+                       soc_config = socs.get(arm_soc, {'not_supported': true})
                else
                        # native build
                        # The script returns ['Implementer', 'Variant', 
'Architecture',
@@ -216,8 +323,27 @@ else
                endif
        else
                # cross build
-               implementer_id = meson.get_cross_property('implementer_id')
-               part_number = meson.get_cross_property('part_number')
+               arm_soc = meson.get_cross_property('soc', '')
+               if arm_soc == ''
+                       error('Arm SoC must be specified in the cross file.')
+               endif
+               soc_config = socs.get(arm_soc, {'not_supported': true})
+       endif
+
+       soc_flags = []
+       if soc_config.has_key('not_supported')
+               error('SoC @0@ not supported.'.format(arm_soc))
+       elif soc_config != {}
+               implementer_id = soc_config['implementer']
+               implementer_config = implementers[implementer_id]
+               part_number = soc_config['part_number']
+               soc_flags = soc_config.get('flags', [])
+               if not soc_config.get('numa', true)
+                       has_libnuma = 0
+               endif
+               if soc_config.has_key('disabled_drivers')
+                       disabled_drivers += soc_config['disabled_drivers']
+               endif
        endif
 
        if implementers.has_key(implementer_id)
@@ -243,8 +369,8 @@ else
                      '(-Dmachine=generic) build.')
        endif
 
-       # use default flags with implementer flags
-       dpdk_flags = flags_common + implementer_config['flags'] + 
part_number_config.get('flags', [])
+       # add flags in the proper order
+       dpdk_flags = flags_common + implementer_config['flags'] + 
part_number_config.get('flags', []) + soc_flags
 
        # apply supported machine args
        machine_args = [] # Clear previous machine args
diff --git a/doc/guides/linux_gsg/cross_build_dpdk_for_arm64.rst 
b/doc/guides/linux_gsg/cross_build_dpdk_for_arm64.rst
index 063661ebf..83bdb78bf 100644
--- a/doc/guides/linux_gsg/cross_build_dpdk_for_arm64.rst
+++ b/doc/guides/linux_gsg/cross_build_dpdk_for_arm64.rst
@@ -100,54 +100,32 @@ command::
        meson arm64-build --cross-file config/arm/arm64_armv8_linux_gcc
        ninja -C arm64-build
 
-Supported cross-compilation targets
------------------------------------
-
-If you wish to build for a target which is not among the current cross-files,
-you may use various combinations of implementer/part number::
-
-   Supported implementers:
-      'generic': Generic armv8
-      '0x41':    Arm
-      '0x43':    Cavium
-      '0x50':    Ampere Computing
-      '0x56':    Marvell ARMADA
-      'dpaa':    NXP DPAA
-
-   Supported part_numbers for generic:
-      'generic': valid for all armv8-a architectures (unoptimized portable 
build)
-
-   Supported part_numbers for 0x41, 0x56, dpaa:
-      '0xd03':   cortex-a53
-      '0xd04':   cortex-a35
-      '0xd09':   cortex-a73
-      '0xd0a':   cortex-a75
-      '0xd0b':   cortex-a76
-      '0xd0c':   neoverse-n1
-
-   Supported part_numbers for 0x43:
-      '0xa1':    thunderxt88
-      '0xa2':    thunderxt81
-      '0xa3':    thunderxt83
-      '0xaf':    thunderx2t99
-      '0xb2':    octeontx2
-
-   Supported part_numbers for 0x50:
-      '0x0':     emag
-
-Other cross file options
-------------------------
-
-There are other options you may specify in a cross file to tailor the build::
-
-   Supported extra configuration
-      max_numa_nodes = n  # will set RTE_MAX_NUMA_NODES
-      max_lcores = n      # will set RTE_MAX_LCORE
-
-      disabled_drivers = ['bus/dpaa', 'crypto']  # add disabled drivers
-         # valid values are directories (optionally with their subdirs)
-         # in the drivers directory
-
-      numa = false        # set to false to force building for a non-NUMA 
system
-         # if not set or set to true, the build system will build for a NUMA
-         # system only if libnuma is installed
+Building for an aarch64 SoC on an aarch64 build machine
+-------------------------------------------------------
+
+If you wish to build on an aarch64 build machine for a different aarch64 SoC,
+you don't need a separate cross toolchain, just a different set of
+configuration options. To build for an aarch64 SoC, use the -Darm_soc meson
+option::
+
+   meson soc_build -Darm_soc=<target_soc>
+
+Substitute <target_soc> with one of the supported SoCs::
+
+   generic:     Generic un-optimized build for all aarch64 machines.
+   armada:      Marvell ARMADA
+   bluefield:   NVIDIA BlueField
+   dpaa:        NXP DPAA
+   emag:        Ampere eMAG
+   graviton2:   AWS Graviton2
+   n1sdp:       Arm Neoverse N1SDP
+   octeontx2:   Marvell OCTEON TX2
+   stingray:    Broadcom Stingray
+   thunderx2:   Marvell ThunderX2 T99
+   thunderxt88: Marvell ThunderX T88
+
+These SoCs are also used in cross files, e.g.::
+
+   [properties]
+   # Generate binaries that are portable across all Armv8 machines
+   soc = 'generic'
diff --git a/meson_options.txt b/meson_options.txt
index 460432822..2aa056aa1 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -1,5 +1,7 @@
 # Please keep these options sorted alphabetically.
 
+option('arm_soc', type: 'string', value: '',
+       description: 'Specify if you want to build for a particular aarch64 Arm 
SoC when building on an aarch64 machine.')
 option('disable_drivers', type: 'string', value: '',
        description: 'Comma-separated list of drivers to explicitly disable.')
 option('drivers_install_subdir', type: 'string', value: 'dpdk/pmds-<VERSION>',
-- 
2.20.1

Reply via email to