1 /* 2 * (C) Copyright 2013 3 * David Feng <fenghua@phytium.com.cn> 4 * 5 * SPDX-License-Identifier: GPL-2.0+ 6 */ 7 8 #include <common.h> 9 #include <command.h> 10 #include <asm/system.h> 11 12 /* 13 * Generic timer implementation of get_tbclk() 14 */ 15 unsigned long get_tbclk(void) 16 { 17 unsigned long cntfrq; 18 asm volatile("mrs %0, cntfrq_el0" : "=r" (cntfrq)); 19 return cntfrq; 20 } 21 22 /* 23 * Generic timer implementation of timer_read_counter() 24 */ 25 unsigned long timer_read_counter(void) 26 { 27 unsigned long cntpct; 28 #ifdef CONFIG_SYS_FSL_ERRATUM_A008585 29 /* This erratum number needs to be confirmed to match ARM document */ 30 unsigned long temp; 31 #endif 32 isb(); 33 asm volatile("mrs %0, cntpct_el0" : "=r" (cntpct)); 34 #ifdef CONFIG_SYS_FSL_ERRATUM_A008585 35 asm volatile("mrs %0, cntpct_el0" : "=r" (temp)); 36 while (temp != cntpct) { 37 asm volatile("mrs %0, cntpct_el0" : "=r" (cntpct)); 38 asm volatile("mrs %0, cntpct_el0" : "=r" (temp)); 39 } 40 #endif 41 return cntpct; 42 } 43