[v3,5/13] linux-gen: deduplicate arch-specific files

Message ID 1507557617-32018-6-git-send-email-odpbot@yandex.ru
State New
Headers show
Series
  • test: Increase scalability and performance of odp_pktio_perf
Related show

Commit Message

Github ODP bot Oct. 9, 2017, 2 p.m.
From: Dmitry Eremin-Solenikov <dmitry.ereminsolenikov@linaro.org>


Rewrite ARCH-specific files so that there is no significant code
duplication between different arch files and default files set.

Signed-off-by: Dmitry Eremin-Solenikov <dmitry.ereminsolenikov@linaro.org>

Reviewed-by: Bill Fischofer <bill.fischofer@linaro.org>

Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>

---
/** 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
 **/
 platform/Makefile.inc                              | 22 ------
 platform/linux-generic/Makefile.am                 | 46 +++++++------
 .../aarch64/{odp_cpu_arch.c => odp_global_time.c}  | 37 ----------
 .../linux-generic/arch/aarch64/odp_sysinfo_parse.c | 28 --------
 platform/linux-generic/arch/arm/odp_cpu_arch.c     | 79 ----------------------
 .../linux-generic/arch/arm/odp_sysinfo_parse.c     | 28 --------
 platform/linux-generic/arch/default/odp_cpu_arch.c | 28 --------
 .../linux-generic/arch/default/odp_cpu_cycles.c    | 19 ++++++
 .../linux-generic/arch/default/odp_global_time.c   | 33 +++++++++
 platform/linux-generic/arch/mips64/odp_cpu_arch.c  | 25 -------
 platform/linux-generic/arch/powerpc/odp_cpu_arch.c | 25 -------
 .../linux-generic/arch/powerpc/odp_global_time.c   | 15 ++++
 platform/linux-generic/arch/x86/odp_cpu_arch.c     | 72 --------------------
 platform/linux-generic/arch/x86/odp_global_time.c  | 77 +++++++++++++++++++++
 14 files changed, 169 insertions(+), 365 deletions(-)
 rename platform/linux-generic/arch/aarch64/{odp_cpu_arch.c => odp_global_time.c} (68%)
 delete mode 100644 platform/linux-generic/arch/aarch64/odp_sysinfo_parse.c
 delete mode 100644 platform/linux-generic/arch/arm/odp_cpu_arch.c
 delete mode 100644 platform/linux-generic/arch/arm/odp_sysinfo_parse.c
 create mode 100644 platform/linux-generic/arch/default/odp_cpu_cycles.c
 create mode 100644 platform/linux-generic/arch/default/odp_global_time.c
 create mode 100644 platform/linux-generic/arch/powerpc/odp_global_time.c
 create mode 100644 platform/linux-generic/arch/x86/odp_global_time.c

Patch

diff --git a/platform/Makefile.inc b/platform/Makefile.inc
index bb5da187b..f3161abd4 100644
--- a/platform/Makefile.inc
+++ b/platform/Makefile.inc
@@ -81,25 +81,3 @@  odpapiabiarchinclude_HEADERS = \
 	$(top_srcdir)/include/odp/arch/@ARCH_ABI@/odp/api/abi/pool.h \
 	$(top_srcdir)/include/odp/arch/@ARCH_ABI@/odp/api/abi/queue.h \
 	$(top_srcdir)/include/odp/arch/@ARCH_ABI@/odp/api/abi/shared_memory.h
-
-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 \
-	     arch/mips64/odp/api/cpu_arch.h \
-	     arch/mips64/odp_cpu_arch.c \
-	     arch/mips64/odp_sysinfo_parse.c \
-	     arch/powerpc/odp/api/cpu_arch.h \
-	     arch/powerpc/odp_cpu_arch.c \
-	     arch/powerpc/odp_sysinfo_parse.c \
-	     arch/x86/odp/api/cpu_arch.h \
-	     arch/x86/odp_cpu_arch.c \
-	     arch/x86/odp_sysinfo_parse.c \
-	     arch/x86/cpu_flags.c \
-	     arch/x86/cpu_flags.h
diff --git a/platform/linux-generic/Makefile.am b/platform/linux-generic/Makefile.am
index 7257a60f5..0ebb6f76c 100644
--- a/platform/linux-generic/Makefile.am
+++ b/platform/linux-generic/Makefile.am
@@ -68,22 +68,6 @@  odpapiinclude_HEADERS = \
 		  $(srcdir)/include/odp/api/traffic_mngr.h \
 		  $(srcdir)/include/odp/api/version.h
 
