xref: /rk3399_rockchip-uboot/arch/arm/cpu/armv8/generic_timer.c (revision f4c98a16321ddd923b404417fda90402f1226f89)
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 
1268fd5c13SAndre Przywara DECLARE_GLOBAL_DATA_PTR;
1368fd5c13SAndre Przywara 
140ae76531SDavid Feng /*
150ae76531SDavid Feng  * Generic timer implementation of get_tbclk()
160ae76531SDavid Feng  */
get_tbclk(void)170ae76531SDavid Feng unsigned long get_tbclk(void)
180ae76531SDavid Feng {
190ae76531SDavid Feng 	unsigned long cntfrq;
200ae76531SDavid Feng 	asm volatile("mrs %0, cntfrq_el0" : "=r" (cntfrq));
210ae76531SDavid Feng 	return cntfrq;
220ae76531SDavid Feng }
230ae76531SDavid Feng 
240ae76531SDavid Feng /*
250ae76531SDavid Feng  * Generic timer implementation of timer_read_counter()
260ae76531SDavid Feng  */
timer_read_counter(void)270ae76531SDavid Feng unsigned long timer_read_counter(void)
280ae76531SDavid Feng {
290ae76531SDavid Feng 	unsigned long cntpct;
30060ef094SYork Sun #ifdef CONFIG_SYS_FSL_ERRATUM_A008585
31060ef094SYork Sun 	/* This erratum number needs to be confirmed to match ARM document */
32060ef094SYork Sun 	unsigned long temp;
33060ef094SYork Sun #endif
340ae76531SDavid Feng 	isb();
350ae76531SDavid Feng 	asm volatile("mrs %0, cntpct_el0" : "=r" (cntpct));
36060ef094SYork Sun #ifdef CONFIG_SYS_FSL_ERRATUM_A008585
37060ef094SYork Sun 	asm volatile("mrs %0, cntpct_el0" : "=r" (temp));
38060ef094SYork Sun 	while (temp != cntpct) {
39060ef094SYork Sun 		asm volatile("mrs %0, cntpct_el0" : "=r" (cntpct));
40060ef094SYork Sun 		asm volatile("mrs %0, cntpct_el0" : "=r" (temp));
41060ef094SYork Sun 	}
42060ef094SYork Sun #endif
430ae76531SDavid Feng 	return cntpct;
440ae76531SDavid Feng }
45b644d3e9SAneesh Bansal 
get_ticks(void)46f97cae95SSimon Glass uint64_t get_ticks(void)
4768fd5c13SAndre Przywara {
4868fd5c13SAndre Przywara 	unsigned long ticks = timer_read_counter();
4968fd5c13SAndre Przywara 
5068fd5c13SAndre Przywara 	gd->arch.tbl = ticks;
5168fd5c13SAndre Przywara 
5268fd5c13SAndre Przywara 	return ticks;
5368fd5c13SAndre Przywara }
5468fd5c13SAndre Przywara 
usec2ticks(unsigned long usec)55b644d3e9SAneesh Bansal unsigned long usec2ticks(unsigned long usec)
56b644d3e9SAneesh Bansal {
57b644d3e9SAneesh Bansal 	ulong ticks;
58b644d3e9SAneesh Bansal 	if (usec < 1000)
59b644d3e9SAneesh Bansal 		ticks = ((usec * (get_tbclk()/1000)) + 500) / 1000;
60b644d3e9SAneesh Bansal 	else
61b644d3e9SAneesh Bansal 		ticks = ((usec / 10) * (get_tbclk() / 100000));
62b644d3e9SAneesh Bansal 
63b644d3e9SAneesh Bansal 	return ticks;
64b644d3e9SAneesh Bansal }
65*f4c98a16SKever Yang 
timer_get_boot_us(void)66*f4c98a16SKever Yang ulong timer_get_boot_us(void)
67*f4c98a16SKever Yang {
68*f4c98a16SKever Yang 	ulong count = timer_read_counter();
69*f4c98a16SKever Yang 
70*f4c98a16SKever Yang 	return count/24;
71*f4c98a16SKever Yang }
72