1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * (C) Copyright 2013 3*4882a593Smuzhiyun * David Feng <fenghua@phytium.com.cn> 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #include <common.h> 9*4882a593Smuzhiyun #include <command.h> 10*4882a593Smuzhiyun #include <asm/system.h> 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun DECLARE_GLOBAL_DATA_PTR; 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun /* 15*4882a593Smuzhiyun * Generic timer implementation of get_tbclk() 16*4882a593Smuzhiyun */ get_tbclk(void)17*4882a593Smuzhiyununsigned long get_tbclk(void) 18*4882a593Smuzhiyun { 19*4882a593Smuzhiyun unsigned long cntfrq; 20*4882a593Smuzhiyun asm volatile("mrs %0, cntfrq_el0" : "=r" (cntfrq)); 21*4882a593Smuzhiyun return cntfrq; 22*4882a593Smuzhiyun } 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun /* 25*4882a593Smuzhiyun * Generic timer implementation of timer_read_counter() 26*4882a593Smuzhiyun */ timer_read_counter(void)27*4882a593Smuzhiyununsigned long timer_read_counter(void) 28*4882a593Smuzhiyun { 29*4882a593Smuzhiyun unsigned long cntpct; 30*4882a593Smuzhiyun #ifdef CONFIG_SYS_FSL_ERRATUM_A008585 31*4882a593Smuzhiyun /* This erratum number needs to be confirmed to match ARM document */ 32*4882a593Smuzhiyun unsigned long temp; 33*4882a593Smuzhiyun #endif 34*4882a593Smuzhiyun isb(); 35*4882a593Smuzhiyun asm volatile("mrs %0, cntpct_el0" : "=r" (cntpct)); 36*4882a593Smuzhiyun #ifdef CONFIG_SYS_FSL_ERRATUM_A008585 37*4882a593Smuzhiyun asm volatile("mrs %0, cntpct_el0" : "=r" (temp)); 38*4882a593Smuzhiyun while (temp != cntpct) { 39*4882a593Smuzhiyun asm volatile("mrs %0, cntpct_el0" : "=r" (cntpct)); 40*4882a593Smuzhiyun asm volatile("mrs %0, cntpct_el0" : "=r" (temp)); 41*4882a593Smuzhiyun } 42*4882a593Smuzhiyun #endif 43*4882a593Smuzhiyun return cntpct; 44*4882a593Smuzhiyun } 45*4882a593Smuzhiyun get_ticks(void)46*4882a593Smuzhiyunuint64_t get_ticks(void) 47*4882a593Smuzhiyun { 48*4882a593Smuzhiyun unsigned long ticks = timer_read_counter(); 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun gd->arch.tbl = ticks; 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun return ticks; 53*4882a593Smuzhiyun } 54*4882a593Smuzhiyun usec2ticks(unsigned long usec)55*4882a593Smuzhiyununsigned long usec2ticks(unsigned long usec) 56*4882a593Smuzhiyun { 57*4882a593Smuzhiyun ulong ticks; 58*4882a593Smuzhiyun if (usec < 1000) 59*4882a593Smuzhiyun ticks = ((usec * (get_tbclk()/1000)) + 500) / 1000; 60*4882a593Smuzhiyun else 61*4882a593Smuzhiyun ticks = ((usec / 10) * (get_tbclk() / 100000)); 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun return ticks; 64*4882a593Smuzhiyun } 65*4882a593Smuzhiyun timer_get_boot_us(void)66*4882a593Smuzhiyunulong timer_get_boot_us(void) 67*4882a593Smuzhiyun { 68*4882a593Smuzhiyun ulong count = timer_read_counter(); 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun return count/24; 71*4882a593Smuzhiyun } 72