1 /* 2 * SPDX-FileCopyrightText: Copyright 2019-2024 Arm Limited and/or its affiliates <open-source-office@arm.com> 3 * SPDX-License-Identifier: Apache-2.0 4 * 5 * Licensed under the Apache License, Version 2.0 (the License); you may 6 * not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an AS IS BASIS, WITHOUT 13 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 #ifndef PMU_ETHOSU_H 19 #define PMU_ETHOSU_H 20 21 /***************************************************************************** 22 * Includes 23 *****************************************************************************/ 24 #include <stdint.h> 25 26 #include "ethosu_driver.h" 27 28 #ifdef __cplusplus 29 extern "C" { 30 #endif 31 32 /***************************************************************************** 33 * Defines 34 *****************************************************************************/ 35 #ifdef ETHOSU85 36 #define ETHOSU_PMU_NCOUNTERS 8 37 #else 38 #define ETHOSU_PMU_NCOUNTERS 4 39 #endif 40 41 #define ETHOSU_PMU_CNT1_Msk (1UL << 0) 42 #define ETHOSU_PMU_CNT2_Msk (1UL << 1) 43 #define ETHOSU_PMU_CNT3_Msk (1UL << 2) 44 #define ETHOSU_PMU_CNT4_Msk (1UL << 3) 45 #ifdef ETHOSU85 46 #define ETHOSU_PMU_CNT5_Msk (1UL << 4) 47 #define ETHOSU_PMU_CNT6_Msk (1UL << 5) 48 #define ETHOSU_PMU_CNT7_Msk (1UL << 6) 49 #define ETHOSU_PMU_CNT8_Msk (1UL << 7) 50 #endif 51 52 #define ETHOSU_PMU_CCNT_Msk (1UL << 31) 53 54 /***************************************************************************** 55 * Types 56 *****************************************************************************/ 57 58 /** \brief HW Supported ETHOSU PMU Events 59 * 60 * Note: These values are symbolic. Actual HW-values may change. I.e. always use API 61 * to set/get actual event-type value. 62 * */ 63 #if defined(ETHOSU55) || defined(ETHOSU65) 64 enum ethosu_pmu_event_type 65 { 66 ETHOSU_PMU_NO_EVENT = 0, 67 ETHOSU_PMU_CYCLE, 68 ETHOSU_PMU_NPU_IDLE, 69 ETHOSU_PMU_CC_STALLED_ON_BLOCKDEP, 70 ETHOSU_PMU_CC_STALLED_ON_SHRAM_RECONFIG, 71 ETHOSU_PMU_NPU_ACTIVE, 72 ETHOSU_PMU_MAC_ACTIVE, 73 ETHOSU_PMU_MAC_ACTIVE_8BIT, 74 ETHOSU_PMU_MAC_ACTIVE_16BIT, 75 ETHOSU_PMU_MAC_DPU_ACTIVE, 76 ETHOSU_PMU_MAC_STALLED_BY_WD_ACC, 77 ETHOSU_PMU_MAC_STALLED_BY_WD, 78 ETHOSU_PMU_MAC_STALLED_BY_ACC, 79 ETHOSU_PMU_MAC_STALLED_BY_IB, 80 ETHOSU_PMU_MAC_ACTIVE_32BIT, 81 ETHOSU_PMU_MAC_STALLED_BY_INT_W, 82 ETHOSU_PMU_MAC_STALLED_BY_INT_ACC, 83 ETHOSU_PMU_AO_ACTIVE, 84 ETHOSU_PMU_AO_ACTIVE_8BIT, 85 ETHOSU_PMU_AO_ACTIVE_16BIT, 86 ETHOSU_PMU_AO_STALLED_BY_OFMP_OB, 87 ETHOSU_PMU_AO_STALLED_BY_OFMP, 88 ETHOSU_PMU_AO_STALLED_BY_OB, 89 ETHOSU_PMU_AO_STALLED_BY_ACC_IB, 90 ETHOSU_PMU_AO_STALLED_BY_ACC, 91 ETHOSU_PMU_AO_STALLED_BY_IB, 92 ETHOSU_PMU_WD_ACTIVE, 93 ETHOSU_PMU_WD_STALLED, 94 ETHOSU_PMU_WD_STALLED_BY_WS, 95 ETHOSU_PMU_WD_STALLED_BY_WD_BUF, 96 ETHOSU_PMU_WD_PARSE_ACTIVE, 97 ETHOSU_PMU_WD_PARSE_STALLED, 98 ETHOSU_PMU_WD_PARSE_STALLED_IN, 99 ETHOSU_PMU_WD_PARSE_STALLED_OUT, 100 ETHOSU_PMU_WD_TRANS_WS, 101 ETHOSU_PMU_WD_TRANS_WB, 102 ETHOSU_PMU_WD_TRANS_DW0, 103 ETHOSU_PMU_WD_TRANS_DW1, 104 ETHOSU_PMU_AXI0_RD_TRANS_ACCEPTED, 105 ETHOSU_PMU_AXI0_RD_TRANS_COMPLETED, 106 ETHOSU_PMU_AXI0_RD_DATA_BEAT_RECEIVED, 107 ETHOSU_PMU_AXI0_RD_TRAN_REQ_STALLED, 108 ETHOSU_PMU_AXI0_WR_TRANS_ACCEPTED, 109 ETHOSU_PMU_AXI0_WR_TRANS_COMPLETED_M, 110 ETHOSU_PMU_AXI0_WR_TRANS_COMPLETED_S, 111 ETHOSU_PMU_AXI0_WR_DATA_BEAT_WRITTEN, 112 ETHOSU_PMU_AXI0_WR_TRAN_REQ_STALLED, 113 ETHOSU_PMU_AXI0_WR_DATA_BEAT_STALLED, 114 ETHOSU_PMU_AXI0_ENABLED_CYCLES, 115 ETHOSU_PMU_AXI0_RD_STALL_LIMIT, 116 ETHOSU_PMU_AXI0_WR_STALL_LIMIT, 117 ETHOSU_PMU_AXI_LATENCY_ANY, 118 ETHOSU_PMU_AXI_LATENCY_32, 119 ETHOSU_PMU_AXI_LATENCY_64, 120 ETHOSU_PMU_AXI_LATENCY_128, 121 ETHOSU_PMU_AXI_LATENCY_256, 122 ETHOSU_PMU_AXI_LATENCY_512, 123 ETHOSU_PMU_AXI_LATENCY_1024, 124 ETHOSU_PMU_ECC_DMA, 125 ETHOSU_PMU_ECC_SB0, 126 ETHOSU_PMU_AXI1_RD_TRANS_ACCEPTED, 127 ETHOSU_PMU_AXI1_RD_TRANS_COMPLETED, 128 ETHOSU_PMU_AXI1_RD_DATA_BEAT_RECEIVED, 129 ETHOSU_PMU_AXI1_RD_TRAN_REQ_STALLED, 130 ETHOSU_PMU_AXI1_WR_TRANS_ACCEPTED, 131 ETHOSU_PMU_AXI1_WR_TRANS_COMPLETED_M, 132 ETHOSU_PMU_AXI1_WR_TRANS_COMPLETED_S, 133 ETHOSU_PMU_AXI1_WR_DATA_BEAT_WRITTEN, 134 ETHOSU_PMU_AXI1_WR_TRAN_REQ_STALLED, 135 ETHOSU_PMU_AXI1_WR_DATA_BEAT_STALLED, 136 ETHOSU_PMU_AXI1_ENABLED_CYCLES, 137 ETHOSU_PMU_AXI1_RD_STALL_LIMIT, 138 ETHOSU_PMU_AXI1_WR_STALL_LIMIT, 139 ETHOSU_PMU_ECC_SB1, 140 141 ETHOSU_PMU_SENTINEL // End-marker (not event) 142 }; 143 #elif defined(ETHOSU85) 144 enum ethosu_pmu_event_type 145 { 146 ETHOSU_PMU_NO_EVENT = 0, 147 ETHOSU_PMU_CYCLE, 148 ETHOSU_PMU_NPU_IDLE, 149 ETHOSU_PMU_CC_STALLED_ON_BLOCKDEP, 150 ETHOSU_PMU_NPU_ACTIVE, 151 ETHOSU_PMU_MAC_ACTIVE, 152 ETHOSU_PMU_MAC_DPU_ACTIVE, 153 ETHOSU_PMU_MAC_STALLED_BY_W_OR_ACC, 154 ETHOSU_PMU_MAC_STALLED_BY_W, 155 ETHOSU_PMU_MAC_STALLED_BY_ACC, 156 ETHOSU_PMU_MAC_STALLED_BY_IB, 157 ETHOSU_PMU_AO_ACTIVE, 158 ETHOSU_PMU_AO_STALLED_BY_BS_OR_OB, 159 ETHOSU_PMU_AO_STALLED_BY_BS, 160 ETHOSU_PMU_AO_STALLED_BY_OB, 161 ETHOSU_PMU_AO_STALLED_BY_AB_OR_CB, 162 ETHOSU_PMU_AO_STALLED_BY_AB, 163 ETHOSU_PMU_AO_STALLED_BY_CB, 164 ETHOSU_PMU_WD_ACTIVE, 165 ETHOSU_PMU_WD_STALLED, 166 ETHOSU_PMU_WD_STALLED_BY_WD_BUF, 167 ETHOSU_PMU_WD_STALLED_BY_WS_FC, 168 ETHOSU_PMU_WD_STALLED_BY_WS_TC, 169 ETHOSU_PMU_WD_TRANS_WBLK, 170 ETHOSU_PMU_WD_TRANS_WS_FC, 171 ETHOSU_PMU_WD_TRANS_WS_TC, 172 ETHOSU_PMU_WD_STALLED_BY_WS_SC0, 173 ETHOSU_PMU_WD_STALLED_BY_WS_SC1, 174 ETHOSU_PMU_WD_STALLED_BY_WS_SC2, 175 ETHOSU_PMU_WD_STALLED_BY_WS_SC3, 176 ETHOSU_PMU_WD_PARSE_ACTIVE_SC0, 177 ETHOSU_PMU_WD_PARSE_ACTIVE_SC1, 178 ETHOSU_PMU_WD_PARSE_ACTIVE_SC2, 179 ETHOSU_PMU_WD_PARSE_ACTIVE_SC3, 180 ETHOSU_PMU_WD_PARSE_STALL_SC0, 181 ETHOSU_PMU_WD_PARSE_STALL_SC1, 182 ETHOSU_PMU_WD_PARSE_STALL_SC2, 183 ETHOSU_PMU_WD_PARSE_STALL_SC3, 184 ETHOSU_PMU_WD_PARSE_STALL_IN_SC0, 185 ETHOSU_PMU_WD_PARSE_STALL_IN_SC1, 186 ETHOSU_PMU_WD_PARSE_STALL_IN_SC2, 187 ETHOSU_PMU_WD_PARSE_STALL_IN_SC3, 188 ETHOSU_PMU_WD_PARSE_STALL_OUT_SC0, 189 ETHOSU_PMU_WD_PARSE_STALL_OUT_SC1, 190 ETHOSU_PMU_WD_PARSE_STALL_OUT_SC2, 191 ETHOSU_PMU_WD_PARSE_STALL_OUT_SC3, 192 ETHOSU_PMU_WD_TRANS_WS_SC0, 193 ETHOSU_PMU_WD_TRANS_WS_SC1, 194 ETHOSU_PMU_WD_TRANS_WS_SC2, 195 ETHOSU_PMU_WD_TRANS_WS_SC3, 196 ETHOSU_PMU_WD_TRANS_WB0, 197 ETHOSU_PMU_WD_TRANS_WB1, 198 ETHOSU_PMU_WD_TRANS_WB2, 199 ETHOSU_PMU_WD_TRANS_WB3, 200 ETHOSU_PMU_SRAM_RD_TRANS_ACCEPTED, 201 ETHOSU_PMU_SRAM_RD_TRANS_COMPLETED, 202 ETHOSU_PMU_SRAM_RD_DATA_BEAT_RECEIVED, 203 ETHOSU_PMU_SRAM_RD_TRAN_REQ_STALLED, 204 ETHOSU_PMU_SRAM_WR_TRANS_ACCEPTED, 205 ETHOSU_PMU_SRAM_WR_TRANS_COMPLETED_M, 206 ETHOSU_PMU_SRAM_WR_TRANS_COMPLETED_S, 207 ETHOSU_PMU_SRAM_WR_DATA_BEAT_WRITTEN, 208 ETHOSU_PMU_SRAM_WR_TRAN_REQ_STALLED, 209 ETHOSU_PMU_SRAM_WR_DATA_BEAT_STALLED, 210 ETHOSU_PMU_SRAM_ENABLED_CYCLES, 211 ETHOSU_PMU_SRAM_RD_STALL_LIMIT, 212 ETHOSU_PMU_SRAM_WR_STALL_LIMIT, 213 ETHOSU_PMU_AXI_LATENCY_ANY, 214 ETHOSU_PMU_AXI_LATENCY_32, 215 ETHOSU_PMU_AXI_LATENCY_64, 216 ETHOSU_PMU_AXI_LATENCY_128, 217 ETHOSU_PMU_AXI_LATENCY_256, 218 ETHOSU_PMU_AXI_LATENCY_512, 219 ETHOSU_PMU_AXI_LATENCY_1024, 220 ETHOSU_PMU_ECC_DMA, 221 ETHOSU_PMU_ECC_MAC_IB, 222 ETHOSU_PMU_ECC_MAC_AB, 223 ETHOSU_PMU_ECC_AO_CB, 224 ETHOSU_PMU_ECC_AO_OB, 225 ETHOSU_PMU_ECC_AO_LUT, 226 ETHOSU_PMU_EXT_RD_TRANS_ACCEPTED, 227 ETHOSU_PMU_EXT_RD_TRANS_COMPLETED, 228 ETHOSU_PMU_EXT_RD_DATA_BEAT_RECEIVED, 229 ETHOSU_PMU_EXT_RD_TRAN_REQ_STALLED, 230 ETHOSU_PMU_EXT_WR_TRANS_ACCEPTED, 231 ETHOSU_PMU_EXT_WR_TRANS_COMPLETED_M, 232 ETHOSU_PMU_EXT_WR_TRANS_COMPLETED_S, 233 ETHOSU_PMU_EXT_WR_DATA_BEAT_WRITTEN, 234 ETHOSU_PMU_EXT_WR_TRAN_REQ_STALLED, 235 ETHOSU_PMU_EXT_WR_DATA_BEAT_STALLED, 236 ETHOSU_PMU_EXT_ENABLED_CYCLES, 237 ETHOSU_PMU_EXT_RD_STALL_LIMIT, 238 ETHOSU_PMU_EXT_WR_STALL_LIMIT, 239 ETHOSU_PMU_SRAM0_RD_TRANS_ACCEPTED, 240 ETHOSU_PMU_SRAM0_RD_TRANS_COMPLETED, 241 ETHOSU_PMU_SRAM0_RD_DATA_BEAT_RECEIVED, 242 ETHOSU_PMU_SRAM0_RD_TRAN_REQ_STALLED, 243 ETHOSU_PMU_SRAM0_WR_TRANS_ACCEPTED, 244 ETHOSU_PMU_SRAM0_WR_TRANS_COMPLETED_M, 245 ETHOSU_PMU_SRAM0_WR_TRANS_COMPLETED_S, 246 ETHOSU_PMU_SRAM0_WR_DATA_BEAT_WRITTEN, 247 ETHOSU_PMU_SRAM0_WR_TRAN_REQ_STALLED, 248 ETHOSU_PMU_SRAM0_WR_DATA_BEAT_STALLED, 249 ETHOSU_PMU_SRAM0_ENABLED_CYCLES, 250 ETHOSU_PMU_SRAM0_RD_STALL_LIMIT, 251 ETHOSU_PMU_SRAM0_WR_STALL_LIMIT, 252 ETHOSU_PMU_SRAM1_RD_TRANS_ACCEPTED, 253 ETHOSU_PMU_SRAM1_RD_TRANS_COMPLETED, 254 ETHOSU_PMU_SRAM1_RD_DATA_BEAT_RECEIVED, 255 ETHOSU_PMU_SRAM1_RD_TRAN_REQ_STALLED, 256 ETHOSU_PMU_SRAM1_WR_TRANS_ACCEPTED, 257 ETHOSU_PMU_SRAM1_WR_TRANS_COMPLETED_M, 258 ETHOSU_PMU_SRAM1_WR_TRANS_COMPLETED_S, 259 ETHOSU_PMU_SRAM1_WR_DATA_BEAT_WRITTEN, 260 ETHOSU_PMU_SRAM1_WR_TRAN_REQ_STALLED, 261 ETHOSU_PMU_SRAM1_WR_DATA_BEAT_STALLED, 262 ETHOSU_PMU_SRAM1_ENABLED_CYCLES, 263 ETHOSU_PMU_SRAM1_RD_STALL_LIMIT, 264 ETHOSU_PMU_SRAM1_WR_STALL_LIMIT, 265 ETHOSU_PMU_SRAM2_RD_TRANS_ACCEPTED, 266 ETHOSU_PMU_SRAM2_RD_TRANS_COMPLETED, 267 ETHOSU_PMU_SRAM2_RD_DATA_BEAT_RECEIVED, 268 ETHOSU_PMU_SRAM2_RD_TRAN_REQ_STALLED, 269 ETHOSU_PMU_SRAM2_WR_TRANS_ACCEPTED, 270 ETHOSU_PMU_SRAM2_WR_TRANS_COMPLETED_M, 271 ETHOSU_PMU_SRAM2_WR_TRANS_COMPLETED_S, 272 ETHOSU_PMU_SRAM2_WR_DATA_BEAT_WRITTEN, 273 ETHOSU_PMU_SRAM2_WR_TRAN_REQ_STALLED, 274 ETHOSU_PMU_SRAM2_WR_DATA_BEAT_STALLED, 275 ETHOSU_PMU_SRAM2_ENABLED_CYCLES, 276 ETHOSU_PMU_SRAM2_RD_STALL_LIMIT, 277 ETHOSU_PMU_SRAM2_WR_STALL_LIMIT, 278 ETHOSU_PMU_SRAM3_RD_TRANS_ACCEPTED, 279 ETHOSU_PMU_SRAM3_RD_TRANS_COMPLETED, 280 ETHOSU_PMU_SRAM3_RD_DATA_BEAT_RECEIVED, 281 ETHOSU_PMU_SRAM3_RD_TRAN_REQ_STALLED, 282 ETHOSU_PMU_SRAM3_WR_TRANS_ACCEPTED, 283 ETHOSU_PMU_SRAM3_WR_TRANS_COMPLETED_M, 284 ETHOSU_PMU_SRAM3_WR_TRANS_COMPLETED_S, 285 ETHOSU_PMU_SRAM3_WR_DATA_BEAT_WRITTEN, 286 ETHOSU_PMU_SRAM3_WR_TRAN_REQ_STALLED, 287 ETHOSU_PMU_SRAM3_WR_DATA_BEAT_STALLED, 288 ETHOSU_PMU_SRAM3_ENABLED_CYCLES, 289 ETHOSU_PMU_SRAM3_RD_STALL_LIMIT, 290 ETHOSU_PMU_SRAM3_WR_STALL_LIMIT, 291 ETHOSU_PMU_EXT0_RD_TRANS_ACCEPTED, 292 ETHOSU_PMU_EXT0_RD_TRANS_COMPLETED, 293 ETHOSU_PMU_EXT0_RD_DATA_BEAT_RECEIVED, 294 ETHOSU_PMU_EXT0_RD_TRAN_REQ_STALLED, 295 ETHOSU_PMU_EXT0_WR_TRANS_ACCEPTED, 296 ETHOSU_PMU_EXT0_WR_TRANS_COMPLETED_M, 297 ETHOSU_PMU_EXT0_WR_TRANS_COMPLETED_S, 298 ETHOSU_PMU_EXT0_WR_DATA_BEAT_WRITTEN, 299 ETHOSU_PMU_EXT0_WR_TRAN_REQ_STALLED, 300 ETHOSU_PMU_EXT0_WR_DATA_BEAT_STALLED, 301 ETHOSU_PMU_EXT0_ENABLED_CYCLES, 302 ETHOSU_PMU_EXT0_RD_STALL_LIMIT, 303 ETHOSU_PMU_EXT0_WR_STALL_LIMIT, 304 ETHOSU_PMU_EXT1_RD_TRANS_ACCEPTED, 305 ETHOSU_PMU_EXT1_RD_TRANS_COMPLETED, 306 ETHOSU_PMU_EXT1_RD_DATA_BEAT_RECEIVED, 307 ETHOSU_PMU_EXT1_RD_TRAN_REQ_STALLED, 308 ETHOSU_PMU_EXT1_WR_TRANS_ACCEPTED, 309 ETHOSU_PMU_EXT1_WR_TRANS_COMPLETED_M, 310 ETHOSU_PMU_EXT1_WR_TRANS_COMPLETED_S, 311 ETHOSU_PMU_EXT1_WR_DATA_BEAT_WRITTEN, 312 ETHOSU_PMU_EXT1_WR_TRAN_REQ_STALLED, 313 ETHOSU_PMU_EXT1_WR_DATA_BEAT_STALLED, 314 ETHOSU_PMU_EXT1_ENABLED_CYCLES, 315 ETHOSU_PMU_EXT1_RD_STALL_LIMIT, 316 ETHOSU_PMU_EXT1_WR_STALL_LIMIT, 317 318 ETHOSU_PMU_SENTINEL // End-marker (not event) 319 }; 320 #else 321 #error No NPU target defined 322 #endif 323 324 /***************************************************************************** 325 * Functions 326 *****************************************************************************/ 327 328 /** 329 * \brief Enable the PMU 330 */ 331 void ETHOSU_PMU_Enable(struct ethosu_driver *drv); 332 333 /** 334 * \brief Disable the PMU 335 */ 336 void ETHOSU_PMU_Disable(struct ethosu_driver *drv); 337 338 /** 339 * \brief Set event to count for PMU eventer counter 340 * \param [in] num Event counter (0-ETHOSU_PMU_NCOUNTERS) to configure 341 * \param [in] type Event to count 342 */ 343 void ETHOSU_PMU_Set_EVTYPER(struct ethosu_driver *drv, uint32_t num, enum ethosu_pmu_event_type type); 344 345 /** 346 * \brief Get number of PMU event counters 347 * \return Number of event counters 348 */ 349 uint32_t ETHOSU_PMU_Get_NumEventCounters(void); 350 351 /** 352 * \brief Get event to count for PMU eventer counter 353 * \param [in] num Event counter (0-ETHOSU_PMU_NCOUNTERS) to configure 354 * \return type Event to count 355 */ 356 enum ethosu_pmu_event_type ETHOSU_PMU_Get_EVTYPER(struct ethosu_driver *drv, uint32_t num); 357 358 /** 359 * \brief Reset cycle counter 360 */ 361 void ETHOSU_PMU_CYCCNT_Reset(struct ethosu_driver *drv); 362 363 /** 364 * \brief Reset all event counters 365 */ 366 void ETHOSU_PMU_EVCNTR_ALL_Reset(struct ethosu_driver *drv); 367 368 /** 369 * \brief Enable counters 370 * \param [in] mask Counters to enable 371 * \note Enables one or more of the following: 372 * - event counters (bit 0-ETHOSU_PMU_NCOUNTERS) 373 * - cycle counter (bit 31) 374 */ 375 void ETHOSU_PMU_CNTR_Enable(struct ethosu_driver *drv, uint32_t mask); 376 377 /** 378 * \brief Disable counters 379 * \param [in] mask Counters to disable 380 * \note Disables one or more of the following: 381 * - event counters (bit 0-ETHOSU_PMU_NCOUNTERS) 382 * - cycle counter (bit 31) 383 */ 384 void ETHOSU_PMU_CNTR_Disable(struct ethosu_driver *drv, uint32_t mask); 385 386 /** 387 * \brief Determine counters activation 388 * 389 * \return Event count 390 * \param [in] mask Counters to enable 391 * \return a bitmask where bit-set means: 392 * - event counters activated (bit 0-ETHOSU_PMU_NCOUNTERS) 393 * - cycle counter activate (bit 31) 394 * \note ETHOSU specific. Usage breaks CMSIS complience 395 */ 396 uint32_t ETHOSU_PMU_CNTR_Status(struct ethosu_driver *drv); 397 398 /** 399 * \brief Read cycle counter (64 bit) 400 * \return Cycle count 401 * \note Two HW 32-bit registers that can increment independently in-between reads. 402 * To work-around raciness yet still avoid turning 403 * off the event both are read as one value twice. If the latter read 404 * is not greater than the former, it means overflow of LSW without 405 * incrementing MSW has occurred, in which case the former value is used. 406 */ 407 uint64_t ETHOSU_PMU_Get_CCNTR(struct ethosu_driver *drv); 408 409 /** 410 * \brief Set cycle counter (64 bit) 411 * \param [in] val Conter value 412 * \note Two HW 32-bit registers that can increment independently in-between reads. 413 * To work-around raciness, counter is temporary disabled if enabled. 414 * \note ETHOSU specific. Usage breaks CMSIS complience 415 */ 416 void ETHOSU_PMU_Set_CCNTR(struct ethosu_driver *drv, uint64_t val); 417 418 /** 419 * \brief Read event counter 420 * \param [in] num Event counter (0-ETHOSU_PMU_NCOUNTERS) 421 * \return Event count 422 */ 423 uint32_t ETHOSU_PMU_Get_EVCNTR(struct ethosu_driver *drv, uint32_t num); 424 425 /** 426 * \brief Set event counter value 427 * \param [in] num Event counter (0-ETHOSU_PMU_NCOUNTERS) 428 * \param [in] val Conter value 429 * \note ETHOSU specific. Usage breaks CMSIS complience 430 */ 431 void ETHOSU_PMU_Set_EVCNTR(struct ethosu_driver *drv, uint32_t num, uint32_t val); 432 433 /** 434 * \brief Read counter overflow status 435 * \return Counter overflow status bits for the following: 436 * - event counters (bit 0-ETHOSU_PMU_NCOUNTERS)) 437 * - cycle counter (bit 31) 438 */ 439 uint32_t ETHOSU_PMU_Get_CNTR_OVS(struct ethosu_driver *drv); 440 441 /** 442 * \brief Clear counter overflow status 443 * \param [in] mask Counter overflow status bits to clear 444 * \note Clears overflow status bits for one or more of the following: 445 * - event counters (bit 0-ETHOSU_PMU_NCOUNTERS) 446 * - cycle counter (bit 31) 447 */ 448 void ETHOSU_PMU_Set_CNTR_OVS(struct ethosu_driver *drv, uint32_t mask); 449 450 /** 451 * \brief Enable counter overflow interrupt request 452 * \param [in] mask Counter overflow interrupt request bits to set 453 * \note Sets overflow interrupt request bits for one or more of the following: 454 * - event counters (bit 0-ETHOSU_PMU_NCOUNTERS) 455 * - cycle counter (bit 31) 456 */ 457 void ETHOSU_PMU_Set_CNTR_IRQ_Enable(struct ethosu_driver *drv, uint32_t mask); 458 459 /** 460 * \brief Disable counter overflow interrupt request 461 * \param [in] mask Counter overflow interrupt request bits to clear 462 * \note Clears overflow interrupt request bits for one or more of the following: 463 * - event counters (bit 0-ETHOSU_PMU_NCOUNTERS) 464 * - cycle counter (bit 31) 465 */ 466 void ETHOSU_PMU_Set_CNTR_IRQ_Disable(struct ethosu_driver *drv, uint32_t mask); 467 468 /** 469 * \brief Get counters overflow interrupt request stiinings 470 * \return mask Counter overflow interrupt request bits 471 * \note Sets overflow interrupt request bits for one or more of the following: 472 * - event counters (bit 0-ETHOSU_PMU_NCOUNTERS) 473 * - cycle counter (bit 31) 474 * \note ETHOSU specific. Usage breaks CMSIS compliance 475 */ 476 uint32_t ETHOSU_PMU_Get_IRQ_Enable(struct ethosu_driver *drv); 477 478 /** 479 * \brief Software increment event counter 480 * \param [in] mask Counters to increment 481 * - event counters (bit 0-ETHOSU_PMU_NCOUNTERS) 482 * - cycle counter (bit 31) 483 * \note Software increment bits for one or more event counters. 484 */ 485 void ETHOSU_PMU_CNTR_Increment(struct ethosu_driver *drv, uint32_t mask); 486 487 /** 488 * \brief Set start event number for the cycle counter 489 * \param [in] start_event Event to trigger start of the cycle counter 490 * \note Sets the event number that starts the cycle counter. 491 */ 492 void ETHOSU_PMU_PMCCNTR_CFG_Set_Start_Event(struct ethosu_driver *drv, enum ethosu_pmu_event_type start_event); 493 494 /** 495 * \brief Set stop event number for the cycle counter 496 * \param [in] stop_event Event number 497 * \note Sets the event number that stops the cycle counter. 498 */ 499 void ETHOSU_PMU_PMCCNTR_CFG_Set_Stop_Event(struct ethosu_driver *drv, enum ethosu_pmu_event_type stop_event); 500 501 /** 502 * \brief Read qread register 503 */ 504 uint32_t ETHOSU_PMU_Get_QREAD(struct ethosu_driver *drv); 505 506 /** 507 * \brief Read status register 508 */ 509 uint32_t ETHOSU_PMU_Get_STATUS(struct ethosu_driver *drv); 510 511 #ifdef __cplusplus 512 } 513 #endif 514 515 #endif /* PMU_ETHOSU_H */ 516