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

Pavan Nikhilesh Bhagavatula pbhagavatula at marvell.com
Fri Apr 9 10:06:33 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>

For octeontx/thunderx

Tested-by: Pavan Nikhilesh <pbhagavatula at marvell.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