1 /******************************************************************************
3 * (c) Copyright 2011-13 Xilinx, Inc. All rights reserved.
5 * This file contains confidential and proprietary information of Xilinx, Inc.
6 * and is protected under U.S. and international copyright and other
7 * intellectual property laws.
10 * This disclaimer is not a license and does not grant any rights to the
11 * materials distributed herewith. Except as otherwise provided in a valid
12 * license issued to you by Xilinx, and to the maximum extent permitted by
13 * applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL
14 * FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS,
15 * IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF
16 * MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE;
17 * and (2) Xilinx shall not be liable (whether in contract or tort, including
18 * negligence, or under any other theory of liability) for any loss or damage
19 * of any kind or nature related to, arising under or in connection with these
20 * materials, including for any direct, or any indirect, special, incidental,
21 * or consequential loss or damage (including loss of data, profits, goodwill,
22 * or any type of loss or damage suffered as a result of any action brought by
23 * a third party) even if such damage or loss was reasonably foreseeable or
24 * Xilinx had been advised of the possibility of the same.
26 * CRITICAL APPLICATIONS
27 * Xilinx products are not designed or intended to be fail-safe, or for use in
28 * any application requiring fail-safe performance, such as life-support or
29 * safety devices or systems, Class III medical devices, nuclear facilities,
30 * applications related to the deployment of airbags, or any other applications
31 * that could lead to death, personal injury, or severe property or
32 * environmental damage (individually and collectively, "Critical
33 * Applications"). Customer assumes the sole risk and liability of any use of
34 * Xilinx products in Critical Applications, subject only to applicable laws
35 * and regulations governing limitations on product liability.
37 * THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE
40 ******************************************************************************/
41 /*****************************************************************************/
46 * This file contains APIs for configuring and controlling the Cortex-A9
47 * Performance Monitor Events. For more information about the event counters,
51 * MODIFICATION HISTORY:
53 * Ver Who Date Changes
54 * ----- ---- -------- -----------------------------------------------
55 * 1.00a sdm 07/11/11 First release
58 ******************************************************************************/
60 /***************************** Include Files *********************************/
62 #include "xpm_counter.h"
64 /************************** Constant Definitions ****************************/
66 /**************************** Type Definitions ******************************/
68 typedef const u32 PmcrEventCfg[XPM_CTRCOUNT];
70 /***************** Macros (Inline Functions) Definitions ********************/
72 /************************** Variable Definitions *****************************/
74 static PmcrEventCfg PmcrEvents[] = {
77 XPM_EVENT_INSRFETCH_CACHEREFILL,
78 XPM_EVENT_INSTRFECT_TLBREFILL,
79 XPM_EVENT_DATA_CACHEREFILL,
80 XPM_EVENT_DATA_CACHEACCESS,
81 XPM_EVENT_DATA_TLBREFILL
87 XPM_EVENT_EXCEPRETURN,
88 XPM_EVENT_CHANGECONTEXT,
92 XPM_EVENT_IMMEDBRANCH,
93 XPM_EVENT_UNALIGNEDACCESS,
95 XPM_EVENT_CLOCKCYCLES,
96 XPM_EVENT_BRANCHPREDICT,
97 XPM_EVENT_JAVABYTECODE
100 XPM_EVENT_SWJAVABYTECODE,
101 XPM_EVENT_JAVABACKBRANCH,
102 XPM_EVENT_COHERLINEMISS,
103 XPM_EVENT_COHERLINEHIT,
104 XPM_EVENT_INSTRSTALL,
108 XPM_EVENT_MAINTLBSTALL,
112 XPM_EVENT_NODISPATCH,
116 XPM_EVENT_INSTRRENAME,
117 XPM_EVENT_PREDICTFUNCRET,
121 XPM_EVENT_FLOATRENAME
124 XPM_EVENT_NEONRENAME,
126 XPM_EVENT_WRITESTALL,
127 XPM_EVENT_INSTRTLBSTALL,
128 XPM_EVENT_DATATLBSTALL,
129 XPM_EVENT_INSTR_uTLBSTALL
132 XPM_EVENT_DATA_uTLBSTALL,
157 XPM_EVENT_INSRFETCH_CACHEREFILL,
158 XPM_EVENT_INSTRFECT_TLBREFILL,
159 XPM_EVENT_DATA_CACHEREFILL,
160 XPM_EVENT_DATA_CACHEACCESS,
161 XPM_EVENT_DATA_TLBREFILL
165 /************************** Function Prototypes ******************************/
167 void Xpm_DisableEventCounters(void);
168 void Xpm_EnableEventCounters (void);
169 void Xpm_ResetEventCounters (void);
171 /******************************************************************************/
173 /****************************************************************************/
176 * This function disables the Cortex A9 event counters.
184 *****************************************************************************/
185 void Xpm_DisableEventCounters(void)
187 /* Disable the event counters */
188 mtcp(XREG_CP15_COUNT_ENABLE_CLR, 0x3f);
191 /****************************************************************************/
194 * This function enables the Cortex A9 event counters.
202 *****************************************************************************/
203 void Xpm_EnableEventCounters(void)
205 /* Enable the event counters */
206 mtcp(XREG_CP15_COUNT_ENABLE_SET, 0x3f);
209 /****************************************************************************/
212 * This function resets the Cortex A9 event counters.
220 *****************************************************************************/
221 void Xpm_ResetEventCounters(void)
226 Reg = mfcp(XREG_CP15_PERF_MONITOR_CTRL);
228 { register unsigned int C15Reg __asm(XREG_CP15_PERF_MONITOR_CTRL);
231 Reg |= (1 << 2); /* reset event counters */
232 mtcp(XREG_CP15_PERF_MONITOR_CTRL, Reg);
235 /****************************************************************************/
238 * This function configures the Cortex A9 event counters controller, with the
239 * event codes, in a configuration selected by the user and enables the counters.
241 * @param PmcrCfg is configuration value based on which the event counters
243 * Use XPM_CNTRCFG* values defined in xpm_counter.h.
249 *****************************************************************************/
250 void Xpm_SetEvents(int PmcrCfg)
253 const u32 *Ptr = PmcrEvents[PmcrCfg];
255 Xpm_DisableEventCounters();
257 for(Counter = 0; Counter < XPM_CTRCOUNT; Counter++) {
259 /* Selecet event counter */
260 mtcp(XREG_CP15_EVENT_CNTR_SEL, Counter);
263 mtcp(XREG_CP15_EVENT_TYPE_SEL, Ptr[Counter]);
266 Xpm_ResetEventCounters();
267 Xpm_EnableEventCounters();
270 /****************************************************************************/
273 * This function disables the event counters and returns the counter values.
275 * @param PmCtrValue is a pointer to an array of type u32 PmCtrValue[6].
276 * It is an output parameter which is used to return the PM
283 *****************************************************************************/
284 void Xpm_GetEventCounters(u32 *PmCtrValue)
288 Xpm_DisableEventCounters();
290 for(Counter = 0; Counter < XPM_CTRCOUNT; Counter++) {
292 mtcp(XREG_CP15_EVENT_CNTR_SEL, Counter);
294 PmCtrValue[Counter] = mfcp(XREG_CP15_PERF_MONITOR_COUNT);
296 { register unsigned int Cp15Reg __asm(XREG_CP15_PERF_MONITOR_COUNT);
297 PmCtrValue[Counter] = Cp15Reg; }