config/arm: split -march into arch and features
Older compilers may not support all arch versions and all features that the target SoC supports, in which case it's better to figure out the highest arch version and features that the compiler supports. Implement a way to achieve this: 1. Find the highest arch version that the compiler supports, keeping in mind the SoC arch version we're building. For example, if the SoC arch version is arm8.2-a, but the compiler only supports arm8.1-a, use arm8.1-a. On the other hand, if the compiler supports arm8.3-a (or higher), use armv8.2-a. 2. With the architecture version locked, iterate over SoC features and use all that are supported. In all cases, emit a warning if there's something unsupported by the compiler. Signed-off-by: Juraj Linkeš <juraj.linkes@pantheon.tech>
This commit is contained in:
parent
328720c594
commit
95e0f23022
@ -38,7 +38,9 @@ implementer_generic = {
|
||||
],
|
||||
'part_number_config': {
|
||||
'generic': {
|
||||
'machine_args': ['-march=armv8-a+crc', '-moutline-atomics']
|
||||
'march': 'armv8-a',
|
||||
'march_features': ['crc'],
|
||||
'compiler_options': ['-moutline-atomics']
|
||||
},
|
||||
'generic_aarch32': {
|
||||
'machine_args': ['-march=armv8-a', '-mfpu=neon'],
|
||||
@ -53,15 +55,17 @@ implementer_generic = {
|
||||
}
|
||||
|
||||
part_number_config_arm = {
|
||||
'0xd03': {'machine_args': ['-mcpu=cortex-a53']},
|
||||
'0xd04': {'machine_args': ['-mcpu=cortex-a35']},
|
||||
'0xd07': {'machine_args': ['-mcpu=cortex-a57']},
|
||||
'0xd08': {'machine_args': ['-mcpu=cortex-a72']},
|
||||
'0xd09': {'machine_args': ['-mcpu=cortex-a73']},
|
||||
'0xd0a': {'machine_args': ['-mcpu=cortex-a75']},
|
||||
'0xd0b': {'machine_args': ['-mcpu=cortex-a76']},
|
||||
'0xd03': {'compiler_options': ['-mcpu=cortex-a53']},
|
||||
'0xd04': {'compiler_options': ['-mcpu=cortex-a35']},
|
||||
'0xd07': {'compiler_options': ['-mcpu=cortex-a57']},
|
||||
'0xd08': {'compiler_options': ['-mcpu=cortex-a72']},
|
||||
'0xd09': {'compiler_options': ['-mcpu=cortex-a73']},
|
||||
'0xd0a': {'compiler_options': ['-mcpu=cortex-a75']},
|
||||
'0xd0b': {'compiler_options': ['-mcpu=cortex-a76']},
|
||||
'0xd0c': {
|
||||
'machine_args': ['-march=armv8.2-a+crypto', '-mcpu=neoverse-n1'],
|
||||
'march': 'armv8.2-a',
|
||||
'march_features': ['crypto'],
|
||||
'compiler_options': ['-mcpu=neoverse-n1'],
|
||||
'flags': [
|
||||
['RTE_MACHINE', '"neoverse-n1"'],
|
||||
['RTE_ARM_FEATURE_ATOMICS', true],
|
||||
@ -71,7 +75,8 @@ part_number_config_arm = {
|
||||
]
|
||||
},
|
||||
'0xd49': {
|
||||
'machine_args': ['-march=armv8.5-a+crypto+sve2'],
|
||||
'march': 'armv8.5-a',
|
||||
'march_features': ['crypto', 'sve2'],
|
||||
'flags': [
|
||||
['RTE_MACHINE', '"neoverse-n2"'],
|
||||
['RTE_ARM_FEATURE_ATOMICS', true],
|
||||
@ -105,19 +110,21 @@ implementer_cavium = {
|
||||
],
|
||||
'part_number_config': {
|
||||
'0xa1': {
|
||||
'machine_args': ['-mcpu=thunderxt88'],
|
||||
'compiler_options': ['-mcpu=thunderxt88'],
|
||||
'flags': flags_part_number_thunderx
|
||||
},
|
||||
'0xa2': {
|
||||
'machine_args': ['-mcpu=thunderxt81'],
|
||||
'compiler_options': ['-mcpu=thunderxt81'],
|
||||
'flags': flags_part_number_thunderx
|
||||
},
|
||||
'0xa3': {
|
||||
'machine_args': ['-mcpu=thunderxt83'],
|
||||
'compiler_options': ['-mcpu=thunderxt83'],
|
||||
'flags': flags_part_number_thunderx
|
||||
},
|
||||
'0xaf': {
|
||||
'machine_args': ['-march=armv8.1-a+crc+crypto', '-mcpu=thunderx2t99'],
|
||||
'march': 'armv8.1-a',
|
||||
'march_features': ['crc', 'crypto'],
|
||||
'compiler_options': ['-mcpu=thunderx2t99'],
|
||||
'flags': [
|
||||
['RTE_MACHINE', '"thunderx2"'],
|
||||
['RTE_ARM_FEATURE_ATOMICS', true],
|
||||
@ -127,7 +134,9 @@ implementer_cavium = {
|
||||
]
|
||||
},
|
||||
'0xb2': {
|
||||
'machine_args': ['-march=armv8.2-a+crc+crypto+lse', '-mcpu=octeontx2'],
|
||||
'march': 'armv8.2-a',
|
||||
'march_features': ['crc', 'crypto', 'lse'],
|
||||
'compiler_options': ['-mcpu=octeontx2'],
|
||||
'flags': [
|
||||
['RTE_MACHINE', '"octeontx2"'],
|
||||
['RTE_ARM_FEATURE_ATOMICS', true],
|
||||
@ -148,7 +157,11 @@ implementer_ampere = {
|
||||
['RTE_MAX_NUMA_NODES', 1]
|
||||
],
|
||||
'part_number_config': {
|
||||
'0x0': {'machine_args': ['-march=armv8-a+crc+crypto', '-mtune=emag']}
|
||||
'0x0': {
|
||||
'march': 'armv8-a',
|
||||
'march_features': ['crc', 'crypto'],
|
||||
'compiler_options': ['-mtune=emag']
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -160,7 +173,9 @@ implementer_hisilicon = {
|
||||
],
|
||||
'part_number_config': {
|
||||
'0xd01': {
|
||||
'machine_args': ['-march=armv8.2-a+crypto', '-mtune=tsv110'],
|
||||
'march': 'armv8.2-a',
|
||||
'march_features': ['crypto'],
|
||||
'compiler_options': ['-mtune=tsv110'],
|
||||
'flags': [
|
||||
['RTE_MACHINE', '"Kunpeng 920"'],
|
||||
['RTE_ARM_FEATURE_ATOMICS', true],
|
||||
@ -169,7 +184,8 @@ implementer_hisilicon = {
|
||||
]
|
||||
},
|
||||
'0xd02': {
|
||||
'machine_args': ['-march=armv8.2-a+crypto+sve'],
|
||||
'march': 'armv8.2-a',
|
||||
'march_features': ['crypto', 'sve'],
|
||||
'flags': [
|
||||
['RTE_MACHINE', '"Kunpeng 930"'],
|
||||
['RTE_ARM_FEATURE_ATOMICS', true],
|
||||
@ -190,8 +206,14 @@ implementer_qualcomm = {
|
||||
['RTE_MAX_NUMA_NODES', 1]
|
||||
],
|
||||
'part_number_config': {
|
||||
'0x800': {'machine_args': ['-march=armv8-a+crc']},
|
||||
'0xc00': {'machine_args': ['-march=armv8-a+crc']},
|
||||
'0x800': {
|
||||
'march': 'armv8-a',
|
||||
'march_features': ['crc']
|
||||
},
|
||||
'0xc00': {
|
||||
'march': 'armv8-a',
|
||||
'march_features': ['crc']
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -500,13 +522,65 @@ if update_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
|
||||
foreach flag: part_number_config['machine_args']
|
||||
if cc.has_argument(flag)
|
||||
machine_args += flag
|
||||
|
||||
# probe supported archs and their features
|
||||
candidate_march = ''
|
||||
if part_number_config.has_key('march')
|
||||
supported_marchs = ['armv8.6-a', 'armv8.5-a', 'armv8.4-a', 'armv8.3-a',
|
||||
'armv8.2-a', 'armv8.1-a', 'armv8-a']
|
||||
check_compiler_support = false
|
||||
foreach supported_march: supported_marchs
|
||||
if supported_march == part_number_config['march']
|
||||
# start checking from this version downwards
|
||||
check_compiler_support = true
|
||||
endif
|
||||
if (check_compiler_support and
|
||||
cc.has_argument('-march=' + supported_march))
|
||||
candidate_march = supported_march
|
||||
# highest supported march version found
|
||||
break
|
||||
endif
|
||||
endforeach
|
||||
if candidate_march == ''
|
||||
error('No suitable armv8 march version found.')
|
||||
endif
|
||||
endforeach
|
||||
if candidate_march != part_number_config['march']
|
||||
warning('Configuration march version is ' +
|
||||
'@0@, but the compiler supports only @1@.'
|
||||
.format(part_number_config['march'], candidate_march))
|
||||
endif
|
||||
candidate_march = '-march=' + candidate_march
|
||||
|
||||
march_features = []
|
||||
if part_number_config.has_key('march_features')
|
||||
march_features += part_number_config['march_features']
|
||||
endif
|
||||
if soc_config.has_key('extra_march_features')
|
||||
march_features += soc_config['extra_march_features']
|
||||
endif
|
||||
foreach feature: march_features
|
||||
if cc.has_argument('+'.join([candidate_march, feature]))
|
||||
candidate_march = '+'.join([candidate_march, feature])
|
||||
else
|
||||
warning('The compiler does not support feature @0@'
|
||||
.format(feature))
|
||||
endif
|
||||
endforeach
|
||||
machine_args += candidate_march
|
||||
endif
|
||||
|
||||
# apply supported compiler options
|
||||
if part_number_config.has_key('compiler_options')
|
||||
foreach flag: part_number_config['compiler_options']
|
||||
if cc.has_argument(flag)
|
||||
machine_args += flag
|
||||
else
|
||||
warning('Configuration compiler option ' +
|
||||
'@0@ isn\'t supported.'.format(flag))
|
||||
endif
|
||||
endforeach
|
||||
endif
|
||||
|
||||
# apply flags
|
||||
foreach flag: dpdk_flags
|
||||
|
Loading…
Reference in New Issue
Block a user