/*
 * 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.
 */
#ifndef _DIAG_MISC_H_
#define _DIAG_MISC_H_

/************************************************************
    clock
************************************************************/
#define CPU_CLOCK_KHZ               A_F_V((1800*1000),  (1800*1000/100),  180)     // real test value for FPGA and Veloce
#define CPU_CLOCK_VIRTUAL_KHZ       1800000
// SM CLOCK for sm timer, sm cpu, sm uart
#define SM_CLOCK_KHZ                (25*1000)
#define SM_CLOCK_KHZ_REAL           A_F_V((25*1000),    (25*1000),  (9600*16/1000))
// apb core clock for soc timer, spi, i2c, ...
#define CONFIG_CLOCK_KHZ            (100*1000)
#define CONFIG_CLOCK_KHZ_REAL       A_F_V((100*1000),   (100*10),     10)      // real test value for FPGA and Veloce
#define GENERIC_TIMER_CLOCK_KHZ         (25*1000)
#define GENERIC_TIMER_CLOCK_KHZ_REAL    A_F_V((25*1000),    (25*10),  (3))

/************************************************************
    delay
************************************************************/
#define delay_1us(us)       diag_delay_us(us)
#define delay_1ms(ms)       diag_delay_us((ms)*1000)

/************************************************************
    Diag memory pool for NCNB
************************************************************/
#define BUFFPOOL_TAG_NNA       	1
#define BUFFPOOL_TAG_ETH        2
#define BUFFPOOL_TAG_USB2       3
#define BUFFPOOL_TAG_SATA       4
#define BUFFPOOL_TAG_USB3       5
#define BUFFPOOL_TAG_TSP        6
#define BUFFPOOL_TAG_I2S        7
#define BUFFPOOL_TAG_USIM       8
#define BUFFPOOL_TAG_OVP        9
#define BUFFPOOL_TAG_NVME       10
#define BUFFPOOL_TAG_PB         11
#define BUFFPOOL_TAG_CPUPI	12
#define BUFFPOOL_TAG_NAND       13

extern int diag_buffpool_init(unsigned int start, int size, int block_size);
extern unsigned int diag_buffpool_alloc(int size, unsigned char tag);
extern unsigned int diag_buffpool_free(unsigned int addr, unsigned char tag);
extern uint32_t getMPid(void);
extern void diag_delay_us(unsigned int);        // in vitual world

#endif // _DIAG_MISC_H_

