1 /******************************************************************************
3 * Copyright (C) 2011 - 2014 Xilinx, Inc. All rights reserved.
5 * Permission is hereby granted, free of charge, to any person obtaining a copy
6 * of this software and associated documentation files (the "Software"), to deal
7 * in the Software without restriction, including without limitation the rights
8 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 * copies of the Software, and to permit persons to whom the Software is
10 * furnished to do so, subject to the following conditions:
12 * The above copyright notice and this permission notice shall be included in
13 * all copies or substantial portions of the Software.
15 * Use of the Software is limited solely to applications:
16 * (a) running on a Xilinx device, or
17 * (b) that interact with a Xilinx device through a bus or interconnect.
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
23 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
24 * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
27 * Except as contained in this notice, the name of the Xilinx shall not be used
28 * in advertising or otherwise to promote the sale, use or other dealings in
29 * this Software without prior written authorization from Xilinx.
31 ******************************************************************************/
32 /*****************************************************************************/
37 * This file contains APIs for configuring and controlling the Cortex-A9
38 * Performance Monitor Events. For more information about the event counters,
42 * MODIFICATION HISTORY:
44 * Ver Who Date Changes
45 * ----- ---- -------- -----------------------------------------------
46 * 1.00a sdm 07/11/11 First release
49 ******************************************************************************/
51 /***************************** Include Files *********************************/
53 #include "xpm_counter.h"
55 /************************** Constant Definitions ****************************/
57 /**************************** Type Definitions ******************************/
59 typedef const u32 PmcrEventCfg[XPM_CTRCOUNT];
61 /***************** Macros (Inline Functions) Definitions ********************/
63 /************************** Variable Definitions *****************************/
65 static PmcrEventCfg PmcrEvents[] = {
68 XPM_EVENT_INSRFETCH_CACHEREFILL,
69 XPM_EVENT_INSTRFECT_TLBREFILL,
70 XPM_EVENT_DATA_CACHEREFILL,
71 XPM_EVENT_DATA_CACHEACCESS,
72 XPM_EVENT_DATA_TLBREFILL
78 XPM_EVENT_EXCEPRETURN,
79 XPM_EVENT_CHANGECONTEXT,
83 XPM_EVENT_IMMEDBRANCH,
84 XPM_EVENT_UNALIGNEDACCESS,
86 XPM_EVENT_CLOCKCYCLES,
87 XPM_EVENT_BRANCHPREDICT,
88 XPM_EVENT_JAVABYTECODE
91 XPM_EVENT_SWJAVABYTECODE,
92 XPM_EVENT_JAVABACKBRANCH,
93 XPM_EVENT_COHERLINEMISS,
94 XPM_EVENT_COHERLINEHIT,
99 XPM_EVENT_MAINTLBSTALL,
103 XPM_EVENT_NODISPATCH,
107 XPM_EVENT_INSTRRENAME,
108 XPM_EVENT_PREDICTFUNCRET,
112 XPM_EVENT_FLOATRENAME
115 XPM_EVENT_NEONRENAME,
117 XPM_EVENT_WRITESTALL,
118 XPM_EVENT_INSTRTLBSTALL,
119 XPM_EVENT_DATATLBSTALL,
120 XPM_EVENT_INSTR_uTLBSTALL
123 XPM_EVENT_DATA_uTLBSTALL,
148 XPM_EVENT_INSRFETCH_CACHEREFILL,
149 XPM_EVENT_INSTRFECT_TLBREFILL,
150 XPM_EVENT_DATA_CACHEREFILL,
151 XPM_EVENT_DATA_CACHEACCESS,
152 XPM_EVENT_DATA_TLBREFILL
156 /************************** Function Prototypes ******************************/
158 void Xpm_DisableEventCounters(void);
159 void Xpm_EnableEventCounters (void);
160 void Xpm_ResetEventCounters (void);
162 /******************************************************************************/
164 /****************************************************************************/
167 * This function disables the Cortex A9 event counters.
175 *****************************************************************************/
176 void Xpm_DisableEventCounters(void)
178 /* Disable the event counters */
179 mtcp(XREG_CP15_COUNT_ENABLE_CLR, 0x3f);
182 /****************************************************************************/
185 * This function enables the Cortex A9 event counters.
193 *****************************************************************************/
194 void Xpm_EnableEventCounters(void)
196 /* Enable the event counters */
197 mtcp(XREG_CP15_COUNT_ENABLE_SET, 0x3f);
200 /****************************************************************************/
203 * This function resets the Cortex A9 event counters.
211 *****************************************************************************/
212 void Xpm_ResetEventCounters(void)
217 Reg = mfcp(XREG_CP15_PERF_MONITOR_CTRL);
219 { register unsigned int C15Reg __asm(XREG_CP15_PERF_MONITOR_CTRL);
222 Reg |= (1 << 2); /* reset event counters */
223 mtcp(XREG_CP15_PERF_MONITOR_CTRL, Reg);
226 /****************************************************************************/
229 * This function configures the Cortex A9 event counters controller, with the
230 * event codes, in a configuration selected by the user and enables the counters.
232 * @param PmcrCfg is configuration value based on which the event counters
234 * Use XPM_CNTRCFG* values defined in xpm_counter.h.
240 *****************************************************************************/
241 void Xpm_SetEvents(int PmcrCfg)
244 const u32 *Ptr = PmcrEvents[PmcrCfg];
246 Xpm_DisableEventCounters();
248 for(Counter = 0; Counter < XPM_CTRCOUNT; Counter++) {
250 /* Selecet event counter */
251 mtcp(XREG_CP15_EVENT_CNTR_SEL, Counter);
254 mtcp(XREG_CP15_EVENT_TYPE_SEL, Ptr[Counter]);
257 Xpm_ResetEventCounters();
258 Xpm_EnableEventCounters();
261 /****************************************************************************/
264 * This function disables the event counters and returns the counter values.
266 * @param PmCtrValue is a pointer to an array of type u32 PmCtrValue[6].
267 * It is an output parameter which is used to return the PM
274 *****************************************************************************/
275 void Xpm_GetEventCounters(u32 *PmCtrValue)
279 Xpm_DisableEventCounters();
281 for(Counter = 0; Counter < XPM_CTRCOUNT; Counter++) {
283 mtcp(XREG_CP15_EVENT_CNTR_SEL, Counter);
285 PmCtrValue[Counter] = mfcp(XREG_CP15_PERF_MONITOR_COUNT);
287 { register unsigned int Cp15Reg __asm(XREG_CP15_PERF_MONITOR_COUNT);
288 PmCtrValue[Counter] = Cp15Reg; }