/******************************************************************************
*
* (c) Copyright 2012-2014 Xilinx, Inc. All rights reserved.
*
* This file contains confidential and proprietary information of Xilinx, Inc.
* and is protected under U.S. and international copyright and other
* intellectual property laws.
*
* DISCLAIMER
* This disclaimer is not a license and does not grant any rights to the
* materials distributed herewith. Except as otherwise provided in a valid
* license issued to you by Xilinx, and to the maximum extent permitted by
* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL
* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS,
* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF
* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE;
* and (2) Xilinx shall not be liable (whether in contract or tort, including
* negligence, or under any other theory of liability) for any loss or damage
* of any kind or nature related to, arising under or in connection with these
* materials, including for any direct, or any indirect, special, incidental,
* or consequential loss or damage (including loss of data, profits, goodwill,
* or any type of loss or damage suffered as a result of any action brought by
* a third party) even if such damage or loss was reasonably foreseeable or
* Xilinx had been advised of the possibility of the same.
*
* CRITICAL APPLICATIONS
* Xilinx products are not designed or intended to be fail-safe, or for use in
* any application requiring fail-safe performance, such as life-support or
* safety devices or systems, Class III medical devices, nuclear facilities,
* applications related to the deployment of airbags, or any other applications
* that could lead to death, personal injury, or severe property or
* environmental damage (individually and collectively, "Critical
* Applications"). Customer assumes the sole risk and liability of any use of
* Xilinx products in Critical Applications, subject only to applicable laws
* and regulations governing limitations on product liability.
*
* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE
* AT ALL TIMES.
*
*******************************************************************************/

/*****************************************************************************
*
* @file uio_perfmon.h
*
* This file provides defines API , macros and defines for perf-mon library internal usage. 
* 
*
* <pre>
* MODIFICATION HISTORY:
*
* Ver   Who  Date        Changes
* ----- ---- -------- -------------------------------------------------------
* 1.00a RSP   14/07/14 Initial release
* </pre>
*
* @note
*
******************************************************************************/


#ifndef UPERFMON_H_
#define UPERFMON_H_

#include "uio_common.h"


#define QOS_PATCH

#ifdef QOS_PATCH
#define APM_SLOTS_COUNT 5
#define APM_SLOT1 1
#define APM_SLOT2 2
#endif



#define APM_INSTANCE_NAME		       "axi-pmon"
#define APM_SAMPLE_VALUE		       150000000 // 150MHz == 1 second
#define APM_COUNTER_WIDTH              32
#define APM_NUM_COUNTERS_PER_SLOT      6
#define APM_COUNTER_ID(slot, metrics)  ((slot * APM_NUM_COUNTERS_PER_SLOT) + metrics)
#define MAP_CNT		2 // Memory-maps in user-space

// Reg read/write macros for apm
#define XAxiPmon_ReadReg HW_READ
#define XAxiPmon_WriteReg HW_WRITE


/**
 * struct xapm_param - HW parameters structure
 * @mode: Mode in which APM is working
 * @maxslots: Maximum number of Slots in APM
 * @eventcnt: Event counting enabled in APM
 * @eventlog: Event logging enabled in APM
 * @sampledcnt: Sampled metric counters enabled in APM
 * @numcounters: Number of counters in APM
 * @metricwidth: Metric Counter width (32/64)
 * @sampledwidth: Sampled metric counter width
 * @globalcntwidth: Global Clock counter width
 * @scalefactor: Scaling factor
 * @isr: Interrupts info shared to userspace
 */
struct xapm_param {
        u32     mode;
        u32     maxslots;
        u32     eventcnt;
        u32     eventlog;
        u32     sampledcnt;
        u32     numcounters;
        u32     metricwidth;
        u32     sampledwidth;
        u32     globalcntwidth;
        u32     scalefactor;
        u32     isr;
};

int uPerfMon_Init();
void uPerfMon_Enable();
void uPerfMon_Disable();
u32 uPerfMon_Check_SIC_Overflow_Mask();
void uPerfMon_RestartCounters();
int uPerfMon_Wait_for_counter_overflow();
unsigned long uPerfMon_getCounterValue(int hp_port, int read_Write);
#ifdef QOS_PATCH
unsigned long uPerfMon_getCounterValue_qos(int hp_port, int read_Write);
#endif

#endif /* UPERFMON_H_ */
