armv8: define get_ticks() for the ARMv8 Generic Timer
authorAndre Przywara <andre.przywara@arm.com>
Thu, 3 Nov 2016 00:56:25 +0000 (00:56 +0000)
committerTom Rini <trini@konsulko.com>
Sat, 5 Nov 2016 11:27:45 +0000 (07:27 -0400)
For 64-bit ARM systems we provide just a timer_read_counter()
implementation and rely on the generic non-uclass get_ticks() function
in lib/time.c to call the former.
However this function is actually not 64-bit safe, as it assumes a
"long" to be 32-bit. Beside the fact that the resulting uint64_t
isn't bigger than "long" on 64-bit architectures and thus combining two
counters makes no sense, we get all kind of weird results when we try
to OR in the high value shifted by _32_ bits.
So let's avoid that function at all and provide a straight forward
get_ticks() implementation for ARMv8, which also is in line with ARMv7.

This fixes occasional immediate time-out expiration issues I see on the
Pine64 board. The root cause of this needs to be investigated, but this
fix looks like the right thing anyway.

Signed-off-by: Andre Przywara <andre.przywara@arm.com>
arch/arm/cpu/armv8/generic_timer.c

index 8f47a82043b00519100bb4e600edc23c47ac8d90..cd92b2c7617dcc1f4fb7531a08b9eb19d63ca008 100644 (file)
@@ -9,6 +9,8 @@
 #include <command.h>
 #include <asm/system.h>
 
+DECLARE_GLOBAL_DATA_PTR;
+
 /*
  * Generic timer implementation of get_tbclk()
  */
@@ -41,6 +43,15 @@ unsigned long timer_read_counter(void)
        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;