-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
-if ARCH_IS_POWERPC
-odpapiinclude_HEADERS += $(srcdir)/arch/powerpc/odp/api/cpu_arch.h
-endif
-if ARCH_IS_X86
-odpapiinclude_HEADERS += $(srcdir)/arch/x86/odp/api/cpu_arch.h
-endif
-
 odpapiplatincludedir= $(includedir)/odp/api/plat
 odpapiplatinclude_HEADERS = \
 		  $(builddir)/include/odp/api/plat/static_inline.h \
@@ -238,27 +222,47 @@  __LIB__libodp_linux_la_SOURCES = \
 			   odp_weak.c
 
 if ARCH_IS_ARM
-__LIB__libodp_linux_la_SOURCES += arch/arm/odp_cpu_arch.c \
-				  arch/arm/odp_sysinfo_parse.c
+__LIB__libodp_linux_la_SOURCES += arch/default/odp_cpu_arch.c \
+				  arch/default/odp_cpu_cycles.c \
+				  arch/default/odp_global_time.c \
+				  arch/default/odp_sysinfo_parse.c
+arch_odp_headers = $(srcdir)/arch/arm/odp/api/cpu_arch.h
 endif
 if ARCH_IS_AARCH64
-__LIB__libodp_linux_la_SOURCES += arch/aarch64/odp_cpu_arch.c \
-				  arch/aarch64/odp_sysinfo_parse.c
+__LIB__libodp_linux_la_SOURCES += arch/default/odp_cpu_arch.c \
+				  arch/default/odp_cpu_cycles.c \
+				  arch/aarch64/odp_global_time.c \
+				  arch/default/odp_sysinfo_parse.c
+arch_odp_headers = $(srcdir)/arch/aarch64/odp/api/cpu_arch.h
 endif
 if ARCH_IS_MIPS64
 __LIB__libodp_linux_la_SOURCES += arch/mips64/odp_cpu_arch.c \
+				  arch/default/odp_cpu_cycles.c \
+				  arch/default/odp_global_time.c \
 				  arch/mips64/odp_sysinfo_parse.c
+arch_odp_headers = $(srcdir)/arch/mips64/odp/api/cpu_arch.h
 endif
 if ARCH_IS_POWERPC
-__LIB__libodp_linux_la_SOURCES += arch/powerpc/odp_cpu_arch.c \
+__LIB__libodp_linux_la_SOURCES += arch/default/odp_cpu_arch.c \
+				  arch/default/odp_cpu_cycles.c \
+				  arch/default/odp_global_time.c \
 				  arch/powerpc/odp_sysinfo_parse.c
+arch_odp_headers = $(srcdir)/arch/powerpc/odp/api/cpu_arch.h
 endif
 if ARCH_IS_X86
 __LIB__libodp_linux_la_SOURCES += arch/x86/cpu_flags.c \
 				  arch/x86/odp_cpu_arch.c \
+				  arch/default/odp_cpu_cycles.c \
+				  arch/x86/odp_global_time.c \
 				  arch/x86/odp_sysinfo_parse.c
+arch_odp_headers = $(srcdir)/arch/x86/odp/api/cpu_arch.h
+noinst_HEADERS += $(srcdir)/arch/x86/cpu_flags.h
 endif
 
+noinst_HEADERS += $(srcdir)/arch/default/odp/api/cpu_arch.h
+
+odpapiinclude_HEADERS += $(arch_odp_headers)
+
 if HAVE_PCAP
 __LIB__libodp_linux_la_SOURCES += pktio/pcap.c
 endif
diff --git a/platform/linux-generic/arch/aarch64/odp_cpu_arch.c b/platform/linux-generic/arch/aarch64/odp_global_time.c
similarity index 68%
rename from platform/linux-generic/arch/aarch64/odp_cpu_arch.c
rename to platform/linux-generic/arch/aarch64/odp_global_time.c
index b87d1c102..97444f7e9 100644
--- a/platform/linux-generic/arch/aarch64/odp_cpu_arch.c
+++ b/platform/linux-generic/arch/aarch64/odp_global_time.c
@@ -8,48 +8,11 @@ 
 
 #include <odp_posix_extensions.h>
 
