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 <pbhagavat...@caviumnetworks.com> --- The current method used for reading MIDR_EL1 form userspace might not be reliable and can be easily modified by updating config/arm/machine.py. More info on midr_el1 can be found at http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0500g/BABFEABI.html This patch depends on http://dpdk.org/dev/patchwork/patch/32410/ config/arm/machine.py | 18 ++++++++++++++++++ config/arm/meson.build | 20 ++++++++++++++++++++ config/meson.build | 3 ++- drivers/meson.build | 2 +- examples/meson.build | 2 +- lib/meson.build | 2 +- meson.build | 2 +- 7 files changed, 44 insertions(+), 5 deletions(-) create mode 100755 config/arm/machine.py diff --git a/config/arm/machine.py b/config/arm/machine.py new file mode 100755 index 000000000..3c6e7b6a7 --- /dev/null +++ b/config/arm/machine.py @@ -0,0 +1,18 @@ +#!/usr/bin/python +import pprint +pp = pprint + +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)) diff --git a/config/arm/meson.build b/config/arm/meson.build index 250958415..f6ae69c21 100644 --- a/config/arm/meson.build +++ b/config/arm/meson.build @@ -41,3 +41,23 @@ else endif dpdk_conf.set('RTE_CACHE_LINE_SIZE', 128) dpdk_conf.set('RTE_FORCE_INTRINSICS', 1) + +detect_vendor = find_program(join_paths(meson.current_source_dir(), + 'machine.py')) +cmd = run_command(detect_vendor.path()) +if cmd.returncode() != 0 + message('Unable to read midr_el1') +else + cmd_output = cmd.stdout().strip().split(' ') + message('midr_el1 output: \n' + 'Implementor ' + cmd_output[0] + + ' Variant ' + cmd_output[1] + ' Architecture ' + + cmd_output[2] + ' Primary Part number ' + cmd_output[3] + + ' Revision ' + cmd_output[4]) + if cmd_output[0] == '0x43' + message('Implementor : Cavium') + dpdk_conf.set('RTE_MACHINE', 'thunderx') + machine_arg = [] + machine_arg += '-march=' + 'armv8-a+crc+crypto' + machine_arg += '-mcpu=' + 'thunderx' + endif +endif diff --git a/config/meson.build b/config/meson.build index 86e978fb1..fe8104676 100644 --- a/config/meson.build +++ b/config/meson.build @@ -8,7 +8,8 @@ else machine = get_option('machine') endif dpdk_conf.set('RTE_MACHINE', machine) -machine_arg = '-march=' + machine +machine_arg = [] +machine_arg += '-march=' + machine # use pthreads add_project_link_arguments('-pthread', language: 'c') diff --git a/drivers/meson.build b/drivers/meson.build index 9b5039847..f5009aa2e 100644 --- a/drivers/meson.build +++ b/drivers/meson.build @@ -22,7 +22,7 @@ foreach class:driver_classes version = 1 sources = [] objs = [] - cflags = [machine_arg] + cflags = machine_arg includes = [include_directories(drv_path)] # set up internal deps. Drivers can append/override as necessary deps = std_deps diff --git a/examples/meson.build b/examples/meson.build index 0abed7169..88df650cf 100644 --- a/examples/meson.build +++ b/examples/meson.build @@ -9,7 +9,7 @@ endif foreach example: get_option('examples').split(',') name = example sources = [] - cflags = [machine_arg] + cflags = machine_arg ext_deps = [] includes = [include_directories(example)] deps = ['eal', 'mempool', 'net', 'mbuf', 'ethdev', 'cmdline'] diff --git a/lib/meson.build b/lib/meson.build index 0c94d74b9..3c98efa70 100644 --- a/lib/meson.build +++ b/lib/meson.build @@ -31,7 +31,7 @@ foreach l:libraries sources = [] headers = [] includes = [] - cflags = [machine_arg] + cflags = machine_arg objs = [] # other object files to link against, used e.g. for # instruction-set optimized versions of code diff --git a/meson.build b/meson.build index 3dce8579e..493bcc313 100644 --- a/meson.build +++ b/meson.build @@ -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_arg ) -- 2.15.1