[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Minios-devel] [UNIKRAFT PATCHv6 37/37] plat/common: Get arch_timer clock frequency from DT for Arm


  • To: <minios-devel@xxxxxxxxxxxxxxxxxxxx>, <simon.kuenzer@xxxxxxxxx>
  • From: Wei Chen <wei.chen@xxxxxxx>
  • Date: Fri, 14 Sep 2018 07:57:10 +0000
  • Authentication-results: spf=pass (sender IP is 40.67.248.234) smtp.mailfrom=arm.com; lists.xenproject.org; dkim=none (message not signed) header.d=none;lists.xenproject.org; dmarc=bestguesspass action=none header.from=arm.com;
  • Cc: Kaly.Xin@xxxxxxx, nd@xxxxxxx, wei.chen@xxxxxxx
  • Delivery-date: Fri, 14 Sep 2018 07:59:07 +0000
  • List-id: Mini-os development list <minios-devel.lists.xenproject.org>
  • Nodisclaimer: True
  • Spamdiagnosticmetadata: NSPM
  • Spamdiagnosticoutput: 1:99

On a few platforms the frequency is not configured correctly
by the firmware. A property in the DT (clock-frequency) has
been introduced to workaround those firmware. So, we will try
to get clock-frequency from DT first, if failed we will read
the register directly.

Signed-off-by: Wei Chen <wei.chen@xxxxxxx>
---
 plat/common/arm/time.c | 36 +++++++++++++++++++++++++++++++++++-
 1 file changed, 35 insertions(+), 1 deletion(-)

diff --git a/plat/common/arm/time.c b/plat/common/arm/time.c
index 8457511..c309b03 100644
--- a/plat/common/arm/time.c
+++ b/plat/common/arm/time.c
@@ -32,6 +32,7 @@
  * THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY.
  */
 #include <stdlib.h>
+#include <libfdt.h>
 #include <uk/assert.h>
 #include <uk/plat/time.h>
 #include <uk/plat/irq.h>
@@ -40,6 +41,7 @@
 
 static uint64_t boot_ticks;
 static uint32_t counter_freq;
+extern void *_libkvmplat_dtb;
 
 /*
  * Shift factor for counter scaling multiplier; referred to as S in the
@@ -58,8 +60,40 @@ static inline uint64_t ticks_to_ns(uint64_t ticks)
        return (ns_per_tick * ticks) >> counter_shift;
 }
 
-static inline uint32_t get_counter_frequency(void)
+/*
+ * On a few platforms the frequency is not configured correctly
+ * by the firmware. A property in the DT (clock-frequency) has
+ * been introduced to workaround those firmware. So, we will try
+ * to get clock-frequency from DT first, if failed we will read
+ * the register directly.
+ */
+static uint32_t get_counter_frequency(void)
 {
+       int fdt_archtimer, len;
+       const uint64_t *fdt_freq;
+
+       /* Try to find arm,armv8-timer first */
+       fdt_archtimer = fdt_node_offset_by_compatible(_libkvmplat_dtb,
+                                               -1, "arm,armv8-timer");
+       /* If failed, try to find arm,armv7-timer */
+       if (fdt_archtimer < 0)
+               fdt_archtimer = fdt_node_offset_by_compatible(_libkvmplat_dtb,
+                                                       -1, "arm,armv7-timer");
+       /* DT doesn't provide arch timer information */
+       if (fdt_archtimer < 0)
+               goto endnofreq;
+
+       fdt_freq = fdt_getprop(_libkvmplat_dtb,
+                       fdt_archtimer, "clock-frequency", &len);
+       if (!fdt_freq || (len <= 0)) {
+               uk_printd(DLVL_INFO,
+               "No clock-frequency found, reading from register directly.\n");
+               goto endnofreq;
+       }
+
+       return fdt32_to_cpu(fdt_freq[0]);
+
+endnofreq:
        return SYSREG_READ32(cntfrq_el0);
 }
 
-- 
2.17.1


_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.