From patchwork Mon Oct 9 14:00:08 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Github ODP bot X-Patchwork-Id: 115243 Delivered-To: patch@linaro.org Received: by 10.140.22.163 with SMTP id 32csp2594906qgn; Mon, 9 Oct 2017 07:04:14 -0700 (PDT) X-Google-Smtp-Source: AOwi7QDpoXUbRqAZKYyLAHUR5N/p1GAU1TacJnUfN6n6q9DVcX7uAs4wSd7mg3xPT9BYmRebhyDX X-Received: by 10.107.47.147 with SMTP id v19mr895353iov.280.1507557854099; Mon, 09 Oct 2017 07:04:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1507557854; cv=none; d=google.com; s=arc-20160816; b=M5cDmCb488A/6WvMfPo6yEWi8/f5V7etbIO3CCzCRO2loTbpFY4pgDIfcsiJ28IrlA c6CWCv5OV2bdqABMzdpD736WI6CYTBgft/hM8o/U4YpO2HgBo59KB5UWjn7NocwzjmBm 0iisiQlJjA1mf4rxTfcfkgG0DrUQNGpVBsI+w06Km/LJbrwcSt2egZsLA2XXLyVcgqMu pGeE1cdArUv8+LlX1CpGQxz5DASI4v8EV6pMowsdYrTG77fO0SIUp4+l05z1BnS2X4bU cl0UlLUgWcEFphWmyVoFKFvAhL9MSf3zzMNuN+nGG4mcgAgjR+UuBx5rFDPQVB9TMR5e u24g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:subject:github-pr-num :references:in-reply-to:message-id:date:to:from:delivered-to :arc-authentication-results; bh=yLF8o6CYBOAQ+1oc9PBSIj7+tfkRXIIWbVaU1AwrFRs=; b=xNUlPJZmDqJu9WANxpX6tHi5+9THfJrB/2skhS8DwyrT7/yut21cGMa8rpHfQxfXyf F8zOJFNeZBrG2sHl5WqiGZiXzwb8kCSnCOt1n8Z2AgQDpYAsViJdn9+WaB9uFV210lyS EozIC3tN0/4gaSqobxvuTDOx1PtzSeByl5GZoJ8ZuFQDVfmxbpAN+pHcO/LgLYx0BN1j zjeP3N/9JxSsJ0icMH8DSBhh+YHnnmXEj+bdnYPbA4EYIBNmgBW9JhHO60ft1NUytZDV 5ZCT6MSKWjiwuhSb7a3b/ejV4443lbyFImoC5OzyrlxDgjzUN+LSuJfcgy/4OcCShjly kF6A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.225.227.206 as permitted sender) smtp.mailfrom=lng-odp-bounces@lists.linaro.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=yandex.ru Return-Path: Received: from lists.linaro.org (lists.linaro.org. [54.225.227.206]) by mx.google.com with ESMTP id v21si6825158iob.47.2017.10.09.07.04.09; Mon, 09 Oct 2017 07:04:14 -0700 (PDT) Received-SPF: pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.225.227.206 as permitted sender) client-ip=54.225.227.206; Authentication-Results: mx.google.com; spf=pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.225.227.206 as permitted sender) smtp.mailfrom=lng-odp-bounces@lists.linaro.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=yandex.ru Received: by lists.linaro.org (Postfix, from userid 109) id A0EF760BEB; Mon, 9 Oct 2017 14:04:09 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on ip-10-142-244-252 X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00,FREEMAIL_FROM, RCVD_IN_DNSWL_LOW,URIBL_BLOCKED autolearn=disabled version=3.4.0 Received: from [127.0.0.1] (localhost [127.0.0.1]) by lists.linaro.org (Postfix) with ESMTP id 71E3D60B15; Mon, 9 Oct 2017 14:01:09 +0000 (UTC) X-Original-To: lng-odp@lists.linaro.org Delivered-To: lng-odp@lists.linaro.org Received: by lists.linaro.org (Postfix, from userid 109) id 1893160BDC; Mon, 9 Oct 2017 14:00:56 +0000 (UTC) Received: from forward105p.mail.yandex.net (forward105p.mail.yandex.net [77.88.28.108]) by lists.linaro.org (Postfix) with ESMTPS id 25B1960A54 for ; Mon, 9 Oct 2017 14:00:46 +0000 (UTC) Received: from mxback6j.mail.yandex.net (mxback6j.mail.yandex.net [IPv6:2a02:6b8:0:1619::10f]) by forward105p.mail.yandex.net (Yandex) with ESMTP id D158C4082403 for ; Mon, 9 Oct 2017 17:00:44 +0300 (MSK) Received: from smtp4o.mail.yandex.net (smtp4o.mail.yandex.net [2a02:6b8:0:1a2d::28]) by mxback6j.mail.yandex.net (nwsmtp/Yandex) with ESMTP id 0RAEZ3XjWI-0i2SSaWT; Mon, 09 Oct 2017 17:00:44 +0300 Received: by smtp4o.mail.yandex.net (nwsmtp/Yandex) with ESMTPSA id wSTIYzb9Br-0id0whuU; Mon, 09 Oct 2017 17:00:44 +0300 (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (Client certificate not present) From: Github ODP bot To: lng-odp@lists.linaro.org Date: Mon, 9 Oct 2017 17:00:08 +0300 Message-Id: <1507557617-32018-5-git-send-email-odpbot@yandex.ru> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1507557617-32018-1-git-send-email-odpbot@yandex.ru> References: <1507557617-32018-1-git-send-email-odpbot@yandex.ru> Github-pr-num: 188 Subject: [lng-odp] [PATCH v3 4/13] linux-gen: split arm into arm and aarch64 X-BeenThere: lng-odp@lists.linaro.org X-Mailman-Version: 2.1.16 Precedence: list List-Id: "The OpenDataPlane \(ODP\) List" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: lng-odp-bounces@lists.linaro.org Sender: "lng-odp" From: Dmitry Eremin-Solenikov In preparation to arch-file cleanup split ARM architecture into 32-bit ARM and AArch64. Signed-off-by: Dmitry Eremin-Solenikov Reviewed-by: Bill Fischofer Signed-off-by: Maxim Uvarov --- /** Email created from pull request 188 (WonderfulVoid:master) ** https://github.com/Linaro/odp/pull/188 ** Patch: https://github.com/Linaro/odp/pull/188.patch ** Base sha: c16af6486eea240609f334b1bdc81a11404275de ** Merge commit sha: 4ad1d0615a4dcd74d4e9703090149eec1a58d7d2 **/ configure.ac | 3 +- platform/Makefile.inc | 3 + platform/linux-generic/Makefile.am | 7 ++ .../linux-generic/arch/aarch64/odp/api/cpu_arch.h | 30 +++++++ platform/linux-generic/arch/aarch64/odp_cpu_arch.c | 94 ++++++++++++++++++++++ .../linux-generic/arch/aarch64/odp_sysinfo_parse.c | 28 +++++++ platform/linux-generic/arch/arm/odp_cpu_arch.c | 23 ------ 7 files changed, 164 insertions(+), 24 deletions(-) create mode 100644 platform/linux-generic/arch/aarch64/odp/api/cpu_arch.h create mode 100644 platform/linux-generic/arch/aarch64/odp_cpu_arch.c create mode 100644 platform/linux-generic/arch/aarch64/odp_sysinfo_parse.c diff --git a/configure.ac b/configure.ac index f7da75ec4..5bc84a71b 100644 --- a/configure.ac +++ b/configure.ac @@ -109,7 +109,7 @@ AS_CASE([$host], [i686*], [ARCH_DIR=x86], [mips64*], [ARCH_DIR=mips64], [powerpc*], [ARCH_DIR=powerpc], - [aarch64*], [ARCH_DIR=arm], + [aarch64*], [ARCH_DIR=aarch64], [arm*], [ARCH_DIR=arm], [ARCH_DIR=undefined] ) @@ -219,6 +219,7 @@ AM_CONDITIONAL([user_guide], [test "x${user_guides}" = "xyes" ]) AM_CONDITIONAL([HAVE_MSCGEN], [test "x${MSCGEN}" = "xmscgen"]) AM_CONDITIONAL([helper_linux], [test x$helper_linux = xyes ]) AM_CONDITIONAL([ARCH_IS_ARM], [test "x${ARCH_DIR}" = "xarm"]) +AM_CONDITIONAL([ARCH_IS_AARCH64], [test "x${ARCH_DIR}" = "xaarch64"]) AM_CONDITIONAL([ARCH_IS_MIPS64], [test "x${ARCH_DIR}" = "xmips64"]) AM_CONDITIONAL([ARCH_IS_POWERPC], [test "x${ARCH_DIR}" = "xpowerpc"]) AM_CONDITIONAL([ARCH_IS_X86], [test "x${ARCH_DIR}" = "xx86"]) diff --git a/platform/Makefile.inc b/platform/Makefile.inc index f67225603..bb5da187b 100644 --- a/platform/Makefile.inc +++ b/platform/Makefile.inc @@ -86,6 +86,9 @@ EXTRA_DIST = \ arch/arm/odp/api/cpu_arch.h \ arch/arm/odp_cpu_arch.c \ arch/arm/odp_sysinfo_parse.c \ + arch/aarch64/odp/api/cpu_arch.h \ + arch/aarch64/odp_cpu_arch.c \ + arch/aarch64/odp_sysinfo_parse.c \ arch/default/odp/api/cpu_arch.h \ arch/default/odp_cpu_arch.c \ arch/default/odp_sysinfo_parse.c \ diff --git a/platform/linux-generic/Makefile.am b/platform/linux-generic/Makefile.am index f5f65384f..7257a60f5 100644 --- a/platform/linux-generic/Makefile.am +++ b/platform/linux-generic/Makefile.am @@ -71,6 +71,9 @@ odpapiinclude_HEADERS = \ if ARCH_IS_ARM odpapiinclude_HEADERS += $(srcdir)/arch/arm/odp/api/cpu_arch.h endif +if ARCH_IS_AARCH64 +odpapiinclude_HEADERS += $(srcdir)/arch/aarch64/odp/api/cpu_arch.h +endif if ARCH_IS_MIPS64 odpapiinclude_HEADERS += $(srcdir)/arch/mips64/odp/api/cpu_arch.h endif @@ -238,6 +241,10 @@ if ARCH_IS_ARM __LIB__libodp_linux_la_SOURCES += arch/arm/odp_cpu_arch.c \ arch/arm/odp_sysinfo_parse.c endif +if ARCH_IS_AARCH64 +__LIB__libodp_linux_la_SOURCES += arch/aarch64/odp_cpu_arch.c \ + arch/aarch64/odp_sysinfo_parse.c +endif if ARCH_IS_MIPS64 __LIB__libodp_linux_la_SOURCES += arch/mips64/odp_cpu_arch.c \ arch/mips64/odp_sysinfo_parse.c diff --git a/platform/linux-generic/arch/aarch64/odp/api/cpu_arch.h b/platform/linux-generic/arch/aarch64/odp/api/cpu_arch.h new file mode 100644 index 000000000..7c75a690e --- /dev/null +++ b/platform/linux-generic/arch/aarch64/odp/api/cpu_arch.h @@ -0,0 +1,30 @@ +/* Copyright (c) 2016, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef ODP_PLAT_CPU_ARCH_H_ +#define ODP_PLAT_CPU_ARCH_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#define _ODP_CACHE_LINE_SIZE 64 + +static inline void odp_cpu_pause(void) +{ + /* YIELD hints the CPU to switch to another thread if possible + * and executes as a NOP otherwise. + * ISB flushes the pipeline, then restarts. This is guaranteed to + * stall the CPU a number of cycles. + */ + __asm volatile("isb" ::: "memory"); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/platform/linux-generic/arch/aarch64/odp_cpu_arch.c b/platform/linux-generic/arch/aarch64/odp_cpu_arch.c new file mode 100644 index 000000000..b87d1c102 --- /dev/null +++ b/platform/linux-generic/arch/aarch64/odp_cpu_arch.c @@ -0,0 +1,94 @@ +/* Copyright (c) 2015, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "config.h" + +#include + +#include +#include + +#include +#include +#include +#include +#include + +#define GIGA 1000000000 + +uint64_t odp_cpu_cycles(void) +{ + struct timespec time; + uint64_t sec, ns, hz, cycles; + int ret; + + ret = clock_gettime(CLOCK_MONOTONIC_RAW, &time); + + if (ret != 0) + ODP_ABORT("clock_gettime failed\n"); + + hz = odp_cpu_hz_max(); + sec = (uint64_t)time.tv_sec; + ns = (uint64_t)time.tv_nsec; + + cycles = sec * hz; + cycles += (ns * hz) / GIGA; + + return cycles; +} + +uint64_t odp_cpu_cycles_max(void) +{ + return UINT64_MAX; +} + +uint64_t odp_cpu_cycles_resolution(void) +{ + return 1; +} + +int cpu_has_global_time(void) +{ + uint64_t hz = cpu_global_time_freq(); + + /* + * The system counter portion of the architected timer must + * provide a uniform view of system time to all processing + * elements in the system. This should hold true even for + * heterogeneous SoCs. + * + * Determine whether the system has 'global time' by checking + * whether a read of the architected timer frequency sys reg + * returns a sane value. Sane is considered to be within + * 1MHz and 6GHz (1us and .1667ns period). + */ + return hz >= 1000000 && hz <= 6000000000; +} + +uint64_t cpu_global_time(void) +{ + uint64_t cntvct; + + /* + * To be consistent with other architectures, do not issue a + * serializing instruction, e.g. ISB, before reading this + * sys reg. + */ + + /* Memory clobber to minimize optimization around load from sys reg. */ + __asm__ volatile("mrs %0, cntvct_el0" : "=r"(cntvct) : : "memory"); + + return cntvct; +} + +uint64_t cpu_global_time_freq(void) +{ + uint64_t cntfrq; + + __asm__ volatile("mrs %0, cntfrq_el0" : "=r"(cntfrq) : : ); + + return cntfrq; +} diff --git a/platform/linux-generic/arch/aarch64/odp_sysinfo_parse.c b/platform/linux-generic/arch/aarch64/odp_sysinfo_parse.c new file mode 100644 index 000000000..1e2c729a7 --- /dev/null +++ b/platform/linux-generic/arch/aarch64/odp_sysinfo_parse.c @@ -0,0 +1,28 @@ +/* Copyright (c) 2016, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "config.h" + +#include +#include +#include + +int cpuinfo_parser(FILE *file ODP_UNUSED, system_info_t *sysinfo) +{ + int i; + + ODP_DBG("Warning: use dummy values for freq and model string\n"); + for (i = 0; i < MAX_CPU_NUMBER; i++) { + sysinfo->cpu_hz_max[i] = 1400000000; + strcpy(sysinfo->model_str[i], "UNKNOWN"); + } + + return 0; +} + +void sys_info_print_arch(void) +{ +} diff --git a/platform/linux-generic/arch/arm/odp_cpu_arch.c b/platform/linux-generic/arch/arm/odp_cpu_arch.c index 6622e619f..fc49ce371 100644 --- a/platform/linux-generic/arch/arm/odp_cpu_arch.c +++ b/platform/linux-generic/arch/arm/odp_cpu_arch.c @@ -70,33 +70,10 @@ int cpu_has_global_time(void) uint64_t cpu_global_time(void) { -#ifdef __aarch64__ - uint64_t cntvct; - - /* - * To be consistent with other architectures, do not issue a - * serializing instruction, e.g. ISB, before reading this - * sys reg. - */ - - /* Memory clobber to minimize optimization around load from sys reg. */ - __asm__ volatile("mrs %0, cntvct_el0" : "=r"(cntvct) : : "memory"); - - return cntvct; -#else return 0; -#endif } uint64_t cpu_global_time_freq(void) { -#ifdef __aarch64__ - uint64_t cntfrq; - - __asm__ volatile("mrs %0, cntfrq_el0" : "=r"(cntfrq) : : ); - - return cntfrq; -#else return 0; -#endif }