<snip> > > > > > > > > > diff --git a/config/arm/meson.build b/config/arm/meson.build > > > > > index > > > > > 491842cad..6c31ab167 100644 > > > > > --- a/config/arm/meson.build > > > > > +++ b/config/arm/meson.build > > > > > @@ -3,12 +3,12 @@ > > > > > # Copyright(c) 2017 Cavium, Inc # Copyright(c) 2020 > > > > > PANTHEON.tech s.r.o. > > > > > > > > > > -# for checking defines we need to use the correct compiler > > > > > flags -march_opt = '-march=@0@'.format(machine) > > > > > - > > > > > +# set arm_force_native_march if you want to use machine args > > > > > +below # instead of discovered values; only works when doing an > > > > > +actual native build > > > > > arm_force_native_march = false > > > > > -arm_force_generic_march = (machine == 'generic') > > > > > +native_machine_args = ['-march=native', '-mtune=native'] > > > > > > > > > > > > > [...] > > > > > > > > > - > > > > > -machine_args_default = [ > > > > > - ['default', ['-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+crc+crypto', '-mcpu=neoverse- > n1'], > > > > > flags_n1sdp_extra]] > > > > > - > > > > > -machine_args_cavium = [ > > > > > - ['default', ['-march=armv8-a+crc+crypto','-mcpu=thunderx']], > > > > > - ['native', ['-march=native']], > > > > > - ['0xa1', ['-mcpu=thunderxt88'], flags_thunderx_extra], > > > > > - ['0xa2', ['-mcpu=thunderxt81'], flags_thunderx_extra], > > > > > - ['0xa3', ['-mcpu=thunderxt83'], flags_thunderx_extra], > > > > > - ['0xaf', ['-march=armv8.1-a+crc+crypto','- > mcpu=thunderx2t99'], > > > > > flags_thunderx2_extra], > > > > > - ['0xb2', ['-march=armv8.2-a+crc+crypto+lse','- > mcpu=octeontx2'], > > > > > flags_octeontx2_extra]] > > > > > - > > > > > -machine_args_emag = [ > > > > > - ['default', ['-march=armv8-a+crc+crypto', '-mtune=emag']], > > > > > - ['native', ['-march=native']]] > > > > > + ['RTE_USE_C11_MEM_MODEL', true] ] # arm config > (implementer > > > > > +0x41) is the default config pn_config_default > > > > What does it mean by 'default' here? I am somewhat confused > > > > between > > > 'default' > > > > and 'generic'. We should look to remove 'default' as much as > > > > possible and stick with 'generic'. > > > > > > > > > > This default means what default means, no special meaning, that is > > > if there isn't a more specific configuration, default to this one. > > > It's possible that generic is better, but now that I think about it, > > > using something else than default or generic might be the best to > > > avoid confusion. Possibly just part_number_arm, which will make it > > > in line with the > > other var names. > > Agree, better to call it 'part_number_arm'. > > > > > > > > > > += { > > > > > + 'generic': [['-march=armv8-a+crc', '-moutline-atomics']], > > > > I like that we have taken out 'native' from this list. Would it be > > > > possible to take out 'generic' from this and others below. This is > > > > because the binary built with 'generic' build should run on any > > > > Arm platform. There is no dependency on any underlying platform. > > > > > > > > > > This actually means generic part for the implementer, not generic > > > for everything. I understand this is here to produce binaries that > > > would run on everything from that impelemeter (in line of what you > > > mention below, this would be implementer-generic configuration, a > > > fourth category). In my patchset, it's also a fallback when building > > > for an unknown part number from the implementer. > > We do not need implementer-generic binaries/build. However, we will > > have some parameters that are common across all the part numbers from > > that implementer (probably we should not call it as > > 'implementer-generic' to avoid confusion. May be 'implementer-common- > flags' or 'implementer-flags-extra'). > > Those parameters can be used for every part number. > > These are currently named flags_<implementer> such as flags_arm and > flags_cavium. We could rename them to > implementer_flags_<implementer>. Ok
> > > > > If we know the implementer, we will have the part number as well (this > > is part of the Arm architecture definition). Unknown part number > > should result in an error message. > > > > Yes, we'll always have both. But there are still a couple of corner cases with > native builds, which should always work: I do not think these are corner cases. These are basically cases where the support is not added yet in the build system. We do not need to handle these specifically. I also do not think the notion that the 'native' build should always work is correct (at least on Arm platforms). The reason I say that is because 'native', IMO, not only defines the ISA, but other parameters as well in DPDK. > 1. We don't support the implementer (i.e. there's no variable with name > implementer_<implementer_id>). In this case, what do default to? The > generic build, which is the current behavior? This should result in an error. The implementer should add support in meson.build > 2. We support the implementer, but we don't support the part number. In > this case, we can just use native machine args (-march=native) and use only > implementer specific flags. Same thing, should result in error. The implementer should add support in meson.build. > > For generic, soc-specifc and cross builds it makes sense to error with uknown > implementer/part number, since we wouldn't know what to build otherwise. > > > > > > > Since this is not generic for everything, only for the implementer, > > > we're lacking the true common default machine args for everything. > > > > > > > > + '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+crc+crypto', > > > > > +'-mcpu=neoverse-n1'], flags_n1sdp_extra] > > > > 'flags_n1sdp_extra' does not fit here. For the part number '0xd0c' > > > > there could be multiple SoCs (N1SDP is one of them). So, if the > > > > SoC is not known, but if we know that the CPU is N1, then we > > > > should build a N1- > > > Generic build. > > > > > > This should be core-generic configuration, I can rename it to > > > flags_n1generic_extra. > > Agree. > > > > > > > > > So, from my perspective, there are 3 kinds of binaries: > > > > 1) generic - best portability - (possibly) least optimized for a > > > > given platform > > > > 2) Core-Generic (for ex: N1-generic) - Portable on all N1 based > > > > SoCs only - Optimized for N1 cores > > > > 3) SoC specific - (possibly) Not portable - Most optimized for the > > > > SoC > > > > > > > > > > The fourth category I mentioned above, implementer-generic, is used > > > in how > > We should not have this category. > > > > > the arm configuration is currently processed: > > > 1) default configuration > > > Added to/overwritten by > > > 2) implementer configuration (one of which is the configuration for > > > generic > > > build) Added to/overwritten by > > This should be just parameters that are common across all the part > > numbers of that implementer (for ex: RTE_CACHE_LINE_SIZE = 128), not a > build. > > > > It's not a build, just how the configation is organized and processed, as in > we > apply the common default flags, then implementer flags, then part number > flags and then soc flags, overwriting flags in all of the steps. Ok > > > > 3) part number (or core-generic) configuration Added to/overwritten > > > by > > > 4) SoC configuration (what we're adding now) > > > > > > It's not organized as cleanly - the machine args contain both 2) and 3). > > > Depending on what we want to do with the 'generic' part number I'll > > > adjust the config organization. > > > > > > > } pn_config_cavium = { > > > > > + 'generic': [['-march=armv8-a+crc+crypto', '- > mcpu=thunderx']], > > > > 'generic' does not make sense here. > > > > > > > > > + '0xa1': [['-mcpu=thunderxt88'], flags_thunderx_extra], > > > > > + '0xa2': [['-mcpu=thunderxt81'], flags_thunderx_extra], > > > > > + '0xa3': [['-mcpu=thunderxt83'], flags_thunderx_extra], > > > > > + '0xaf': [['-march=armv8.1-a+crc+crypto','- > mcpu=thunderx2t99'], > > > > > flags_thunderx2_extra], > > > > > + '0xb2': > > > > > +[['-march=armv8.2-a+crc+crypto+lse','-mcpu=octeontx2'], > > > > > +flags_octeontx2_extra], } pn_config_emag = { > > > > > + 'generic': [['-march=armv8-a+crc+crypto', '-mtune=emag']] } > > > > Same here. > > > > I understand that this is coming from the existing code. But, I > > > > think we should try to set it right. > > > > > > > > > > The generic config for these makes sense if a fourth category, > > > implementer- generic makes sense. > > > For example, for part_number_config_emag this means: for > implementer > > > _0x50 (Ampere Computing) use the generic machine args if there's > > > nothing more specific (which there isn't - no other part number). > > There should be a part number for this. Not sure why it is not present > > here. I will find out the info. > > > > > > > > > > > > > > > ## Arm implementer ID (ARM DDI 0487C.a, Section G7.2.106, Page > > > > > G7-5321) > > > > Nit, Would be good to remove the reference to the doc > > > > > > > > > > Is that because the docs mentioned here may not be the most recent? > > > It was useful to me in understanding where the implementer/part > > > number values come from. > > Yes, mainly because the spec gets updated. Instead you could say > > "Refer to MIDR in Arm Architecture Reference Manual") > > > > Ok, I'll make this change. > > > > > > > > > -impl_generic = ['Generic armv8', flags_generic, > > > > > machine_args_default] > > > > > -impl_0x41 = ['Arm', flags_arm, machine_args_default] > > > > > -impl_0x42 = ['Broadcom', flags_generic, machine_args_default] > > > > > -impl_0x43 = ['Cavium', flags_cavium, machine_args_cavium] > > > > > -impl_0x44 = ['DEC', flags_generic, machine_args_default] > > > > > -impl_0x49 = ['Infineon', flags_generic, machine_args_default] > > > > > -impl_0x4d = ['Motorola', flags_generic, machine_args_default] > > > > > -impl_0x4e = ['NVIDIA', flags_generic, machine_args_default] > > > > > -impl_0x50 = ['Ampere Computing', flags_emag, > machine_args_emag] > > > > > -impl_0x51 = ['Qualcomm', flags_generic, machine_args_default] > > > > > -impl_0x53 = ['Samsung', flags_generic, machine_args_default] > > > > > -impl_0x56 = ['Marvell ARMADA', flags_armada, > > > > > machine_args_default] > > > > > -impl_0x69 = ['Intel', flags_generic, machine_args_default] > > > > > -impl_dpaa = ['NXP DPAA', flags_dpaa, machine_args_default] > > > > > +impl_generic = ['Generic armv8', flags_generic, > > > > > +pn_config_default] > > > > > +impl_0x41 = ['Arm', flags_arm, pn_config_default] > > > > > +impl_0x42 = ['Broadcom', flags_generic, pn_config_default] > > > > > +impl_0x43 = ['Cavium', flags_cavium, pn_config_cavium] > > > > > +impl_0x44 = ['DEC', flags_generic, pn_config_default] > > > > > +impl_0x49 = ['Infineon', flags_generic, pn_config_default] > > > > > +impl_0x4d = ['Motorola', flags_generic, pn_config_default] > > > > > +impl_0x4e = ['NVIDIA', flags_generic, pn_config_default] > > > > > +impl_0x50 = ['Ampere Computing', flags_emag, pn_config_emag] > > > > > +impl_0x51 = ['Qualcomm', flags_generic, pn_config_default] > > > > > +impl_0x53 = ['Samsung', flags_generic, pn_config_default] > > > > > +impl_0x56 = ['Marvell ARMADA', flags_armada, pn_config_default] > > > > > +impl_0x69 = ['Intel', flags_generic, pn_config_default] > > > > > +impl_dpaa = ['NXP DPAA', flags_dpaa, pn_config_default] > > > > > > > > > > dpdk_conf.set('RTE_ARCH_ARM', 1) > > > > > dpdk_conf.set('RTE_FORCE_INTRINSICS', 1) > > > > > > > > > > if dpdk_conf.get('RTE_ARCH_32') > > > > > + # armv7 build > > > > > dpdk_conf.set('RTE_CACHE_LINE_SIZE', 64) > > > > > dpdk_conf.set('RTE_ARCH_ARMv7', 1) > > > > > # the minimum architecture supported, armv7-a, needs the > following, > > > > > # mk/machine/armv7a/rte.vars.mk sets it too > > > > > machine_args += '-mfpu=neon' > > > > > else > > > > > - dpdk_conf.set('RTE_CACHE_LINE_SIZE', 128) > > > > > - dpdk_conf.set('RTE_ARCH_ARM64', 1) > > > > > + # aarch64 build > > > > > + if not meson.is_cross_build() > > > > > + if machine == 'generic' > > > > > + # default build > > > > ^^^^^^^^^^^ Generic build? > > > > > > > > > > Already addressed in the next version. > > > > > > > > + impl_config = impl_generic > > > > > + part_number = 'generic' > > > > > + else > > > > > + # native build > > > > > + # The script returns ['Implementer', 'Variant', > > > > > 'Architecture', > > > > > + # 'Primary Part number', 'Revision'] > > > > > + detect_vendor = find_program(join_paths( > > > > > + meson.current_source_dir(), > > > > > 'armv8_machine.py')) > > > > > + cmd = run_command(detect_vendor.path()) > > > > > + if cmd.returncode() == 0 > > > > > + cmd_output = > > > > > cmd.stdout().to_lower().strip().split(' ') > > > > > + endif > > > > > + if arm_force_native_march == true > > > > > + part_number = 'native' > > > > > + else > > > > > + part_number = cmd_output[3] > > > > > + endif > > > > > + # Set to generic implementer if implementer > is not > > > > > found > > > > > + impl_config = get_variable('impl_' + > cmd_output[0], > > > > > 'impl_generic') > > > > > + endif > > > > > + else > > > > > + # cross build > > > > > + impl_id = > meson.get_cross_property('implementer_id', > > > > > 'generic') > > > > > + part_number = > meson.get_cross_property('part_number', > > > > > 'generic') > > > > > + impl_config = get_variable('impl_' + impl_id) > > > > > + endif > > > > > > > > > > - machine = [] > > > > > - cmd_generic = ['generic', '', '', 'default', ''] > > > > > - cmd_output = cmd_generic # Set generic by default > > > > > - machine_args = [] # Clear previous machine args > > > > > - if arm_force_generic_march and not meson.is_cross_build() > > > > > - machine = impl_generic > > > > > - impl_pn = 'default' > > > > > + message('Arm implementer: ' + impl_config[0]) > > > > > + message('Arm part number: ' + part_number) > > > > > + > > > > > + implementer_flags = impl_config[1] > > > > > + part_number_config = impl_config[2] > > > > > + > > > > > + 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 part_number == 'native' > > > > > + # use native machine args > > > > > + part_number_config = [[native_machine_args]] > > > > > elif not meson.is_cross_build() > > > > > - # The script returns ['Implementer', 'Variant', > 'Architecture', > > > > > - # 'Primary Part number', 'Revision'] > > > > > - detect_vendor = find_program(join_paths( > > > > > - meson.current_source_dir(), > > > > > 'armv8_machine.py')) > > > > > - cmd = run_command(detect_vendor.path()) > > > > > - if cmd.returncode() == 0 > > > > > - cmd_output = > cmd.stdout().to_lower().strip().split(' > > > > > ') > > > > > - endif > > > > > - # Set to generic if variable is not found > > > > > - machine = get_variable('impl_' + cmd_output[0], > ['generic']) > > > > > - if machine[0] == 'generic' > > > > > - machine = impl_generic > > > > > - cmd_output = cmd_generic > > > > > - endif > > > > > - impl_pn = cmd_output[3] > > > > > - if arm_force_native_march == true > > > > > - impl_pn = 'native' > > > > > - endif > > > > > + # 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 > > > > > - impl_id = > meson.get_cross_property('implementor_id', > > > > > 'generic') > > > > > - impl_pn = > meson.get_cross_property('implementor_pn', > > > > > 'default') > > > > > - machine = get_variable('impl_' + impl_id) > > > > > + # cross build and part number is not in > part_number_config > > > > > + error('Cross build part number 0@0 not > > > > > found.'.format(part_number)) > > > > > endif > > > > > > > > > > - # Apply Common Defaults. These settings may be > overwritten by > > > > > machine > > > > > - # settings later. > > > > > - foreach flag: flags_common_default > > > > > - if flag.length() > 0 > > > > > - dpdk_conf.set(flag[0], flag[1]) > > > > > + dpdk_flags = flags_common_default + implementer_flags > > > > > + > > > > > + if part_number_config.length() > 1 > > > > > + dpdk_flags += part_number_config[1] > > > > > + endif > > > > > + > > > > > + machine_args = [] # Clear previous machine args > > > > > + foreach flag: part_number_config[0] > > > > > + if cc.has_argument(flag) > > > > > + machine_args += flag > > > > > endif > > > > > endforeach > > > > > > > > > > - message('Implementer : ' + machine[0]) > > > > > - foreach flag: machine[1] > > > > > + foreach flag: dpdk_flags > > > > > if flag.length() > 0 > > > > > dpdk_conf.set(flag[0], flag[1]) > > > > > endif > > > > > endforeach > > > > > - > > > > > - foreach marg: machine[2] > > > > > - if marg[0] == impl_pn > > > > > - foreach flag: marg[1] > > > > > - if cc.has_argument(flag) > > > > > - machine_args += flag > > > > > - endif > > > > > - endforeach > > > > > - # Apply any extra machine specific flags. > > > > > - foreach flag: marg.get(2, flags_default_extra) > > > > > - if flag.length() > 0 > > > > > - dpdk_conf.set(flag[0], > flag[1]) > > > > > - endif > > > > > - endforeach > > > > > - endif > > > > > - endforeach > > > > > endif > > > > > -message(machine_args) > > > > > + > > > > > +message('Using machine args: @0@'.format(machine_args)) > > > > > > > > > > if (cc.get_define('__ARM_NEON', args: machine_args) != '' or > > > > > cc.get_define('__aarch64__', args: machine_args) != '') > > > > > -- > > > > > 2.20.1