> -----Original Message-----
> From: Ruifeng Wang <ruifeng.w...@arm.com>
> Sent: Friday, January 15, 2021 9:38 AM
> To: Juraj Linkeš <juraj.lin...@pantheon.tech>; bruce.richard...@intel.com;
> Honnappa Nagarahalli <honnappa.nagaraha...@arm.com>; Phil Yang
> <phil.y...@arm.com>; vcchu...@amazon.com; Dharmik Thakkar
> <dharmik.thak...@arm.com>; jerinjac...@gmail.com;
> hemant.agra...@nxp.com; Ajit Khaparde (ajit.khapa...@broadcom.com)
> <ajit.khapa...@broadcom.com>; ferruh.yi...@intel.com
> Cc: dev@dpdk.org; nd <n...@arm.com>
> Subject: RE: [PATCH v14 05/12] build: organize Arm config into dict
> 
> 
> > -----Original Message-----
> > From: Juraj Linkeš <juraj.lin...@pantheon.tech>
> > Sent: Wednesday, December 23, 2020 7:48 PM
> > To: bruce.richard...@intel.com; Ruifeng Wang <ruifeng.w...@arm.com>;
> > Honnappa Nagarahalli <honnappa.nagaraha...@arm.com>; Phil Yang
> > <phil.y...@arm.com>; vcchu...@amazon.com; Dharmik Thakkar
> > <dharmik.thak...@arm.com>; jerinjac...@gmail.com;
> > hemant.agra...@nxp.com; Ajit Khaparde (ajit.khapa...@broadcom.com)
> > <ajit.khapa...@broadcom.com>; ferruh.yi...@intel.com
> > Cc: dev@dpdk.org; Juraj Linkeš <juraj.lin...@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.lin...@pantheon.tech>
> > Reviewed-by: Honnappa Nagarahalli <honnappa.nagaraha...@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@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

Reply via email to