1 /******************************************************************************
3 * Copyright (C) 2014 - 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-R5
38 * Performance Monitor Events. For more information about the event counters,
42 * MODIFICATION HISTORY:
44 * Ver Who Date Changes
45 * ----- ---- -------- -----------------------------------------------
46 * 5.00 pkp 02/10/14 Initial version
47 * 6.2 mus 01/27/17 Updated to support IAR compiler
50 ******************************************************************************/
52 /***************************** Include Files *********************************/
54 #include "xpm_counter.h"
56 /************************** Constant Definitions ****************************/
58 /**************************** Type Definitions ******************************/
60 typedef const u32 PmcrEventCfg32[XPM_CTRCOUNT];
62 /***************** Macros (Inline Functions) Definitions ********************/
64 /************************** Variable Definitions *****************************/
68 /************************** Function Prototypes ******************************/
70 void Xpm_DisableEventCounters(void);
71 void Xpm_EnableEventCounters (void);
72 void Xpm_ResetEventCounters (void);
74 /******************************************************************************/
76 /****************************************************************************/
79 * @brief This function disables the Cortex R5 event counters.
85 *****************************************************************************/
86 void Xpm_DisableEventCounters(void)
88 /* Disable the event counters */
89 mtcp(XREG_CP15_COUNT_ENABLE_CLR, 0x3f);
92 /****************************************************************************/
95 * @brief This function enables the Cortex R5 event counters.
101 *****************************************************************************/
102 void Xpm_EnableEventCounters(void)
104 /* Enable the event counters */
105 mtcp(XREG_CP15_COUNT_ENABLE_SET, 0x3f);
108 /****************************************************************************/
111 * @brief This function resets the Cortex R5 event counters.
117 *****************************************************************************/
118 void Xpm_ResetEventCounters(void)
123 Reg = mfcp(XREG_CP15_PERF_MONITOR_CTRL);
124 #elif defined (__ICCARM__)
125 mfcp(XREG_CP15_PERF_MONITOR_CTRL, Reg);
127 { register u32 C15Reg __asm(XREG_CP15_PERF_MONITOR_CTRL);
130 Reg |= (1U << 2U); /* reset event counters */
131 mtcp(XREG_CP15_PERF_MONITOR_CTRL, Reg);
134 /****************************************************************************/
137 * @brief This function configures the Cortex R5 event counters controller,
138 * with the event codes, in a configuration selected by the user and
139 * enables the counters.
141 * @param PmcrCfg: Configuration value based on which the event counters
142 * are configured.XPM_CNTRCFG* values defined in xpm_counter.h can
143 * be utilized for setting configuration
147 *****************************************************************************/
148 void Xpm_SetEvents(s32 PmcrCfg)
151 static PmcrEventCfg32 PmcrEvents[] = {
154 XPM_EVENT_INSRFETCH_CACHEREFILL,
155 XPM_EVENT_INSTRFECT_TLBREFILL,
156 XPM_EVENT_DATA_CACHEREFILL,
157 XPM_EVENT_DATA_CACHEACCESS,
158 XPM_EVENT_DATA_TLBREFILL
161 XPM_EVENT_DATA_READS,
162 XPM_EVENT_DATA_WRITE,
164 XPM_EVENT_EXCEPRETURN,
165 XPM_EVENT_CHANGECONTEXT,
166 XPM_EVENT_SW_CHANGEPC
169 XPM_EVENT_IMMEDBRANCH,
170 XPM_EVENT_UNALIGNEDACCESS,
171 XPM_EVENT_BRANCHMISS,
172 XPM_EVENT_CLOCKCYCLES,
173 XPM_EVENT_BRANCHPREDICT,
174 XPM_EVENT_JAVABYTECODE
177 XPM_EVENT_SWJAVABYTECODE,
178 XPM_EVENT_JAVABACKBRANCH,
179 XPM_EVENT_COHERLINEMISS,
180 XPM_EVENT_COHERLINEHIT,
181 XPM_EVENT_INSTRSTALL,
185 XPM_EVENT_MAINTLBSTALL,
189 XPM_EVENT_NODISPATCH,
193 XPM_EVENT_INSTRRENAME,
194 XPM_EVENT_PREDICTFUNCRET,
198 XPM_EVENT_FLOATRENAME
201 XPM_EVENT_NEONRENAME,
203 XPM_EVENT_WRITESTALL,
204 XPM_EVENT_INSTRTLBSTALL,
205 XPM_EVENT_DATATLBSTALL,
206 XPM_EVENT_INSTR_uTLBSTALL
209 XPM_EVENT_DATA_uTLBSTALL,
234 XPM_EVENT_INSRFETCH_CACHEREFILL,
235 XPM_EVENT_INSTRFECT_TLBREFILL,
236 XPM_EVENT_DATA_CACHEREFILL,
237 XPM_EVENT_DATA_CACHEACCESS,
238 XPM_EVENT_DATA_TLBREFILL
241 const u32 *ptr = PmcrEvents[PmcrCfg];
243 Xpm_DisableEventCounters();
245 for(Counter = 0U; Counter < XPM_CTRCOUNT; Counter++) {
247 /* Selecet event counter */
248 mtcp(XREG_CP15_EVENT_CNTR_SEL, Counter);
251 mtcp(XREG_CP15_EVENT_TYPE_SEL, ptr[Counter]);
254 Xpm_ResetEventCounters();
255 Xpm_EnableEventCounters();
258 /****************************************************************************/
261 * @brief This function disables the event counters and returns the counter
264 * @param PmCtrValue: Pointer to an array of type u32 PmCtrValue[6].
265 * It is an output parameter which is used to return the PM
270 *****************************************************************************/
271 void Xpm_GetEventCounters(u32 *PmCtrValue)
275 Xpm_DisableEventCounters();
277 for(Counter = 0U; Counter < XPM_CTRCOUNT; Counter++) {
279 mtcp(XREG_CP15_EVENT_CNTR_SEL, Counter);
281 PmCtrValue[Counter] = mfcp(XREG_CP15_PERF_MONITOR_COUNT);
282 #elif defined (__ICCARM__)
283 mfcp(XREG_CP15_PERF_MONITOR_COUNT, PmCtrValue[Counter]);
285 { register u32 Cp15Reg __asm(XREG_CP15_PERF_MONITOR_COUNT);
286 PmCtrValue[Counter] = Cp15Reg; }