From patchwork Mon Sep 18 13: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: 112918 Delivered-To: patch@linaro.org Received: by 10.140.106.117 with SMTP id d108csp3637569qgf; Mon, 18 Sep 2017 06:02:37 -0700 (PDT) X-Google-Smtp-Source: AOwi7QBcxRQr2ZUObywv5SMCJNu3/Jvil4nqWFim/E+KkKZMDqFx1I38gTKJJMEnqUs30naUAntz X-Received: by 10.55.113.70 with SMTP id m67mr10051914qkc.187.1505739756859; Mon, 18 Sep 2017 06:02:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1505739756; cv=none; d=google.com; s=arc-20160816; b=d3I6yYmNbZF3VRiCKuEFDJpLJW6E751B/rPp7hdeYpUkGwwYvEXuL+y813yKUpfjkC Q0fMe81dQptI2RrYQQUYxGrdky5aF5dVcNwY0wgFqPI9WGxVY7Mp9aO19fndkvgmK9oi xF4dgRonLp9OsQENigyqm972tB2b7hBPPodFu2SQNX09wMO/zNJ2GjTSjSWbGrwnYAbP d/YTh0kVT/RY+xpMuuyY7pfv9OK4uQKKdGTZRu3Omf7lqfuFp43vqtCDKWscqMbbTpDT jR+wfLOCjrW9Y4s+COTzKCwRDw68ovEa7A46u0UCEZysU5Frav4ua/mA0Ky9BiDaZSqe CauQ== 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=l8jdoA4Wh/bkC/+7VCtkAE021UJOCsp8frTlwC4p+g0=; b=dyOMeGdU3l9EjstNHhhsGYigle5qcWm7Uv7MHsXrJEbl6MIjMsJPaEQttQjgNIYoBR iwEElisD9gWUJSiEHp7I9XfD9mvx/RUPJwJZ/zNfPeDgE/Y5ULoMexrYgaJvAKQA0Cw3 68Ub42dNi1c/QngLvU/xgw27q8GzBaVSsh86u5B2vOpk7WCsAskYoeihwoFHMJadgvMB OVtIZhlTmlwLJzObrNST1bHjpeOhuM46+nEWlNO0ESQV70szb41vW15eFCcWCXpAO/Ez KG6e6o/loTnk3BeuGbx8U61466/8pBlUiizUnxHJFnzkFPxVaqjp1rn0zRB91RN8Zr8r OWJQ== 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 o132si6387152qka.426.2017.09.18.06.02.36; Mon, 18 Sep 2017 06:02:36 -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 6951360D45; Mon, 18 Sep 2017 13:02:36 +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 744F460D58; Mon, 18 Sep 2017 13:00:46 +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 6F0A260D3E; Mon, 18 Sep 2017 13:00:34 +0000 (UTC) Received: from forward106p.mail.yandex.net (forward106p.mail.yandex.net [77.88.28.109]) by lists.linaro.org (Postfix) with ESMTPS id AD2AA60D43 for ; Mon, 18 Sep 2017 13:00:24 +0000 (UTC) Received: from mxback8j.mail.yandex.net (mxback8j.mail.yandex.net [IPv6:2a02:6b8:0:1619::111]) by forward106p.mail.yandex.net (Yandex) with ESMTP id 5D1332D831D0 for ; Mon, 18 Sep 2017 16:00:23 +0300 (MSK) Received: from smtp1p.mail.yandex.net (smtp1p.mail.yandex.net [2a02:6b8:0:1472:2741:0:8b6:6]) by mxback8j.mail.yandex.net (nwsmtp/Yandex) with ESMTP id 0KvZ6mYE5N-0N60UvKH; Mon, 18 Sep 2017 16:00:23 +0300 Received: by smtp1p.mail.yandex.net (nwsmtp/Yandex) with ESMTPSA id WiH8IrUPsa-0MLWVjQt; Mon, 18 Sep 2017 16:00:22 +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, 18 Sep 2017 16:00:08 +0300 Message-Id: <1505739611-19678-2-git-send-email-odpbot@yandex.ru> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1505739611-19678-1-git-send-email-odpbot@yandex.ru> References: <1505739611-19678-1-git-send-email-odpbot@yandex.ru> Github-pr-num: 163 Subject: [lng-odp] [PATCH v5 1/4] 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 --- /** Email created from pull request 163 (lumag:improve-build-4) ** https://github.com/Linaro/odp/pull/163 ** Patch: https://github.com/Linaro/odp/pull/163.patch ** Base sha: e1c46f8e296a730ed27141a33189185bb7dfd1b1 ** Merge commit sha: a232c0012683b33d1a12d67ce30127ac78ba57e0 **/ 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 4af2c7c72..99bee092f 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] ) @@ -220,6 +220,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 }