numam-dpdk/config/ppc/meson.build
David Christensen b3fc562453 config/ppc: fix native build with GCC 4.8.5 on RHEL 7
The POWER meson.build file incorrectly checks if the detected CPU is
"greater than" POWER8 when it should actually test for "greater than or
equal to" POWER8.  Fixed the comparison operator.

Bugzilla ID: 875
Fixes: 7501968808 ("config/ppc: select instruction set for IBM Power10")

Signed-off-by: David Christensen <drc@linux.vnet.ibm.com>
2021-11-04 09:12:55 +01:00

126 lines
4.7 KiB
Meson

# SPDX-License-Identifier: BSD-3-Clause
# Copyright(c) 2018 Luca Boccassi <bluca@debian.org>
# Copyright(c) 2021 IBM Corporation
if not dpdk_conf.get('RTE_ARCH_64')
error('Only 64-bit compiles are supported for this platform type')
endif
dpdk_conf.set('RTE_ARCH', 'ppc_64')
dpdk_conf.set('RTE_ARCH_PPC_64', 1)
# RHEL 7.x uses gcc 4.8.X which doesn't generate code for Power 9 CPUs,
# though it will detect a Power 9 CPU when the "-mcpu=native" argument
# is used, resulting in a build failure.
power9_supported = cc.has_argument('-mcpu=power9')
if not power9_supported
cpu_instruction_set = 'power8'
machine_args = ['-mcpu=power8', '-mtune=power8']
dpdk_conf.set('RTE_MACHINE','power8')
endif
# Suppress the gcc warning "note: the layout of aggregates containing
# vectors with 4-byte alignment has changed in GCC 5".
if (cc.get_id() == 'gcc' and cc.version().version_compare('>=10.0') and
cc.version().version_compare('<12.0') and cc.has_argument('-Wno-psabi'))
add_project_arguments('-Wno-psabi', language: 'c')
endif
# If using a generic build, select the lowest common denominator
if platform == 'generic'
cpu_instruction_set = 'power8'
# If using a native build, select the highest cpu_instruction_set supported
# by the build host. (Native is the default platform type set in meson_options.txt.)
# When a cross compile is detected, verify that the compiler/assembler supports
# the requested cpu_instruction_set in the cross-file.
elif platform == 'native'
if meson.is_cross_build()
# cpu_instruction_set specified in cross-compile file as "cpu"
if host_machine.cpu() == 'power10'
test_p10 = '''
#include <stdio.h>
#include <altivec.h>
int main() {
__vector unsigned __int128 t, a, b;
#ifdef _ARCH_PWR10
__asm__("vcmpequq %0,%1,%2;" : "=v" (t) : "v" (a), "v" (b) : );
#else
#error POWER10 not supported
#endif
printf("%d", (int)t[0]);
return 0;
}
'''
if not cc.compiles(test_p10, args : '-mcpu=power10', name: 'Detect P10')
error('POWER10 requested but not supported')
endif
endif
else
# Using a POWER native build host. Assume P8 support, move to later CPUs
# if supported by the build host and the compiler. Detect the CPU used by
# the build host
detect_cpu = '''
#include <stdio.h>
#include <string.h>
#include <sys/auxv.h>
int main() {
char * platform = (char*) getauxval(AT_PLATFORM);
if (platform) {
if (!strncmp(platform,"power",5)) {
printf("%s", platform+5); return 0;
}
}
return 1;
}'''
result = cc.run(detect_cpu, name : 'Detect host CPU type')
if not result.compiled()
error('Failed to detect CPU type')
endif
cpu = result.stdout().to_int()
if cpu < 8
error('Unsupported POWER CPU detected')
else
# Found supported CPU on build host, verify compiler support
mcpu_flag = '-mcpu=power@0@'
if cc.has_argument(mcpu_flag.format(cpu))
# Compiler supports current detected CPU
elif cc.has_argument(mcpu_flag.format(cpu-1))
cpu = cpu-1
elif cc.has_argument(mcpu_flag.format(cpu-2))
cpu = cpu-2
else
error('Compiler does not support POWER@0@ platform'.format(cpu))
endif
if cpu >= 8
cpu_instruction_set = 'power'+cpu.to_string()
else
error('Compiler does not support POWER@0@ platform'.format(cpu))
endif
endif
endif #end if not cross-build
else
# User has explicitly chosen a platform for the build, use that
if cc.has_argument('-mcpu=' + platform)
cpu_instruction_set = platform
else
error('User selected platform ' + platform + ' not supported by compiler')
endif
endif
machine_args = ['-mcpu=' + cpu_instruction_set, '-mtune=' + cpu_instruction_set]
dpdk_conf.set('RTE_MACHINE', cpu_instruction_set)
# Certain POWER9 systems can scale as high as 1536 LCORES, but setting such a
# high value can waste memory, cause timeouts in time limited autotests, and is
# unlikely to be used in many production situations. Similarly, keeping the
# default 64 LCORES seems too small as most POWER9 dual socket systems will have
# at least 128 LCORES available. Set RTE_MAX_LCORE to 128 for POWER systems as
# a compromise.
dpdk_conf.set('RTE_MAX_LCORE', 128)
# POWER systems do not allocate NUMA nodes sequentially. A dual socket system
# will have CPUs associated with NUMA nodes 0 & 8, so ensure that the second
# NUMA node will be supported by setting RTE_MAX_NUMA_NODES to 16. High end
# systems can scale even higher with as many as 32 NUMA nodes.
dpdk_conf.set('RTE_MAX_NUMA_NODES', 16)
dpdk_conf.set('RTE_CACHE_LINE_SIZE', 128)