All ARMv8-A cores implement the 64bit wide generic timer CNTPCT[1], thus we can use it to implement the get_time_ns and is_timeout helpers which in turn enable the whole read_poll_timeout class of functions in the PBL. As it is guaranteed that the timer will not wrap for 40 years no overflow handling is necessary. [1]: See "ARM Architecture Reference Manual for A-profile architecture (rev L.a)", chapter D12 "The Generic Timer in AArch64 state" Signed-off-by: Stefan Kerkmann <s.kerkmann@xxxxxxxxxxxxxx> --- arch/arm/lib64/pbl.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/arch/arm/lib64/pbl.c b/arch/arm/lib64/pbl.c index 78eab33f8d68598554c07f347938cc84608c6716..00b20c5db1bd347ae4c4a3ce9eaa792fec3d07c9 100644 --- a/arch/arm/lib64/pbl.c +++ b/arch/arm/lib64/pbl.c @@ -7,7 +7,7 @@ void udelay(unsigned long us) { unsigned long cntfrq = get_cntfrq(); - unsigned long ticks = (us * cntfrq) / 1000000; + unsigned long ticks = (us * cntfrq) / MSECOND; unsigned long start = get_cntpct(); while ((long)(start + ticks - get_cntpct()) > 0); @@ -15,5 +15,18 @@ void udelay(unsigned long us) void mdelay(unsigned long ms) { - udelay(ms * 1000); + udelay(ms * USECOND); +} + +uint64_t get_time_ns(void) +{ + return get_cntpct() * SECOND / get_cntfrq(); +} + +int is_timeout(uint64_t start, uint64_t time_offset_ns) +{ + if ((int64_t)(start + time_offset_ns - get_time_ns()) < 0) + return 1; + else + return 0; } -- 2.39.5