1 /******************************************************************************
3 * Copyright (C) 2011 - 2015 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
47 * 4.2 pkp 07/21/14 Corrected reset value of event counter in function
48 * Xpm_ResetEventCounters to fix CR#796275
51 ******************************************************************************/
53 /***************************** Include Files *********************************/
55 #include "xpm_counter.h"
57 /************************** Constant Definitions ****************************/
59 /**************************** Type Definitions ******************************/
61 typedef const u32 PmcrEventCfg32[XPM_CTRCOUNT];
63 /***************** Macros (Inline Functions) Definitions ********************/
65 /************************** Variable Definitions *****************************/
67 /************************** Function Prototypes ******************************/
69 void Xpm_DisableEventCounters(void);
70 void Xpm_EnableEventCounters (void);
71 void Xpm_ResetEventCounters (void);
73 /******************************************************************************/
75 /****************************************************************************/
78 * @brief This function disables the Cortex A9 event counters.
86 *****************************************************************************/
87 void Xpm_DisableEventCounters(void)
89 /* Disable the event counters */
90 mtcp(XREG_CP15_COUNT_ENABLE_CLR, 0x3f);
93 /****************************************************************************/
96 * @brief This function enables the Cortex A9 event counters.
104 *****************************************************************************/
105 void Xpm_EnableEventCounters(void)
107 /* Enable the event counters */
108 mtcp(XREG_CP15_COUNT_ENABLE_SET, 0x3f);
111 /****************************************************************************/
114 * @brief This function resets the Cortex A9 event counters.
122 *****************************************************************************/
123 void Xpm_ResetEventCounters(void)
127 Reg = mfcp(XREG_CP15_PERF_MONITOR_CTRL);
128 #elif defined (__ICCARM__)
129 mfcp(XREG_CP15_PERF_MONITOR_CTRL, Reg);
131 { register u32 C15Reg __asm(XREG_CP15_PERF_MONITOR_CTRL);
134 Reg |= (1U << 1U); /* reset event counters */
135 mtcp(XREG_CP15_PERF_MONITOR_CTRL, Reg);
139 /****************************************************************************/
141 * @brief This function configures the Cortex A9 event counters controller,
142 * with the event codes, in a configuration selected by the user and
143 * enables the counters.
145 * @param PmcrCfg: Configuration value based on which the event counters
146 * are configured. XPM_CNTRCFG* values defined in xpm_counter.h can
147 * be utilized for setting configuration.
153 *****************************************************************************/
154 void Xpm_SetEvents(s32 PmcrCfg)
157 static PmcrEventCfg32 PmcrEvents[] = {
160 XPM_EVENT_INSRFETCH_CACHEREFILL,
161 XPM_EVENT_INSTRFECT_TLBREFILL,
162 XPM_EVENT_DATA_CACHEREFILL,
163 XPM_EVENT_DATA_CACHEACCESS,
164 XPM_EVENT_DATA_TLBREFILL
167 XPM_EVENT_DATA_READS,
168 XPM_EVENT_DATA_WRITE,
170 XPM_EVENT_EXCEPRETURN,
171 XPM_EVENT_CHANGECONTEXT,
172 XPM_EVENT_SW_CHANGEPC
175 XPM_EVENT_IMMEDBRANCH,
176 XPM_EVENT_UNALIGNEDACCESS,
177 XPM_EVENT_BRANCHMISS,
178 XPM_EVENT_CLOCKCYCLES,
179 XPM_EVENT_BRANCHPREDICT,
180 XPM_EVENT_JAVABYTECODE
183 XPM_EVENT_SWJAVABYTECODE,
184 XPM_EVENT_JAVABACKBRANCH,
185 XPM_EVENT_COHERLINEMISS,
186 XPM_EVENT_COHERLINEHIT,
187 XPM_EVENT_INSTRSTALL,
191 XPM_EVENT_MAINTLBSTALL,
195 XPM_EVENT_NODISPATCH,
199 XPM_EVENT_INSTRRENAME,
200 XPM_EVENT_PREDICTFUNCRET,
204 XPM_EVENT_FLOATRENAME
207 XPM_EVENT_NEONRENAME,
209 XPM_EVENT_WRITESTALL,
210 XPM_EVENT_INSTRTLBSTALL,
211 XPM_EVENT_DATATLBSTALL,
212 XPM_EVENT_INSTR_uTLBSTALL
215 XPM_EVENT_DATA_uTLBSTALL,
240 XPM_EVENT_INSRFETCH_CACHEREFILL,
241 XPM_EVENT_INSTRFECT_TLBREFILL,
242 XPM_EVENT_DATA_CACHEREFILL,
243 XPM_EVENT_DATA_CACHEACCESS,
244 XPM_EVENT_DATA_TLBREFILL
247 const u32 *ptr = PmcrEvents[PmcrCfg];
249 Xpm_DisableEventCounters();
251 for(Counter = 0U; Counter < XPM_CTRCOUNT; Counter++) {
253 /* Selecet event counter */
254 mtcp(XREG_CP15_EVENT_CNTR_SEL, Counter);
257 mtcp(XREG_CP15_EVENT_TYPE_SEL, ptr[Counter]);
260 Xpm_ResetEventCounters();
261 Xpm_EnableEventCounters();
264 /****************************************************************************/
267 * @brief This function disables the event counters and returns the counter
270 * @param PmCtrValue: Pointer to an array of type u32 PmCtrValue[6].
271 * It is an output parameter which is used to return the PM
278 *****************************************************************************/
279 void Xpm_GetEventCounters(u32 *PmCtrValue)
283 Xpm_DisableEventCounters();
285 for(Counter = 0U; Counter < XPM_CTRCOUNT; Counter++) {
287 mtcp(XREG_CP15_EVENT_CNTR_SEL, Counter);
289 PmCtrValue[Counter] = mfcp(XREG_CP15_PERF_MONITOR_COUNT);
290 #elif defined (__ICCARM__)
291 mfcp(XREG_CP15_PERF_MONITOR_COUNT, PmCtrValue[Counter]);
293 { register u32 Cp15Reg __asm(XREG_CP15_PERF_MONITOR_COUNT);
294 PmCtrValue[Counter] = Cp15Reg; }