-#include <stdlib.h>
 #include <time.h>
 
-#include <odp/api/cpu.h>
-#include <odp/api/hints.h>
-#include <odp/api/system_info.h>
 #include <odp_debug_internal.h>
 #include <odp_time_internal.h>
 
-#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();
diff --git a/platform/linux-generic/arch/aarch64/odp_sysinfo_parse.c b/platform/linux-generic/arch/aarch64/odp_sysinfo_parse.c
deleted file mode 100644
index 1e2c729a7..000000000
--- a/platform/linux-generic/arch/aarch64/odp_sysinfo_parse.c
+++ /dev/null
@@ -1,28 +0,0 @@ 
-/* Copyright (c) 2016, Linaro Limited
- * All rights reserved.
- *
- * SPDX-License-Identifier:     BSD-3-Clause
- */
-
-#include "config.h"
-
-#include <odp_internal.h>
-#include <odp_debug_internal.h>
-#include <string.h>
-
-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
deleted file mode 100644
index fc49ce371..000000000
--- a/platform/linux-generic/arch/arm/odp_cpu_arch.c
+++ /dev/null
@@ -1,79 +0,0 @@ 
-/* Copyright (c) 2015, Linaro Limited
- * All rights reserved.
- *
- * SPDX-License-Identifier:     BSD-3-Clause
- */
-
-#include "config.h"
-
-#include <odp_posix_extensions.h>
-
-#include <stdlib.h>
-#include <time.h>
-
-#include <odp/api/cpu.h>
-#include <odp/api/hints.h>
-#include <odp/api/system_info.h>
-#include <odp_debug_internal.h>
-#include <odp_time_internal.h>
-
-#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)
-{
-	return 0;
-}
-
-uint64_t cpu_global_time_freq(void)
-{
-	return 0;
-}
diff --git a/platform/linux-generic/arch/arm/odp_sysinfo_parse.c b/platform/linux-generic/arch/arm/odp_sysinfo_parse.c
deleted file mode 100644
index 1e2c729a7..000000000
--- a/platform/linux-generic/arch/arm/odp_sysinfo_parse.c
+++ /dev/null
@@ -1,28 +0,0 @@ 
-/* Copyright (c) 2016, Linaro Limited
- * All rights reserved.
- *
- * SPDX-License-Identifier:     BSD-3-Clause
- */
-
-#include "config.h"
-
-#include <odp_internal.h>
-#include <odp_debug_internal.h>
-#include <string.h>
-
-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/default/odp_cpu_arch.c b/platform/linux-generic/arch/default/odp_cpu_arch.c
index fab351feb..8a8da7445 100644
--- a/platform/linux-generic/arch/default/odp_cpu_arch.c
+++ b/platform/linux-generic/arch/default/odp_cpu_arch.c
@@ -12,10 +12,7 @@ 
 #include <time.h>
 
 #include <odp/api/cpu.h>
-#include <odp/api/hints.h>
-#include <odp/api/system_info.h>
 #include <odp_debug_internal.h>
-#include <odp_time_internal.h>
 
 #define GIGA 1000000000
 
@@ -39,28 +36,3 @@  uint64_t odp_cpu_cycles(void)
 
 	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)
