[dpdk-dev] [PATCH v18 2/3] build: add 'platform' meson option and Arm SoC config

Juraj Linkeš juraj.linkes at pantheon.tech
Fri Apr 9 08:35:45 CEST 2021


Add Arm SoC configuration sets to Arm meson.build and add an arch
agnostic meson option, 'platform', to select from these SoC
configurations for meson 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.linkes at pantheon.tech>
Reviewed-by: Honnappa Nagarahalli <honnappa.nagarahalli at arm.com>
---
 config/arm/arm64_armada_linux_gcc             |   6 +-
 config/arm/arm64_armv8_linux_clang_ubuntu1804 |   3 +-
 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                        | 140 +++++++++++++++++-
 .../linux_gsg/cross_build_dpdk_for_arm64.rst  |  84 ++++-------
 meson_options.txt                             |   2 +
 16 files changed, 179 insertions(+), 118 deletions(-)

diff --git a/config/arm/arm64_armada_linux_gcc b/config/arm/arm64_armada_linux_gcc
index 9958db6692..301418949b 100644
--- a/config/arm/arm64_armada_linux_gcc
+++ b/config/arm/arm64_armada_linux_gcc
@@ -14,8 +14,4 @@ cpu = 'armv8-a'
 endian = 'little'
 
 [properties]
-implementer_id = '0x56'
-part_number = '0xd08'
-max_lcores = 16
-max_numa_nodes = 1
-numa = false
+platform = 'armada'
diff --git a/config/arm/arm64_armv8_linux_clang_ubuntu1804 b/config/arm/arm64_armv8_linux_clang_ubuntu1804
index 57095c1304..db488d75f4 100644
--- a/config/arm/arm64_armv8_linux_clang_ubuntu1804
+++ b/config/arm/arm64_armv8_linux_clang_ubuntu1804
@@ -14,7 +14,6 @@ cpu = 'armv8-a'
 endian = 'little'
 
 [properties]
-implementer_id = 'generic'
-part_number = 'generic'
+platform = 'generic'
 c_args = ['-target', 'aarch64-linux-gnu', '--sysroot', '/usr/aarch64-linux-gnu']
 c_link_args = ['-target', 'aarch64-linux-gnu', '-fuse-ld=lld', '--gcc-toolchain=/usr']
diff --git a/config/arm/arm64_armv8_linux_gcc b/config/arm/arm64_armv8_linux_gcc
index 5451a01da1..5391d35389 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
+platform = 'generic'
diff --git a/config/arm/arm64_bluefield_linux_gcc b/config/arm/arm64_bluefield_linux_gcc
index 6bef87fbd4..248a9f031a 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
+platform = 'bluefield'
diff --git a/config/arm/arm64_dpaa_linux_gcc b/config/arm/arm64_dpaa_linux_gcc
index 37398c7628..e9d5fd31fc 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
+platform = 'dpaa'
diff --git a/config/arm/arm64_emag_linux_gcc b/config/arm/arm64_emag_linux_gcc
index 7cbb055106..9cdd931180 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
+platform = 'emag'
diff --git a/config/arm/arm64_graviton2_linux_gcc b/config/arm/arm64_graviton2_linux_gcc
index edacb79497..8016fd236c 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]
-implementer_id = '0x41'
-part_number = '0xd0c'
-max_lcores = 64
-max_numa_nodes = 1
-numa = false
+platform = 'graviton2'
diff --git a/config/arm/arm64_n1sdp_linux_gcc b/config/arm/arm64_n1sdp_linux_gcc
index b00f2d1ef7..0df283e2f4 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
+platform = 'n1sdp'
diff --git a/config/arm/arm64_n2_linux_gcc b/config/arm/arm64_n2_linux_gcc
index 817b8ee28e..036aee2b0a 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
+platform = 'n2'
diff --git a/config/arm/arm64_octeontx2_linux_gcc b/config/arm/arm64_octeontx2_linux_gcc
index 5937697098..9156ee5410 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
+platform = 'octeontx2'
diff --git a/config/arm/arm64_stingray_linux_gcc b/config/arm/arm64_stingray_linux_gcc
index 6bef87fbd4..319a4a151d 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
+platform = 'stingray'
diff --git a/config/arm/arm64_thunderx2_linux_gcc b/config/arm/arm64_thunderx2_linux_gcc
index c06dcdc2b3..69c71cbc82 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
+platform = 'thunderx2'
diff --git a/config/arm/arm64_thunderxt88_linux_gcc b/config/arm/arm64_thunderxt88_linux_gcc
index 3ba1528e48..372097ba01 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
+platform = 'thunderxt88'
diff --git a/config/arm/meson.build b/config/arm/meson.build
index a241c45d13..6fcbbf2ebc 100644
--- a/config/arm/meson.build
+++ b/config/arm/meson.build
@@ -25,7 +25,7 @@ flags_common = [
 ## 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',
@@ -192,6 +192,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
+}
+
+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,
+	'n2': soc_n2,
+	'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)
 
