+Pavan Hi Chengwen, Pavan,
You had patches to add ability of picking supported march/extension. Can you help to review this patch and see if the generic infrastructure fulfills your needs? Regards. Ruifeng > -----Original Message----- > From: Juraj Linkeš <juraj.lin...@pantheon.tech> > Sent: Monday, July 12, 2021 9:02 PM > To: tho...@monjalon.net; david.march...@redhat.com; > bruce.richard...@intel.com; Honnappa Nagarahalli > <honnappa.nagaraha...@arm.com>; Ruifeng Wang > <ruifeng.w...@arm.com>; fengcheng...@huawei.com; > ferruh.yi...@intel.com; jerinjac...@gmail.com; jer...@marvell.com > Cc: dev@dpdk.org; Juraj Linkeš <juraj.lin...@pantheon.tech> > Subject: [PATCH v3] config/arm: split march cfg 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.lin...@pantheon.tech> > --- > v3: rebase > --- > config/arm/meson.build | 125 ++++++++++++++++++++++++++++++++----- > ---- > 1 file changed, 100 insertions(+), 25 deletions(-) > > diff --git a/config/arm/meson.build b/config/arm/meson.build index > 14987c634a..f5cd30f4f0 100644 > --- a/config/arm/meson.build > +++ b/config/arm/meson.build > @@ -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,66 @@ 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 marchs 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.') > + else > + 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 > endif > - endforeach > + if part_number_config.has_key('march_features') > + feature_unsupported = false > + foreach feature: part_number_config['march_features'] > + if cc.has_argument('+'.join([candidate_march, feature])) > + candidate_march = '+'.join([candidate_march, feature]) > + else > + feature_unsupported = true > + endif > + endforeach > + if feature_unsupported > + warning('Configuration march features are ' + > + '@0@, but the compiler supports only @1@.' > + .format(part_number_config['march_features'], > + candidate_march)) > + endif > + endif > + 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 > -- > 2.20.1