blob: ee18236494e14dc3357a950faf06801442a7ab50 [file] [log] [blame]
/*
* Copyright (C) 2018 Synaptics Incorporated. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND
* SYNAPTICS EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES,
* INCLUDING ANY IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE, AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY
* INTELLECTUAL PROPERTY RIGHTS. IN NO EVENT SHALL SYNAPTICS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, PUNITIVE, OR
* CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION WITH THE USE
* OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED AND
* BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF
* COMPETENT JURISDICTION DOES NOT PERMIT THE DISCLAIMER OF DIRECT
* DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS' TOTAL CUMULATIVE LIABILITY
* TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S. DOLLARS.
*/
#include "diag_common.h"
#include "diag_misc.h"
#include "apbRegBase.h"
#include <string.h>
#include <stdarg.h>
#include <stdio.h>
#include <malloc.h>
/************************************************************
Timer Service
************************************************************/
// using cpu generic timer for delay
#define TIMER_CLOCK_KHZ GENERIC_TIMER_CLOCK_KHZ_REAL
#define TIMER_BASE (SM_APB_TIMER0_BASE+0x00) // use SM_TIMER0, fixed 25MHz on ASIC.
/************************************************************
for performance debug
************************************************************/
int sys_flag_performance_meter_enable = 0;
extern unsigned long long arm_get_CNTPCT();
void timer_start()
{
// always started
}
unsigned int timer_get()
{
return arm_get_CNTPCT();
}
int timer_is_enabled()
{
return 1;
}
unsigned int timer_cycle2us(unsigned int cycles)
{
if (cycles > ((unsigned int)-1)/1000)
{
return (cycles/TIMER_CLOCK_KHZ) * 1000;
}
else
{
return cycles*1000/TIMER_CLOCK_KHZ;
}
}
unsigned int timer_us2cycle(unsigned int us)
{
if (us > (0xFFFFFFFF/TIMER_CLOCK_KHZ))
{
return us/1000*TIMER_CLOCK_KHZ;
}
else
{
return us*TIMER_CLOCK_KHZ/1000;
}
}
// for mutil-core
void diag_delay_us_real(unsigned int count)
{
unsigned int start_time;
if (count > 50*1000)
{
count = (count/1000)*TIMER_CLOCK_KHZ; // 25MHz SM timer clock
}
else
{
count = count*TIMER_CLOCK_KHZ/1000; // 25MHz SM timer clock
}
if (timer_is_enabled() == 0)
{
timer_start();
}
start_time = timer_get();
while((unsigned int)(timer_get() - start_time) < count);
return;
}
void diag_delay_us(unsigned int us) // in virtual world
{
diag_delay_us_real((us)*(CPU_CLOCK_VIRTUAL_KHZ/CPU_CLOCK_KHZ));
}