]> git.ipfire.org Git - people/ms/u-boot.git/blobdiff - arch/arm/cpu/armv8/generic_timer.c
armv8: define get_ticks() for the ARMv8 Generic Timer
[people/ms/u-boot.git] / arch / arm / cpu / armv8 / generic_timer.c
index 223b95e210edd7146c6a8549bbf7f43b362d105b..cd92b2c7617dcc1f4fb7531a08b9eb19d63ca008 100644 (file)
@@ -9,6 +9,8 @@
 #include <command.h>
 #include <asm/system.h>
 
+DECLARE_GLOBAL_DATA_PTR;
+
 /*
  * Generic timer implementation of get_tbclk()
  */
@@ -25,7 +27,38 @@ unsigned long get_tbclk(void)
 unsigned long timer_read_counter(void)
 {
        unsigned long cntpct;
+#ifdef CONFIG_SYS_FSL_ERRATUM_A008585
+       /* This erratum number needs to be confirmed to match ARM document */
+       unsigned long temp;
+#endif
        isb();
        asm volatile("mrs %0, cntpct_el0" : "=r" (cntpct));
+#ifdef CONFIG_SYS_FSL_ERRATUM_A008585
+       asm volatile("mrs %0, cntpct_el0" : "=r" (temp));
+       while (temp != cntpct) {
+               asm volatile("mrs %0, cntpct_el0" : "=r" (cntpct));
+               asm volatile("mrs %0, cntpct_el0" : "=r" (temp));
+       }
+#endif
        return cntpct;
 }
+
+unsigned long long get_ticks(void)
+{
+       unsigned long ticks = timer_read_counter();
+
+       gd->arch.tbl = ticks;
+
+       return ticks;
+}
+
+unsigned long usec2ticks(unsigned long usec)
+{
+       ulong ticks;
+       if (usec < 1000)
+               ticks = ((usec * (get_tbclk()/1000)) + 500) / 1000;
+       else
+               ticks = ((usec / 10) * (get_tbclk() / 100000));
+
+       return ticks;
+}