@@ -203,11 +303,19 @@ if dpdk_conf.get('RTE_ARCH_32')
 	machine_args += '-mfpu=neon'
 else
 	# aarch64 build
+	soc = get_option('platform')
+	soc_config = {}
 	if not meson.is_cross_build()
 		if machine == 'default'
 			# default build
+			if soc != ''
+				error('Building for a particular platform is ' +
+				      'unsupported with default build.')
+			endif
 			implementer_id = 'generic'
 			part_number = 'generic'
+		elif soc != ''
+			soc_config = socs.get(soc, {'not_supported': true})
 		else
 			# native build
 			# The script returns ['Implementer', 'Variant', 'Architecture',
@@ -225,8 +333,30 @@ else
 		endif
 	else
 		# cross build
-		implementer_id = meson.get_cross_property('implementer_id')
-		part_number = meson.get_cross_property('part_number')
+		soc = meson.get_cross_property('platform', '')
+		if soc == ''
+			error('Arm SoC must be specified in the cross file.')
+		endif
+		soc_config = socs.get(soc, {'not_supported': true})
+	endif
+
+	soc_flags = []
+	if soc_config.has_key('not_supported')
+		error('SoC @0@ not supported.'.format(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
+		if soc_config.has_key('enabled_drivers')
+			enabled_drivers += soc_config['enabled_drivers']
+		endif
 	endif
 
 	if implementers.has_key(implementer_id)
@@ -252,8 +382,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/overwrite 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 1504dbfef0..fb01f3020c 100644
--- a/doc/guides/linux_gsg/cross_build_dpdk_for_arm64.rst
+++ b/doc/guides/linux_gsg/cross_build_dpdk_for_arm64.rst
@@ -187,58 +187,32 @@ Use the following command to cross-compile DPDK for the target machine::
    meson aarch64-build-clang --cross-file config/arm/arm64_armv8_linux_clang_ubuntu1804
    ninja -C aarch64-build-clang
 
-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
-
-      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
-
-      disabled_drivers = ['bus/dpaa', 'crypto/*']  # add disabled drivers
-         # valid values are dir/subdirs in the drivers directory
-         # wildcards are allowed
-
-      enabled_drivers = ['common/*', 'bus/*']  # build only these drivers
-         # valid values are dir/subdirs in the drivers directory
-         # wildcards are allowed
+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 -Dplatform meson
+option::
+
+   meson soc_build -Dplatform=<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
+   platform = 'generic'
diff --git a/meson_options.txt b/meson_options.txt
index d2d24a1424..d3d9e1ee51 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -32,6 +32,8 @@ option('max_lcores', type: 'integer', value: 128,
 	description: 'maximum number of cores/threads supported by EAL')
 option('max_numa_nodes', type: 'integer', value: 32,
 	description: 'maximum number of NUMA nodes supported by EAL')
+option('platform', type: 'string', value: '',
+	description: 'Use configuration for a particular platform (such as an Arm SoC).')
 option('enable_trace_fp', type: 'boolean', value: false,
 	description: 'enable fast path trace points.')
 option('tests', type: 'boolean', value: true,
-- 
2.20.1



More information about the dev mailing list