public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
* [U-Boot] [PATCH] armv8: define get_ticks() for the ARMv8 Generic Timer
@ 2016-11-03  0:56 Andre Przywara
  2016-11-07  1:14 ` [U-Boot] " Tom Rini
  0 siblings, 1 reply; 2+ messages in thread
From: Andre Przywara @ 2016-11-03  0:56 UTC (permalink / raw)
  To: u-boot

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 | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/arch/arm/cpu/armv8/generic_timer.c b/arch/arm/cpu/armv8/generic_timer.c
index 8f47a82..cd92b2c 100644
--- a/arch/arm/cpu/armv8/generic_timer.c
+++ b/arch/arm/cpu/armv8/generic_timer.c
@@ -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;
-- 
2.8.2

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* [U-Boot] armv8: define get_ticks() for the ARMv8 Generic Timer
  2016-11-03  0:56 [U-Boot] [PATCH] armv8: define get_ticks() for the ARMv8 Generic Timer Andre Przywara
@ 2016-11-07  1:14 ` Tom Rini
  0 siblings, 0 replies; 2+ messages in thread
From: Tom Rini @ 2016-11-07  1:14 UTC (permalink / raw)
  To: u-boot

On Thu, Nov 03, 2016 at 12:56:25AM +0000, Andre Przywara wrote:

> 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>

Applied to u-boot/master, thanks!

-- 
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20161106/a06bc697/attachment.sig>

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2016-11-07  1:14 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-11-03  0:56 [U-Boot] [PATCH] armv8: define get_ticks() for the ARMv8 Generic Timer Andre Przywara
2016-11-07  1:14 ` [U-Boot] " Tom Rini

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox