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 Fengunsigned 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 Fengunsigned 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 Glassuint64_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 Bansalunsigned 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 Yangulong 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