-{
-	return 0;
-}
-
-uint64_t cpu_global_time(void)
-{
-	return 0;
-}
-
-uint64_t cpu_global_time_freq(void)
-{
-	return 0;
-}
diff --git a/platform/linux-generic/arch/default/odp_cpu_cycles.c b/platform/linux-generic/arch/default/odp_cpu_cycles.c
new file mode 100644
index 000000000..ccc588825
--- /dev/null
+++ b/platform/linux-generic/arch/default/odp_cpu_cycles.c
@@ -0,0 +1,19 @@ 
+/* Copyright (c) 2015, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+#include "config.h"
+
+#include <odp/api/cpu.h>
+
+uint64_t odp_cpu_cycles_max(void)
+{
+	return UINT64_MAX;
+}
+
+uint64_t odp_cpu_cycles_resolution(void)
+{
+	return 1;
+}
diff --git a/platform/linux-generic/arch/default/odp_global_time.c b/platform/linux-generic/arch/default/odp_global_time.c
new file mode 100644
index 000000000..89cce1cfb
--- /dev/null
+++ b/platform/linux-generic/arch/default/odp_global_time.c
@@ -0,0 +1,33 @@ 
+/* Copyright (c) 2015, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+#include "config.h"
+
+#include <odp_posix_extensions.h>
+
+#include <stdlib.h>
+#include <time.h>
+
+#include <odp/api/cpu.h>
+#include <odp/api/hints.h>
+#include <odp/api/system_info.h>
+#include <odp_debug_internal.h>
+#include <odp_time_internal.h>
+
+int cpu_has_global_time(void)
+{
+	return 0;
+}
+
+uint64_t cpu_global_time(void)
+{
+	return 0;
+}
+
+uint64_t cpu_global_time_freq(void)
+{
+	return 0;
+}
diff --git a/platform/linux-generic/arch/mips64/odp_cpu_arch.c b/platform/linux-generic/arch/mips64/odp_cpu_arch.c
index 143867ea0..620a01044 100644
--- a/platform/linux-generic/arch/mips64/odp_cpu_arch.c
+++ b/platform/linux-generic/arch/mips64/odp_cpu_arch.c
@@ -22,28 +22,3 @@  uint64_t odp_cpu_cycles(void)
 
 	return cycle;
 }
-
-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)
-{
-	return 0;
-}
-
-uint64_t cpu_global_time(void)
-{
-	return 0;
-}
-
-uint64_t cpu_global_time_freq(void)
-{
-	return 0;
-}
diff --git a/platform/linux-generic/arch/powerpc/odp_cpu_arch.c b/platform/linux-generic/arch/powerpc/odp_cpu_arch.c
index fab351feb..6a16f13a2 100644
--- a/platform/linux-generic/arch/powerpc/odp_cpu_arch.c
+++ b/platform/linux-generic/arch/powerpc/odp_cpu_arch.c
@@ -39,28 +39,3 @@  uint64_t odp_cpu_cycles(void)
 
 	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)
-{
-	return 0;
-}
-
-uint64_t cpu_global_time(void)
-{
-	return 0;
-}
-
-uint64_t cpu_global_time_freq(void)
-{
-	return 0;
-}
diff --git a/platform/linux-generic/arch/powerpc/odp_global_time.c b/platform/linux-generic/arch/powerpc/odp_global_time.c
new file mode 100644
index 000000000..d54ba6bc8
--- /dev/null
+++ b/platform/linux-generic/arch/powerpc/odp_global_time.c
@@ -0,0 +1,15 @@ 
+
+int cpu_has_global_time(void)
+{
+	return 0;
+}
+
+uint64_t cpu_global_time(void)
+{
+	return 0;
+}
+
+uint64_t cpu_global_time_freq(void)
+{
+	return 0;
+}
diff --git a/platform/linux-generic/arch/x86/odp_cpu_arch.c b/platform/linux-generic/arch/x86/odp_cpu_arch.c
index 50fbbac66..a20d91734 100644
--- a/platform/linux-generic/arch/x86/odp_cpu_arch.c
+++ b/platform/linux-generic/arch/x86/odp_cpu_arch.c
@@ -9,7 +9,6 @@ 
 #include <odp_posix_extensions.h>
 
 #include <odp/api/cpu.h>
-#include <odp_time_internal.h>
 #include <odp_debug_internal.h>
 
 #include <time.h>
@@ -30,74 +29,3 @@  uint64_t odp_cpu_cycles(void)
 
 	return tsc.tsc_64;
 }
-
-uint64_t odp_cpu_cycles_max(void)
-{
-	return UINT64_MAX;
-}
-
-uint64_t odp_cpu_cycles_resolution(void)
-{
-	return 1;
-}
-
-uint64_t cpu_global_time(void)
-{
-	return odp_cpu_cycles();
-}
-
-#define SEC_IN_NS 1000000000ULL
-
-/* Measure TSC frequency. Frequency information registers are defined for x86,
- * but those are often not enumerated. */
-uint64_t cpu_global_time_freq(void)
-{
-	struct timespec sleep, ts1, ts2;
-	uint64_t t1, t2, ts_nsec, cycles, hz;
-	int i;
-	uint64_t avg = 0;
-	int rounds = 3;
-	int warm_up = 1;
-
-	for (i = 0; i < rounds; i++) {
-		sleep.tv_sec = 0;
-
-		if (warm_up)
-			sleep.tv_nsec = SEC_IN_NS / 1000;
-		else
-			sleep.tv_nsec = SEC_IN_NS / 4;
-
-		if (clock_gettime(CLOCK_MONOTONIC_RAW, &ts1)) {
-			ODP_DBG("clock_gettime failed\n");
-			return 0;
-		}
-
-		t1 = cpu_global_time();
-
-		if (nanosleep(&sleep, NULL) < 0) {
-			ODP_DBG("nanosleep failed\n");
-			return 0;
-		}
-
-		if (clock_gettime(CLOCK_MONOTONIC_RAW, &ts2)) {
-			ODP_DBG("clock_gettime failed\n");
-			return 0;
-		}
-
-		t2 = cpu_global_time();
-
-		ts_nsec  = (ts2.tv_sec - ts1.tv_sec) * SEC_IN_NS;
-		ts_nsec += ts2.tv_nsec - ts1.tv_nsec;
-
-		cycles = t2 - t1;
-
-		hz = (cycles * SEC_IN_NS) / ts_nsec;
-
-		if (warm_up)
-			warm_up = 0;
-		else
-			avg += hz;
-	}
-
-	return avg / (rounds - 1);
-}
diff --git a/platform/linux-generic/arch/x86/odp_global_time.c b/platform/linux-generic/arch/x86/odp_global_time.c
new file mode 100644
index 000000000..3ed243cc6
--- /dev/null
+++ b/platform/linux-generic/arch/x86/odp_global_time.c
@@ -0,0 +1,77 @@ 
+/* Copyright (c) 2015, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+#include "config.h"
+
+#include <odp_posix_extensions.h>
+
+#include <time.h>
+
+#include <odp/api/cpu.h>
+#include <odp/api/hints.h>
+#include <odp_debug_internal.h>
+#include <odp_time_internal.h>
+
+uint64_t cpu_global_time(void)
+{
+	return odp_cpu_cycles();
+}
+
+#define SEC_IN_NS 1000000000ULL
+
+/* Measure TSC frequency. Frequency information registers are defined for x86,
+ * but those are often not enumerated. */
+uint64_t cpu_global_time_freq(void)
+{
+	struct timespec sleep, ts1, ts2;
+	uint64_t t1, t2, ts_nsec, cycles, hz;
+	int i;
+	uint64_t avg = 0;
+	int rounds = 3;
+	int warm_up = 1;
+
+	for (i = 0; i < rounds; i++) {
+		sleep.tv_sec = 0;
+
+		if (warm_up)
+			sleep.tv_nsec = SEC_IN_NS / 1000;
+		else
+			sleep.tv_nsec = SEC_IN_NS / 4;
+
+		if (clock_gettime(CLOCK_MONOTONIC_RAW, &ts1)) {
+			ODP_DBG("clock_gettime failed\n");
+			return 0;
+		}
+
+		t1 = cpu_global_time();
+
+		if (nanosleep(&sleep, NULL) < 0) {
+			ODP_DBG("nanosleep failed\n");
+			return 0;
+		}
+
+		if (clock_gettime(CLOCK_MONOTONIC_RAW, &ts2)) {
+			ODP_DBG("clock_gettime failed\n");
+			return 0;
+		}
+
+		t2 = cpu_global_time();
+
+		ts_nsec  = (ts2.tv_sec - ts1.tv_sec) * SEC_IN_NS;
+		ts_nsec += ts2.tv_nsec - ts1.tv_nsec;
+
+		cycles = t2 - t1;
+
+		hz = (cycles * SEC_IN_NS) / ts_nsec;
+
+		if (warm_up)
+			warm_up = 0;
+		else
+			avg += hz;
+	}
+
+	return avg / (rounds - 1);
+}