[dpdk-dev] [PATCH v14 05/12] build: organize Arm config into dict
Juraj Linkeš
juraj.linkes at pantheon.tech
Fri Jan 15 13:18:39 CET 2021
> -----Original Message-----
> From: Ruifeng Wang <Ruifeng.Wang at arm.com>
> Sent: Friday, January 15, 2021 9:38 AM
> To: Juraj Linkeš <juraj.linkes at pantheon.tech>; bruce.richardson at intel.com;
> Honnappa Nagarahalli <Honnappa.Nagarahalli at arm.com>; Phil Yang
> <Phil.Yang at arm.com>; vcchunga at amazon.com; Dharmik Thakkar
> <Dharmik.Thakkar at arm.com>; jerinjacobk at gmail.com;
> hemant.agrawal at nxp.com; Ajit Khaparde (ajit.khaparde at broadcom.com)
> <ajit.khaparde at broadcom.com>; ferruh.yigit at intel.com
> Cc: dev at dpdk.org; nd <nd at arm.com>
> Subject: RE: [PATCH v14 05/12] build: organize Arm config into dict
>
>
> > -----Original Message-----
> > From: Juraj Linkeš <juraj.linkes at pantheon.tech>
> > Sent: Wednesday, December 23, 2020 7:48 PM
> > To: bruce.richardson at intel.com; Ruifeng Wang <Ruifeng.Wang at arm.com>;
> > Honnappa Nagarahalli <Honnappa.Nagarahalli at arm.com>; Phil Yang
> > <Phil.Yang at arm.com>; vcchunga at amazon.com; Dharmik Thakkar
> > <Dharmik.Thakkar at arm.com>; jerinjacobk at gmail.com;
> > hemant.agrawal at nxp.com; Ajit Khaparde (ajit.khaparde at broadcom.com)
> > <ajit.khaparde at broadcom.com>; ferruh.yigit at intel.com
> > Cc: dev at dpdk.org; Juraj Linkeš <juraj.linkes at pantheon.tech>
> > Subject: [PATCH v14 05/12] build: organize Arm config into dict
> >
> > Use dictionary lookup instead of checking for existing variables,
> > iterating over all elements in the list or checking lists for optional
> > configuration. Move variable contents into the dictionary for
> > variables that would be referenced only once.
> > Fallback to generic part number if the discovered part number is unknown.
> >
> > Signed-off-by: Juraj Linkeš <juraj.linkes at pantheon.tech>
> > Reviewed-by: Honnappa Nagarahalli <honnappa.nagarahalli at arm.com>
> > ---
> > config/arm/meson.build | 298
> > ++++++++++++++++++++++++-----------------
> > 1 file changed, 178 insertions(+), 120 deletions(-)
> >
> > diff --git a/config/arm/meson.build b/config/arm/meson.build index
> > fb877fe77..b449b10c3 100644
> > --- a/config/arm/meson.build
> > +++ b/config/arm/meson.build
> > @@ -27,115 +27,166 @@ flags_common = [
> > ['RTE_CACHE_LINE_SIZE', 128]
> > ]
> >
> > -# implementer specific aarch64 flags, with middle priority -# (will
> > overwrite common flags) -flags_implementer_generic = [
> > - ['RTE_MACHINE', '"armv8a"'],
> > - ['RTE_USE_C11_MEM_MODEL', true],
> > - ['RTE_CACHE_LINE_SIZE', 128],
> > - ['RTE_MAX_LCORE', 256]
> > -]
> > -flags_implementer_arm = [
> > - ['RTE_MACHINE', '"armv8a"'],
> > - ['RTE_USE_C11_MEM_MODEL', true],
> > - ['RTE_CACHE_LINE_SIZE', 64],
> > - ['RTE_MAX_LCORE', 16]
> > -]
> > -flags_implementer_cavium = [
> > - ['RTE_MAX_VFIO_GROUPS', 128],
> > - ['RTE_CACHE_LINE_SIZE', 128],
> > - ['RTE_MAX_LCORE', 96],
> > - ['RTE_MAX_NUMA_NODES', 2]
> > -]
> > -flags_implementer_dpaa = [
> > - ['RTE_MACHINE', '"dpaa"'],
> > - ['RTE_LIBRTE_DPAA2_USE_PHYS_IOVA', false],
> > - ['RTE_USE_C11_MEM_MODEL', true],
> > - ['RTE_CACHE_LINE_SIZE', 64],
> > - ['RTE_MAX_LCORE', 16],
> > - ['RTE_MAX_NUMA_NODES', 1]
> > -]
> > -flags_implementer_emag = [
> > - ['RTE_MACHINE', '"emag"'],
> > - ['RTE_CACHE_LINE_SIZE', 64],
> > - ['RTE_MAX_LCORE', 32],
> > - ['RTE_MAX_NUMA_NODES', 1]
> > -]
> > -flags_implementer_armada = [
> > - ['RTE_MACHINE', '"armv8a"'],
> > - ['RTE_CACHE_LINE_SIZE', 64],
> > - ['RTE_MAX_LCORE', 16],
> > - ['RTE_MAX_NUMA_NODES', 1]
> > -]
> > +## 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
> > +# (will overwrite both common and implementer specific flags)
> > +implementer_generic = {
> > + 'description': 'Generic armv8',
> > + 'flags': [
> > + ['RTE_MACHINE', '"armv8a"'],
> > + ['RTE_USE_C11_MEM_MODEL', true],
> > + ['RTE_CACHE_LINE_SIZE', 128],
> > + ['RTE_MAX_LCORE', 256]
> > + ],
> > + 'part_number_config': {
> > + 'generic': {'machine_args': ['-march=armv8-a+crc',
> > + '-moutline-atomics']}
> > + }
> > +}
> > +
> > +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']},
> > + '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']},
> > + '0xd0c': {
> > + 'machine_args': ['-march=armv8.2-a+crypto',
> > + '-mcpu=neoverse-n1'],
> > + 'flags': [
> > + ['RTE_MACHINE', '"neoverse-n1"'],
> > + ['RTE_ARM_FEATURE_ATOMICS', true],
> > + ['RTE_USE_C11_MEM_MODEL', true],
> This duplicates what in implementer flags.
> Can we remove it?
>
> > + ['RTE_EAL_NUMA_AWARE_HUGEPAGES', false],
> > + ['RTE_LIBRTE_VHOST_NUMA', false],
> > + ['RTE_MAX_MEM_MB', 1048576],
> > + ['RTE_CACHE_LINE_SIZE', 64],
> Also this one.
>
Yea, let's not duplicate the config, I'll remove both of thoes.
> > + ['RTE_MAX_LCORE', 64],
> Do you want to change this to 80?
> Ampere Altra SoC has 80 N1 cores.
>
Yes, makes sense to update it.
> > + ['RTE_MAX_NUMA_NODES', 1]
> > + ]
> > + }
> > +}
> > +implementer_arm = {
> > + 'description': 'Arm',
> > + 'flags': [
> > + ['RTE_MACHINE', '"armv8a"'],
> > + ['RTE_USE_C11_MEM_MODEL', true],
> > + ['RTE_CACHE_LINE_SIZE', 64],
> > + ['RTE_MAX_LCORE', 16]
> > + ],
> > + 'part_number_config': part_number_config_arm }
> >
> > -# part number specific aarch64 flags, with highest priority -# (will
> > overwrite both common and implementer specific flags)
> > flags_part_number_thunderx = [
> > ['RTE_MACHINE', '"thunderx"'],
> > ['RTE_USE_C11_MEM_MODEL', false]
> > ]
> > -flags_part_number_thunderx2 = [
> > - ['RTE_MACHINE', '"thunderx2"'],
> > - ['RTE_ARM_FEATURE_ATOMICS', true],
> > - ['RTE_USE_C11_MEM_MODEL', true],
> > - ['RTE_CACHE_LINE_SIZE', 64],
> > - ['RTE_MAX_LCORE', 256],
> > - ['RTE_MAX_NUMA_NODES', 2]
> > -]
> > -flags_part_number_octeontx2 = [
> > - ['RTE_MACHINE', '"octeontx2"'],
> > - ['RTE_ARM_FEATURE_ATOMICS', true],
> > - ['RTE_USE_C11_MEM_MODEL', true],
> > - ['RTE_EAL_IGB_UIO', false],
> > - ['RTE_MAX_LCORE', 36],
> > - ['RTE_MAX_NUMA_NODES', 1]
> > -]
> > -flags_part_number_n1generic = [
> > - ['RTE_MACHINE', '"neoverse-n1"'],
> > - ['RTE_ARM_FEATURE_ATOMICS', true],
> > - ['RTE_USE_C11_MEM_MODEL', true],
> > - ['RTE_EAL_NUMA_AWARE_HUGEPAGES', false],
> > - ['RTE_LIBRTE_VHOST_NUMA', false],
> > - ['RTE_MAX_MEM_MB', 1048576],
> > - ['RTE_CACHE_LINE_SIZE', 64],
> > - ['RTE_MAX_LCORE', 64],
> > - ['RTE_MAX_NUMA_NODES', 1]
> > -]
> > +implementer_cavium = {
> > + 'description': 'Cavium',
> > + 'flags': [
> > + ['RTE_MAX_VFIO_GROUPS', 128],
> > + ['RTE_CACHE_LINE_SIZE', 128],
> > + ['RTE_MAX_LCORE', 96],
> > + ['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'],
> > + 'flags': flags_part_number_thunderx
> > + },
> > + '0xa2': {
> > + 'machine_args': ['-mcpu=thunderxt81'],
> > + 'flags': flags_part_number_thunderx
> > + },
> > + '0xa3': {
> > + 'machine_args': ['-mcpu=thunderxt83'],
> > + 'flags': flags_part_number_thunderx
> > + },
> > + '0xaf': {
> > + 'machine_args': ['-march=armv8.1-a+crc+crypto',
> > + '-mcpu=thunderx2t99'],
> > + 'flags': [
> > + ['RTE_MACHINE', '"thunderx2"'],
> > + ['RTE_ARM_FEATURE_ATOMICS', true],
> > + ['RTE_USE_C11_MEM_MODEL', true],
> > + ['RTE_CACHE_LINE_SIZE', 64],
> > + ['RTE_MAX_LCORE', 256],
> > + ['RTE_MAX_NUMA_NODES', 2]
> > + ]
> > + },
> > + '0xb2': {
> > + 'machine_args': ['-march=armv8.2-a+crc+crypto+lse',
> > + '-mcpu=octeontx2'],
> > + 'flags': [
> > + ['RTE_MACHINE', '"octeontx2"'],
> > + ['RTE_ARM_FEATURE_ATOMICS', true],
> > + ['RTE_USE_C11_MEM_MODEL', true],
> > + ['RTE_EAL_IGB_UIO', false],
> > + ['RTE_MAX_LCORE', 36],
> > + ['RTE_MAX_NUMA_NODES', 1]
> > + ]
> > + }
> > + }
> > +}
> >
> > -# arm config (implementer 0x41) is the default config -
> > part_number_config_arm = [
> > - ['generic', ['-march=armv8-a+crc', '-moutline-atomics']],
> > - ['native', ['-march=native']],
> > - ['0xd03', ['-mcpu=cortex-a53']],
> > - ['0xd04', ['-mcpu=cortex-a35']],
> > - ['0xd07', ['-mcpu=cortex-a57']],
> > - ['0xd08', ['-mcpu=cortex-a72']],
> > - ['0xd09', ['-mcpu=cortex-a73']],
> > - ['0xd0a', ['-mcpu=cortex-a75']],
> > - ['0xd0b', ['-mcpu=cortex-a76']],
> > - ['0xd0c', ['-march=armv8.2-a+crypto', '-mcpu=neoverse-n1'],
> > flags_part_number_n1generic]
> > -]
> > -part_number_config_cavium = [
> > - ['generic', ['-march=armv8-a+crc+crypto','-mcpu=thunderx']],
> > - ['native', ['-march=native']],
> > - ['0xa1', ['-mcpu=thunderxt88'], flags_part_number_thunderx],
> > - ['0xa2', ['-mcpu=thunderxt81'], flags_part_number_thunderx],
> > - ['0xa3', ['-mcpu=thunderxt83'], flags_part_number_thunderx],
> > - ['0xaf', ['-march=armv8.1-a+crc+crypto','-mcpu=thunderx2t99'],
> > flags_part_number_thunderx2],
> > - ['0xb2', ['-march=armv8.2-a+crc+crypto+lse','-mcpu=octeontx2'],
> > flags_part_number_octeontx2]
> > -]
> > -part_number_config_emag = [
> > - ['generic', ['-march=armv8-a+crc+crypto', '-mtune=emag']],
> > - ['native', ['-march=native']]
> > -]
> > +implementer_ampere = {
> > + 'description': 'Ampere Computing',
> > + 'flags': [
> > + ['RTE_MACHINE', '"emag"'],
> > + ['RTE_CACHE_LINE_SIZE', 64],
> > + ['RTE_MAX_LCORE', 32],
> > + ['RTE_MAX_NUMA_NODES', 1]
> > + ],
> > + 'part_number_config': {
> > + 'generic': {'machine_args': ['-march=armv8-a+crc+crypto',
> > + '-mtune=emag']},
> > + 'native': {'machine_args': ['-march=native']}
> > + }
> > +}
> > +
> > +implementer_marvell = {
> > + 'description': 'Marvell ARMADA',
> > + 'flags': [
> > + ['RTE_MACHINE', '"armv8a"'],
> > + ['RTE_CACHE_LINE_SIZE', 64],
> > + ['RTE_MAX_LCORE', 16],
> > + ['RTE_MAX_NUMA_NODES', 1]
> > + ],
> > + 'part_number_config': part_number_config_arm }
> > +
> > +implementer_dpaa = {
> > + 'description': 'NXP DPAA',
> > + 'flags': [
> > + ['RTE_MACHINE', '"dpaa"'],
> > + ['RTE_LIBRTE_DPAA2_USE_PHYS_IOVA', false],
> > + ['RTE_USE_C11_MEM_MODEL', true],
> > + ['RTE_CACHE_LINE_SIZE', 64],
> > + ['RTE_MAX_LCORE', 16],
> > + ['RTE_MAX_NUMA_NODES', 1]
> > + ],
> > + 'part_number_config': part_number_config_arm }
> >
> > -## Arm implementer ID (MIDR in Arm Architecture Reference Manual) -
> > implementer_generic = ['Generic armv8', flags_implementer_generic,
> > part_number_config_arm]
> > -implementer_0x41 = ['Arm', flags_implementer_arm,
> > part_number_config_arm]
> > -implementer_0x43 = ['Cavium', flags_implementer_cavium,
> > part_number_config_cavium]
> > -implementer_0x50 = ['Ampere Computing', flags_implementer_emag,
> > part_number_config_emag]
> > -implementer_0x56 = ['Marvell ARMADA', flags_implementer_armada,
> > part_number_config_arm] -implementer_dpaa = ['NXP DPAA',
> > flags_implementer_dpaa, part_number_config_arm]
> > +## Arm implementers (ID from MIDR in Arm Architecture Reference
> > Manual)
> > +implementers = {
> > + 'generic': implementer_generic,
> > + '0x41': implementer_arm,
> > + '0x43': implementer_cavium,
> > + '0x50': implementer_ampere,
> > + '0x56': implementer_marvell,
> > + 'dpaa': implementer_dpaa
> > +}
> >
> > dpdk_conf.set('RTE_ARCH_ARM', 1)
> > dpdk_conf.set('RTE_FORCE_INTRINSICS', 1) @@ -151,7 +202,7 @@ else
> > implementer_id = 'generic'
> > if machine == 'default' and not meson.is_cross_build()
> > # default build
> > - implementer_config = implementer_generic
> > + implementer_config = implementer['generic']
> > part_number = 'generic'
> > elif not meson.is_cross_build()
> > # native build
> > @@ -166,9 +217,9 @@ else
> > part_number = cmd_output[3]
> > endif
> > # Set to generic if variable is not found
> > - implementer_config = get_variable('implementer_' +
> > implementer_id, ['generic'])
> > + implementer_config = implementers.get(implementer_id,
> > ['generic'])
> > if implementer_config[0] == 'generic'
> > - implementer_config = implementer_generic
> > + implementer_config = implementer['generic']
> > part_number = 'generic'
> > endif
> > if arm_force_native_march == true
> > @@ -178,28 +229,35 @@ else
> > # cross build
> > implementer_id =
> > meson.get_cross_property('implementer_id', 'generic')
> > part_number = meson.get_cross_property('part_number',
> > 'generic')
> > - implementer_config = get_variable('implementer_' +
> > implementer_id)
> > + implementer_config = implementers.get(implementer_id)
> > endif
> >
> > - message('Arm implementer: ' + implementer_config[0])
> > + message('Arm implementer: ' + implementer_config['description'])
> > message('Arm part number: ' + part_number)
> >
> > + part_number_config = implementer_config['part_number_config']
> > + 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 at 0 not
> > found.'.format(part_number))
> > + endif
> > +
> > # use default flags with implementer flags
> > - dpdk_flags = flags_common + implementer_config[1]
> > + dpdk_flags = flags_common + implementer_config['flags'] +
> > +part_number_config.get('flags', [])
> >
> > + # apply supported machine args
> > machine_args = [] # Clear previous machine args
> > - foreach marg: implementer_config[2]
> > - if marg[0] == part_number
> > - # apply supported machine args
> > - foreach flag: marg[1]
> > - if cc.has_argument(flag)
> > - machine_args += flag
> > - endif
> > - endforeach
> > - if marg.length() > 2
> > - # add extra flags for the part
> > - dpdk_flags += marg[2]
> > - endif
> > + foreach flag: part_number_config['machine_args']
> > + if cc.has_argument(flag)
> > + machine_args += flag
> > endif
> > endforeach
> >
> > --
> > 2.20.1
More information about the dev
mailing list