xref: /rk3399_rockchip-uboot/arch/arm/cpu/armv8/generic_timer.c (revision b644d3e932f133bbb8b577c1965eae399b7df99e)
10ae76531SDavid Feng /*
20ae76531SDavid Feng  * (C) Copyright 2013
30ae76531SDavid Feng  * David Feng <fenghua@phytium.com.cn>
40ae76531SDavid Feng  *
50ae76531SDavid Feng  * SPDX-License-Identifier:	GPL-2.0+
60ae76531SDavid Feng  */
70ae76531SDavid Feng 
80ae76531SDavid Feng #include <common.h>
90ae76531SDavid Feng #include <command.h>
100ae76531SDavid Feng #include <asm/system.h>
110ae76531SDavid Feng 
120ae76531SDavid Feng /*
130ae76531SDavid Feng  * Generic timer implementation of get_tbclk()
140ae76531SDavid Feng  */
150ae76531SDavid Feng unsigned long get_tbclk(void)
160ae76531SDavid Feng {
170ae76531SDavid Feng 	unsigned long cntfrq;
180ae76531SDavid Feng 	asm volatile("mrs %0, cntfrq_el0" : "=r" (cntfrq));
190ae76531SDavid Feng 	return cntfrq;
200ae76531SDavid Feng }
210ae76531SDavid Feng 
220ae76531SDavid Feng /*
230ae76531SDavid Feng  * Generic timer implementation of timer_read_counter()
240ae76531SDavid Feng  */
250ae76531SDavid Feng unsigned long timer_read_counter(void)
260ae76531SDavid Feng {
270ae76531SDavid Feng 	unsigned long cntpct;
28060ef094SYork Sun #ifdef CONFIG_SYS_FSL_ERRATUM_A008585
29060ef094SYork Sun 	/* This erratum number needs to be confirmed to match ARM document */
30060ef094SYork Sun 	unsigned long temp;
31060ef094SYork Sun #endif
320ae76531SDavid Feng 	isb();
330ae76531SDavid Feng 	asm volatile("mrs %0, cntpct_el0" : "=r" (cntpct));
34060ef094SYork Sun #ifdef CONFIG_SYS_FSL_ERRATUM_A008585
35060ef094SYork Sun 	asm volatile("mrs %0, cntpct_el0" : "=r" (temp));
36060ef094SYork Sun 	while (temp != cntpct) {
37060ef094SYork Sun 		asm volatile("mrs %0, cntpct_el0" : "=r" (cntpct));
38060ef094SYork Sun 		asm volatile("mrs %0, cntpct_el0" : "=r" (temp));
39060ef094SYork Sun 	}
40060ef094SYork Sun #endif
410ae76531SDavid Feng 	return cntpct;
420ae76531SDavid Feng }
43*b644d3e9SAneesh Bansal 
44*b644d3e9SAneesh Bansal unsigned long usec2ticks(unsigned long usec)
45*b644d3e9SAneesh Bansal {
46*b644d3e9SAneesh Bansal 	ulong ticks;
47*b644d3e9SAneesh Bansal 	if (usec < 1000)
48*b644d3e9SAneesh Bansal 		ticks = ((usec * (get_tbclk()/1000)) + 500) / 1000;
49*b644d3e9SAneesh Bansal 	else
50*b644d3e9SAneesh Bansal 		ticks = ((usec / 10) * (get_tbclk() / 100000));
51*b644d3e9SAneesh Bansal 
52*b644d3e9SAneesh Bansal 	return ticks;
53*b644d3e9SAneesh Bansal }
54