diff --git a/config/arm/arm64_armv8_linux_gcc b/config/arm/arm64_armv8_linux_gcc
index 04cd82ba9..818953e0f 100644
--- a/config/arm/arm64_armv8_linux_gcc
+++ b/config/arm/arm64_armv8_linux_gcc
@@ -22,8 +22,11 @@ endian = 'little'
 # 'dpaa':    NXP DPAA
 implementer_id = 'generic'
 
-# Supported part_numbers for generic, 0x41, 0x56, dpaa:
-# 'generic': valid for all armv8-a architectures (default value)
+# Supported part_numbers for generic:
+# 'generic': valid for all armv8-a architectures (unoptimized portable build)
+part_number = 'generic'
+
+# Supported part_numbers for 0x41, 0x56, dpaa:
 # '0xd03':   cortex-a53
 # '0xd04':   cortex-a35
 # '0xd05':   cortex-a55
@@ -33,10 +36,8 @@ implementer_id = 'generic'
 # '0xd0a':   cortex-a75
 # '0xd0b':   cortex-a76
 # '0xd0c':   neoverse-n1
-part_number = 'generic'
 
 # Supported part_numbers for 0x43:
-# 'generic': valid for all Cavium builds
 # '0xa1':    thunderxt88
 # '0xa2':    thunderxt81
 # '0xa3':    thunderxt83
@@ -44,4 +45,4 @@ part_number = 'generic'
 # '0xb2':    octeontx2
 
 # Supported part_numbers for 0x50:
-# 'generic': valid for all Ampere builds
+# '0x0':     emag
diff --git a/config/arm/arm64_emag_linux_gcc b/config/arm/arm64_emag_linux_gcc
index 24f3d533e..c675954fc 100644
--- a/config/arm/arm64_emag_linux_gcc
+++ b/config/arm/arm64_emag_linux_gcc
@@ -14,3 +14,4 @@ endian = 'little'
 
 [properties]
 implementer_id = '0x50'
+part_number = '0x0'
diff --git a/config/arm/arm64_thunderx_linux_gcc b/config/arm/arm64_thunderxt88_linux_gcc
similarity index 93%
rename from config/arm/arm64_thunderx_linux_gcc
rename to config/arm/arm64_thunderxt88_linux_gcc
index 670764437..758966262 100644
--- a/config/arm/arm64_thunderx_linux_gcc
+++ b/config/arm/arm64_thunderxt88_linux_gcc
@@ -14,3 +14,4 @@ endian = 'little'
 
 [properties]
 implementer_id = '0x43'
+part_number = '0xa1'
diff --git a/config/arm/meson.build b/config/arm/meson.build
index 5d232f1c4..fcf7107a5 100644
--- a/config/arm/meson.build
+++ b/config/arm/meson.build
@@ -33,7 +33,6 @@ flags_part_number_thunderx = [
 	['RTE_USE_C11_MEM_MODEL', false]
 ]
 part_number_config_arm = {
-	'generic': {'machine_args':  ['-march=armv8-a+crc', '-moutline-atomics']},
 	'native': {'machine_args':  ['-march=native']},
 	'0xd03': {'machine_args':  ['-mcpu=cortex-a53']},
 	'0xd04': {'machine_args':  ['-mcpu=cortex-a35']},
@@ -73,7 +72,9 @@ implementers = {
 			['RTE_CACHE_LINE_SIZE', 128],
 			['RTE_MAX_LCORE', 256]
 		],
-		'part_number_config': part_number_config_arm
+		'part_number_config': {
+			'generic': {'machine_args':  ['-march=armv8-a+crc', '-moutline-atomics']}
+		}
 	},
 	'0x41': {
 		'description': 'Arm',
@@ -94,7 +95,6 @@ implementers = {
 			['RTE_MAX_NUMA_NODES', 2]
 		],
 		'part_number_config': {
-			'generic': {'machine_args': ['-march=armv8-a+crc+crypto', '-mcpu=thunderx']},
 			'native': {'machine_args': ['-march=native']},
 			'0xa1': {
 				'machine_args': ['-mcpu=thunderxt88'],
@@ -141,7 +141,7 @@ implementers = {
 			['RTE_MAX_NUMA_NODES', 1]
 		],
 		'part_number_config': {
-			'generic': {'machine_args':  ['-march=armv8-a+crc+crypto', '-mtune=emag']},
+			'0x0': {'machine_args':  ['-march=armv8-a+crc+crypto', '-mtune=emag']},
 			'native': {'machine_args':  ['-march=native']}
 		}
 	},
@@ -180,10 +180,9 @@ if dpdk_conf.get('RTE_ARCH_32')
 	machine_args += '-mfpu=neon'
 else
 	# aarch64 build
-	implementer_id = 'generic'
 	if machine == 'generic' and not meson.is_cross_build()
 		# generic build
-		implementer_config = implementer['generic']
+		implementer_id = 'generic'
 		part_number = 'generic'
 	elif not meson.is_cross_build()
 		# native build
@@ -196,21 +195,24 @@ else
 			cmd_output = cmd.stdout().to_lower().strip().split(' ')
 			implementer_id = cmd_output[0]
 			part_number = cmd_output[3]
-		endif
-		# Set to generic if variable is not found
-		implementer_config = implementers.get(implementer_id, ['generic'])
-		if implementer_config[0] == 'generic'
-			implementer_config = implementer['generic']
-			part_number = 'generic'
+		else
+			error('Error when getting Arm Implementer ID and part number.')
 		endif
 		if arm_force_native_march == true
 			part_number = 'native'
 		endif
 	else
 		# cross build
-		implementer_id = meson.get_cross_property('implementer_id', 'generic')
-		part_number = meson.get_cross_property('part_number', 'generic')
-		implementer_config = implementers.get(implementer_id)
+		implementer_id = meson.get_cross_property('implementer_id')
+		part_number = meson.get_cross_property('part_number')
+	endif
+
+	if implementers.has_key(implementer_id)
+		implementer_config = implementers[implementer_id]
+	else
+		error('Unsupported Arm implementer: @0@. '.format(implementer_id) +
+		      'Please add support for it or use the generic ' +
+		      '(-Dmachine=generic) build.')
 	endif
 
 	message('Arm implementer: ' + implementer_config['description'])
@@ -220,15 +222,12 @@ else
 	if part_number_config.has_key(part_number)
 		# use the specified part_number machine args if found
 		part_number_config = part_number_config[part_number]
-	elif not meson.is_cross_build()
-		# default to generic machine args if part_number is not found
-		# and not forcing native machine args
-		# but don't default in cross-builds; if part_number is specified
-		# incorrectly in a cross-file, it needs to be fixed there
-		part_number_config = part_number_config['generic']
 	else
-		# doing cross build and part number is not in part_number_config
-		error('Cross build part number 0@0 not found.'.format(part_number))
+		# unknown part number
+		error('Unsupported part number @0@ of implementer @1@. '
+		      .format(part_number, implementer_id) +
+		      'Please add support for it or use the generic ' +
+		      '(-Dmachine=generic) build.')
 	endif
 
 	# use default flags with implementer flags
