build: detect micro-arch on ARM
authorPavan Nikhilesh <pbhagavatula@caviumnetworks.com>
Mon, 22 Jan 2018 15:26:30 +0000 (20:56 +0530)
committerBruce Richardson <bruce.richardson@intel.com>
Tue, 30 Jan 2018 20:59:00 +0000 (21:59 +0100)
Added support for detecting march and mcpu by reading midr_el1 register.
The implementer, primary part number values read can be used to figure
out the underlying arm cpu.

Signed-off-by: Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
Acked-by: Jerin Jacob <jerin.jacob@caviumnetworks.com>
app/test-eventdev/meson.build
app/test-pmd/meson.build
config/arm/armv8_machine.py [new file with mode: 0755]
config/arm/meson.build
config/meson.build
drivers/meson.build
examples/meson.build
lib/meson.build
meson.build
test/test/meson.build

index e5be150..7fb3a28 100644 (file)
@@ -21,7 +21,7 @@ endif
 
 executable('dpdk-test-eventdev',
        sources,
-       c_args: [machine_arg, '-DALLOW_EXPERIMENTAL_API'],
+       c_args: [machine_args, '-DALLOW_EXPERIMENTAL_API'],
        link_whole: link_libs,
        dependencies: dep_objs,
        install_rpath: join_paths(get_option('prefix'), driver_install_path),
index 4614e35..9964dae 100644 (file)
@@ -45,7 +45,7 @@ endif
 
 executable('dpdk-testpmd',
        sources,
-       c_args: [machine_arg, '-DALLOW_EXPERIMENTAL_API'],
+       c_args: [machine_args, '-DALLOW_EXPERIMENTAL_API'],
        link_whole: link_libs,
        dependencies: dep_objs,
        install_rpath: join_paths(get_option('prefix'), driver_install_path),
diff --git a/config/arm/armv8_machine.py b/config/arm/armv8_machine.py
new file mode 100755 (executable)
index 0000000..404866d
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/python
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2017 Cavium, Inc
+
+ident = []
+fname = '/sys/devices/system/cpu/cpu0/regs/identification/midr_el1'
+with open(fname) as f:
+    content = f.read()
+
+midr_el1 = (int(content.rstrip('\n'), 16))
+
+ident.append(hex((midr_el1 >> 24) & 0xFF))  # Implementer
+ident.append(hex((midr_el1 >> 20) & 0xF))   # Variant
+ident.append(hex((midr_el1 >> 16) & 0XF))   # Architecture
+ident.append(hex((midr_el1 >> 4) & 0xFFF))  # Primary Part number
+ident.append(hex(midr_el1 & 0xF))           # Revision
+
+print(' '.join(ident))
index f05de4c..a5bfb96 100644 (file)
 # for checking defines we need to use the correct compiler flags
 march_opt = '-march=@0@'.format(machine)
 
-dpdk_conf.set('RTE_FORCE_INTRINSICS', 1)
-if cc.sizeof('void *') == 8
-       dpdk_conf.set('RTE_CACHE_LINE_SIZE', 128)
-       dpdk_conf.set('RTE_ARCH_ARM64', 1)
-       dpdk_conf.set('RTE_ARCH_64', 1)
+machine_args_generic = [
+       ['default', ['-march=armv8-a+crc+crypto']]]
+machine_args_cavium = [
+       ['default', ['-march=armv8-a+crc+crypto','-mcpu=thunderx']],
+       ['0xa1', ['-mcpu=thunderxt88']],
+       ['0xa2', ['-mcpu=thunderxt81']],
+       ['0xa3', ['-mcpu=thunderxt83']]]
+
+flags_generic = [[]]
+flags_cavium = [
+       ['RTE_MACHINE', '"thunderx"'],
+       ['RTE_CACHE_LINE_SIZE', 128],
+       ['RTE_MAX_NUMA_NODES', 2],
+       ['RTE_MAX_LCORE', 96],
+       ['RTE_MAX_VFIO_GROUPS', 128],
+       ['RTE_RING_USE_C11_MEM_MODEL', false]]
+
+impl_generic = ['Generic armv8', flags_generic, machine_args_generic]
+impl_0x43 = ['Cavium', flags_cavium, machine_args_cavium]
+
+if cc.get_define('__clang__') != ''
+       dpdk_conf.set_quoted('RTE_TOOLCHAIN', 'clang')
+       dpdk_conf.set('RTE_TOOLCHAIN_CLANG', 1)
 else
+       dpdk_conf.set_quoted('RTE_TOOLCHAIN', 'gcc')
+       dpdk_conf.set('RTE_TOOLCHAIN_GCC', 1)
+endif
+
+dpdk_conf.set('RTE_FORCE_INTRINSICS', 1)
+
+if cc.sizeof('void *') != 8
        dpdk_conf.set('RTE_CACHE_LINE_SIZE', 64)
        dpdk_conf.set('RTE_ARCH_ARM', 1)
        dpdk_conf.set('RTE_ARCH_ARMv7', 1)
+else
+       dpdk_conf.set('RTE_CACHE_LINE_SIZE', 128)
+       dpdk_conf.set('RTE_ARCH_ARM64', 1)
+       dpdk_conf.set('RTE_ARCH_64', 1)
+
+       machine = []
+       cmd_generic = ['generic', '', '', 'default', '']
+       cmd_output = cmd_generic # Set generic by default
+       machine_args = [] # Clear previous machine args
+       if 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().strip().split(' ')
+               endif
+               # Set to generic if variable is not found
+               machine = get_variable('impl_' + cmd_output[0], 'generic')
+       else
+               impl_id = meson.get_cross_property('implementor_id', 'generic')
+               machine = get_variable('impl_' + impl_id)
+       endif
+
+       if machine == 'generic'
+               machine = impl_generic
+               cmd_output = cmd_generic
+       endif
+
+       message('Implementer : ' + machine[0])
+       foreach flag: machine[1]
+               if flag.length() > 0
+                       dpdk_conf.set(flag[0], flag[1])
+               endif
+       endforeach
+       # Primary part number based mcpu flags are supported
+       # for gcc versions > 7
+       if cc.version().version_compare(
+                       '<7.0') or cmd_output.length() == 0
+               foreach marg: machine[2]
+                       if marg[0] == 'default'
+                               foreach f: marg[1]
+                                       machine_args += f
+                               endforeach
+                       endif
+               endforeach
+       else
+               foreach marg: machine[2]
+                       if marg[0] == cmd_output[3]
+                               foreach f: marg[1]
+                                       machine_args += f
+                               endforeach
+                       endif
+               endforeach
+       endif
 endif
+message(machine_args)
 
-if cc.get_define('__ARM_NEON', args: march_opt) != ''
+if cc.get_define('__ARM_NEON', args: machine_args) != ''
        dpdk_conf.set('RTE_MACHINE_CPUFLAG_NEON', 1)
        compile_time_cpuflags += ['RTE_CPUFLAG_NEON']
 endif
 
-if cc.get_define('__ARM_FEATURE_CRC32', args: march_opt) != ''
+if cc.get_define('__ARM_FEATURE_CRC32', args: machine_args) != ''
        dpdk_conf.set('RTE_MACHINE_CPUFLAG_CRC32', 1)
        compile_time_cpuflags += ['RTE_CPUFLAG_CRC32']
 endif
 
-if cc.get_define('__ARM_FEATURE_CRYPTO', args: march_opt) != ''
+if cc.get_define('__ARM_FEATURE_CRYPTO', args: machine_args) != ''
        dpdk_conf.set('RTE_MACHINE_CPUFLAG_AES', 1)
        dpdk_conf.set('RTE_MACHINE_CPUFLAG_PMULL', 1)
        dpdk_conf.set('RTE_MACHINE_CPUFLAG_SHA1', 1)
index fa55c53..f8c6757 100644 (file)
@@ -8,7 +8,8 @@ else
        machine = get_option('machine')
 endif
 dpdk_conf.set('RTE_MACHINE', machine)
-machine_arg = '-march=' + machine
+machine_args = []
+machine_args += '-march=' + machine
 
 # use pthreads
 add_project_link_arguments('-pthread', language: 'c')
@@ -53,6 +54,14 @@ foreach arg: warning_flags
        endif
 endforeach
 
+# set other values pulled from the build options
+dpdk_conf.set('RTE_MAX_LCORE', get_option('max_lcores'))
+dpdk_conf.set('RTE_MAX_NUMA_NODES', get_option('max_numa_nodes'))
+dpdk_conf.set('RTE_LIBEAL_USE_HPET', get_option('use_hpet'))
+dpdk_conf.set('RTE_EAL_ALLOW_INV_SOCKET_ID', get_option('allow_invalid_socket_id'))
+# values which have defaults which may be overridden
+dpdk_conf.set('RTE_MAX_VFIO_GROUPS', 64)
+
 compile_time_cpuflags = []
 if host_machine.cpu_family().startswith('x86')
        arch_subdir = 'x86'
@@ -65,12 +74,4 @@ dpdk_conf.set('RTE_COMPILE_TIME_CPUFLAGS', ','.join(compile_time_cpuflags))
 # set the install path for the drivers
 dpdk_conf.set_quoted('RTE_EAL_PMD_PATH', eal_pmd_path)
 
-# set other values pulled from the build options
-dpdk_conf.set('RTE_MAX_LCORE', get_option('max_lcores'))
-dpdk_conf.set('RTE_MAX_NUMA_NODES', get_option('max_numa_nodes'))
-dpdk_conf.set('RTE_LIBEAL_USE_HPET', get_option('use_hpet'))
-dpdk_conf.set('RTE_EAL_ALLOW_INV_SOCKET_ID', get_option('allow_invalid_socket_id'))
-# values which have defaults which may be overridden
-dpdk_conf.set('RTE_MAX_VFIO_GROUPS', 64)
-
 install_headers('rte_config.h', subdir: get_option('include_subdir_arch'))
index a771b12..099135b 100644 (file)
@@ -28,7 +28,7 @@ foreach class:driver_classes
                allow_experimental_apis = false
                sources = []
                objs = []
-               cflags = [machine_arg]
+               cflags = machine_args
                includes = [include_directories(drv_path)]
                # set up internal deps. Drivers can append/override as necessary
                deps = std_deps
index cef48fa..5658fbe 100644 (file)
@@ -10,7 +10,7 @@ foreach example: get_option('examples').split(',')
        name = example
        sources = []
        allow_experimental_apis = false
-       cflags = [machine_arg]
+       cflags = machine_args
        ext_deps = []
        includes = [include_directories(example)]
        deps = ['eal', 'mempool', 'net', 'mbuf', 'ethdev', 'cmdline']
index e8302fb..ef61591 100644 (file)
@@ -33,7 +33,7 @@ foreach l:libraries
        sources = []
        headers = []
        includes = []
-       cflags = [machine_arg]
+       cflags = machine_args
        objs = [] # other object files to link against, used e.g. for
                  # instruction-set optimized versions of code
 
index 0ab47b6..0d99313 100644 (file)
@@ -66,5 +66,5 @@ pkg.generate(name: meson.project_name(),
                        ['-Wl,-Bdynamic'] + dpdk_extra_ldflags,
        description: 'The Data Plane Development Kit (DPDK)',
        subdirs: [get_option('include_subdir_arch'), '.'],
-       extra_cflags: ['-include', 'rte_config.h', machine_arg]
+       extra_cflags: ['-include', 'rte_config.h'] + machine_args
 )
index eb4b04a..b8bae5a 100644 (file)
@@ -239,7 +239,7 @@ if get_option('tests')
                test_sources,
                link_whole: link_libs,
                dependencies: test_dep_objs,
-               c_args: [machine_arg, '-DALLOW_EXPERIMENTAL_API'],
+               c_args: [machine_args, '-DALLOW_EXPERIMENTAL_API'],
                install_rpath: driver_install_path,
                install: false)