blob: 759a722f002c2e6dd7ff64f2fbebc05c1b5d6489 [file] [log] [blame]
Kristofer Jonsson537c71c2020-05-05 14:17:22 +02001/*
2 * Copyright (c) 2019-2020 Arm Limited. All rights reserved.
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 *
6 * Licensed under the Apache License, Version 2.0 (the License); you may
7 * not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
14 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 */
18
19/*****************************************************************************
20 * Includes
21 *****************************************************************************/
22
23#include "ethosu55_interface.h"
24#include "ethosu_common.h"
Bhavik Pateldae5be02020-06-18 15:25:15 +020025#include "ethosu_driver.h"
26#include "pmu_ethosu.h"
27
Kristofer Jonsson537c71c2020-05-05 14:17:22 +020028#include <assert.h>
Per Åstrande07b1f92020-09-28 08:31:46 +020029#include <inttypes.h>
Bhavik Pateldae5be02020-06-18 15:25:15 +020030#include <stddef.h>
Kristofer Jonsson537c71c2020-05-05 14:17:22 +020031
32/*****************************************************************************
33 * Defines
34 *****************************************************************************/
35
36#define COMMA ,
37#define SEMICOLON ;
38
Kristofer Jonsson537c71c2020-05-05 14:17:22 +020039#define EVTYPE(A, name) \
40 case PMU_EVENT_TYPE_##name: \
41 return ETHOSU_PMU_##name
42
43#define EVID(A, name) (PMU_EVENT_TYPE_##name)
44
Bhavik Patel8e32b0b2020-06-23 13:48:25 +020045#define NPU_REG_PMEVCNTR(x) (NPU_REG_PMEVCNTR0 + ((x) * sizeof(uint32_t)))
46#define NPU_REG_PMEVTYPER(x) (NPU_REG_PMEVTYPER0 + ((x) * sizeof(uint32_t)))
47
Kristofer Jonsson537c71c2020-05-05 14:17:22 +020048/*****************************************************************************
49 * Variables
50 *****************************************************************************/
51
Kristofer Jonsson537c71c2020-05-05 14:17:22 +020052static const enum pmu_event_type eventbyid[] = {EXPAND_PMU_EVENT_TYPE(EVID, COMMA)};
53
54/*****************************************************************************
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +020055 * Static functions
Kristofer Jonsson537c71c2020-05-05 14:17:22 +020056 *****************************************************************************/
57
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +020058static enum ethosu_pmu_event_type pmu_event_type(uint32_t id)
Kristofer Jonsson537c71c2020-05-05 14:17:22 +020059{
60 switch (id)
61 {
62 EXPAND_PMU_EVENT_TYPE(EVTYPE, SEMICOLON);
Per Åstrande07b1f92020-09-28 08:31:46 +020063 default:
64 LOG_ERR("Unknown PMU event id: 0x%" PRIx32 "\n", id);
Kristofer Jonsson537c71c2020-05-05 14:17:22 +020065 }
66
67 return ETHOSU_PMU_SENTINEL;
68}
69
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +020070static uint32_t pmu_event_value(enum ethosu_pmu_event_type event)
Kristofer Jonsson537c71c2020-05-05 14:17:22 +020071{
Per Åstrand51c18ba2020-09-28 11:25:36 +020072 int a = event;
73 if ((a < ETHOSU_PMU_SENTINEL) && (a >= ETHOSU_PMU_NO_EVENT))
74 {
75 return eventbyid[event];
76 }
77 else
Kristofer Jonsson537c71c2020-05-05 14:17:22 +020078 {
79 return (uint32_t)(-1);
80 }
Kristofer Jonsson537c71c2020-05-05 14:17:22 +020081}
82
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +020083/*****************************************************************************
84 * Functions
85 *****************************************************************************/
Bhavik Patel8e32b0b2020-06-23 13:48:25 +020086
Anton Moberg61da4d32020-12-22 16:00:31 +010087void ETHOSU_PMU_Enable_v2(struct ethosu_driver *drv)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +020088{
Kristofer Jonssonef387ea2020-08-25 16:32:21 +020089 LOG_DEBUG("%s:\n", __FUNCTION__);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +020090 struct pmcr_r pmcr;
Anton Moberg61da4d32020-12-22 16:00:31 +010091 pmcr.word = drv->dev.pmcr;
Bhavik Patel8e32b0b2020-06-23 13:48:25 +020092 pmcr.cnt_en = 1;
Anton Moberg61da4d32020-12-22 16:00:31 +010093 ethosu_write_reg_shadow(&drv->dev, NPU_REG_PMCR, pmcr.word, &drv->dev.pmcr);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +020094}
95
Anton Moberg61da4d32020-12-22 16:00:31 +010096void ETHOSU_PMU_Disable_v2(struct ethosu_driver *drv)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +020097{
Kristofer Jonssonef387ea2020-08-25 16:32:21 +020098 LOG_DEBUG("%s:\n", __FUNCTION__);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +020099 struct pmcr_r pmcr;
Anton Moberg61da4d32020-12-22 16:00:31 +0100100 pmcr.word = drv->dev.pmcr;
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200101 pmcr.cnt_en = 0;
Anton Moberg61da4d32020-12-22 16:00:31 +0100102 ethosu_write_reg_shadow(&drv->dev, NPU_REG_PMCR, pmcr.word, &drv->dev.pmcr);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200103}
104
Anton Moberg61da4d32020-12-22 16:00:31 +0100105void ETHOSU_PMU_Set_EVTYPER_v2(struct ethosu_driver *drv, uint32_t num, enum ethosu_pmu_event_type type)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200106{
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200107 ASSERT(num < ETHOSU_PMU_NCOUNTERS);
108 uint32_t val = pmu_event_value(type);
109 LOG_DEBUG("%s: num=%u, type=%d, val=%u\n", __FUNCTION__, num, type, val);
Anton Moberg61da4d32020-12-22 16:00:31 +0100110 ethosu_write_reg_shadow(&drv->dev, NPU_REG_PMEVTYPER(num), val, &drv->dev.pmu_evtypr[num]);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200111}
112
Anton Moberg61da4d32020-12-22 16:00:31 +0100113enum ethosu_pmu_event_type ETHOSU_PMU_Get_EVTYPER_v2(struct ethosu_driver *drv, uint32_t num)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200114{
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200115 ASSERT(num < ETHOSU_PMU_NCOUNTERS);
Anton Moberg61da4d32020-12-22 16:00:31 +0100116 uint32_t val = drv->dev.pmu_evtypr[num];
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200117 enum ethosu_pmu_event_type type = pmu_event_type(val);
118 LOG_DEBUG("%s: num=%u, type=%d, val=%u\n", __FUNCTION__, num, type, val);
119 return type;
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200120}
121
Anton Moberg61da4d32020-12-22 16:00:31 +0100122void ETHOSU_PMU_CYCCNT_Reset_v2(struct ethosu_driver *drv)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200123{
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200124 LOG_DEBUG("%s:\n", __FUNCTION__);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200125 struct pmcr_r pmcr;
Anton Moberg61da4d32020-12-22 16:00:31 +0100126 pmcr.word = drv->dev.pmcr;
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200127 pmcr.cycle_cnt_rst = 1;
Anton Moberg61da4d32020-12-22 16:00:31 +0100128 ethosu_write_reg_shadow(&drv->dev, NPU_REG_PMCR, pmcr.word, &drv->dev.pmcr);
129 drv->dev.pmccntr[0] = 0;
130 drv->dev.pmccntr[1] = 0;
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200131}
132
Anton Moberg61da4d32020-12-22 16:00:31 +0100133void ETHOSU_PMU_EVCNTR_ALL_Reset_v2(struct ethosu_driver *drv)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200134{
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200135 LOG_DEBUG("%s:\n", __FUNCTION__);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200136 struct pmcr_r pmcr;
Anton Moberg61da4d32020-12-22 16:00:31 +0100137 pmcr.word = drv->dev.pmcr;
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200138 pmcr.event_cnt_rst = 1;
Anton Moberg61da4d32020-12-22 16:00:31 +0100139 ethosu_write_reg_shadow(&drv->dev, NPU_REG_PMCR, pmcr.word, &drv->dev.pmcr);
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200140
141 for (uint32_t i = 0; i < ETHOSU_PMU_NCOUNTERS; i++)
142 {
Anton Moberg61da4d32020-12-22 16:00:31 +0100143 drv->dev.pmu_evcntr[i] = 0;
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200144 }
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200145}
146
Anton Moberg61da4d32020-12-22 16:00:31 +0100147void ETHOSU_PMU_CNTR_Enable_v2(struct ethosu_driver *drv, uint32_t mask)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200148{
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200149 LOG_DEBUG("%s: mask=0x%08x\n", __FUNCTION__, mask);
Anton Moberg61da4d32020-12-22 16:00:31 +0100150 ethosu_write_reg_shadow(&drv->dev, NPU_REG_PMCNTENSET, mask, &drv->dev.pmcnten);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200151}
152
Anton Moberg61da4d32020-12-22 16:00:31 +0100153void ETHOSU_PMU_CNTR_Disable_v2(struct ethosu_driver *drv, uint32_t mask)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200154{
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200155 LOG_DEBUG("%s: mask=0x%08x\n", __FUNCTION__, mask);
Anton Moberg61da4d32020-12-22 16:00:31 +0100156 ethosu_write_reg_shadow(&drv->dev, NPU_REG_PMCNTENCLR, mask, &drv->dev.pmcnten);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200157}
158
Anton Moberg61da4d32020-12-22 16:00:31 +0100159uint32_t ETHOSU_PMU_CNTR_Status_v2(struct ethosu_driver *drv)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200160{
Anton Moberg61da4d32020-12-22 16:00:31 +0100161 LOG_DEBUG("%s: mask=0x%08x\n", __FUNCTION__, drv->dev.pmcnten);
162 return drv->dev.pmcnten;
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200163}
164
Anton Moberg61da4d32020-12-22 16:00:31 +0100165uint64_t ETHOSU_PMU_Get_CCNTR_v2(struct ethosu_driver *drv)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200166{
Anton Moberg61da4d32020-12-22 16:00:31 +0100167 uint32_t val_lo = ethosu_read_reg(&drv->dev, NPU_REG_PMCCNTR_LO);
168 uint32_t val_hi = ethosu_read_reg(&drv->dev, NPU_REG_PMCCNTR_HI);
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200169 uint64_t val = ((uint64_t)val_hi << 32) | val_lo;
Anton Moberg61da4d32020-12-22 16:00:31 +0100170 uint64_t shadow = ((uint64_t)drv->dev.pmccntr[1] << 32) | drv->dev.pmccntr[0];
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200171
Kristofer Jonssonbad5a492020-10-23 10:45:30 +0200172 LOG_DEBUG("%s: val=%" PRIu64 ", shadow=%" PRIu64 "\n", __FUNCTION__, val, shadow);
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200173
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200174 // Return the shadow variable in case the NPU was powered off and lost the cycle count
175 if (shadow > val)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200176 {
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200177 return shadow;
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200178 }
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200179
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200180 // Update the shadow variable
Anton Moberg61da4d32020-12-22 16:00:31 +0100181 drv->dev.pmccntr[0] = val_lo;
182 drv->dev.pmccntr[1] = val_hi;
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200183
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200184 return val;
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200185}
186
Anton Moberg61da4d32020-12-22 16:00:31 +0100187void ETHOSU_PMU_Set_CCNTR_v2(struct ethosu_driver *drv, uint64_t val)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200188{
Anton Moberg61da4d32020-12-22 16:00:31 +0100189 uint32_t active = ETHOSU_PMU_CNTR_Status_v2(drv) & ETHOSU_PMU_CCNT_Msk;
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200190
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200191 LOG_DEBUG("%s: val=%llu\n", __FUNCTION__, val);
192
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200193 if (active)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200194 {
Anton Moberg61da4d32020-12-22 16:00:31 +0100195 ETHOSU_PMU_CNTR_Disable_v2(drv, ETHOSU_PMU_CCNT_Msk);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200196 }
197
Anton Moberg61da4d32020-12-22 16:00:31 +0100198 ethosu_write_reg_shadow(&drv->dev, NPU_REG_PMCCNTR_LO, val & MASK_0_31_BITS, &drv->dev.pmccntr[0]);
199 ethosu_write_reg_shadow(&drv->dev, NPU_REG_PMCCNTR_HI, (val & MASK_32_47_BITS) >> 32, &drv->dev.pmccntr[1]);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200200
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200201 if (active)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200202 {
Anton Moberg61da4d32020-12-22 16:00:31 +0100203 ETHOSU_PMU_CNTR_Enable_v2(drv, ETHOSU_PMU_CCNT_Msk);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200204 }
205}
206
Anton Moberg61da4d32020-12-22 16:00:31 +0100207uint32_t ETHOSU_PMU_Get_EVCNTR_v2(struct ethosu_driver *drv, uint32_t num)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200208{
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200209 ASSERT(num < ETHOSU_PMU_NCOUNTERS);
Anton Moberg61da4d32020-12-22 16:00:31 +0100210 uint32_t val = ethosu_read_reg(&drv->dev, NPU_REG_PMEVCNTR(num));
211 LOG_DEBUG("%s: num=%u, val=%u, shadow=%u\n", __FUNCTION__, num, val, drv->dev.pmu_evcntr[num]);
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200212
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200213 // Return the shadow variable in case the NPU was powered off and lost the event count
Anton Moberg61da4d32020-12-22 16:00:31 +0100214 if (drv->dev.pmu_evcntr[num] > val)
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200215 {
Anton Moberg61da4d32020-12-22 16:00:31 +0100216 return drv->dev.pmu_evcntr[num];
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200217 }
218
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200219 // Update the shadow variable
Anton Moberg61da4d32020-12-22 16:00:31 +0100220 drv->dev.pmu_evcntr[num] = val;
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200221
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200222 return val;
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200223}
224
Anton Moberg61da4d32020-12-22 16:00:31 +0100225void ETHOSU_PMU_Set_EVCNTR_v2(struct ethosu_driver *drv, uint32_t num, uint32_t val)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200226{
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200227 ASSERT(num < ETHOSU_PMU_NCOUNTERS);
228 LOG_DEBUG("%s: num=%u, val=%u\n", __FUNCTION__, num, val);
Anton Moberg61da4d32020-12-22 16:00:31 +0100229 ethosu_write_reg(&drv->dev, NPU_REG_PMEVCNTR(num), val);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200230}
231
Anton Moberg61da4d32020-12-22 16:00:31 +0100232uint32_t ETHOSU_PMU_Get_CNTR_OVS_v2(struct ethosu_driver *drv)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200233{
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200234 LOG_DEBUG("%s:\n", __FUNCTION__);
Anton Moberg61da4d32020-12-22 16:00:31 +0100235 return ethosu_read_reg(&drv->dev, NPU_REG_PMOVSSET);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200236}
237
Anton Moberg61da4d32020-12-22 16:00:31 +0100238void ETHOSU_PMU_Set_CNTR_OVS_v2(struct ethosu_driver *drv, uint32_t mask)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200239{
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200240 LOG_DEBUG("%s:\n", __FUNCTION__);
Anton Moberg61da4d32020-12-22 16:00:31 +0100241 ethosu_write_reg(&drv->dev, NPU_REG_PMOVSCLR, mask);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200242}
243
Anton Moberg61da4d32020-12-22 16:00:31 +0100244void ETHOSU_PMU_Set_CNTR_IRQ_Enable_v2(struct ethosu_driver *drv, uint32_t mask)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200245{
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200246 LOG_DEBUG("%s: mask=0x%08x\n", __FUNCTION__, mask);
Anton Moberg61da4d32020-12-22 16:00:31 +0100247 ethosu_write_reg_shadow(&drv->dev, NPU_REG_PMINTSET, mask, &drv->dev.pmint);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200248}
249
Anton Moberg61da4d32020-12-22 16:00:31 +0100250void ETHOSU_PMU_Set_CNTR_IRQ_Disable_v2(struct ethosu_driver *drv, uint32_t mask)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200251{
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200252 LOG_DEBUG("%s: mask=0x%08x\n", __FUNCTION__, mask);
Anton Moberg61da4d32020-12-22 16:00:31 +0100253 ethosu_write_reg_shadow(&drv->dev, NPU_REG_PMINTCLR, mask, &drv->dev.pmint);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200254}
255
Anton Moberg61da4d32020-12-22 16:00:31 +0100256uint32_t ETHOSU_PMU_Get_IRQ_Enable_v2(struct ethosu_driver *drv)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200257{
Anton Moberg61da4d32020-12-22 16:00:31 +0100258 LOG_DEBUG("%s: mask=0x%08x\n", __FUNCTION__, drv->dev.pmint);
259 return drv->dev.pmint;
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200260}
261
Anton Moberg61da4d32020-12-22 16:00:31 +0100262void ETHOSU_PMU_CNTR_Increment_v2(struct ethosu_driver *drv, uint32_t mask)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200263{
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200264 LOG_DEBUG("%s:\n", __FUNCTION__);
Anton Moberg61da4d32020-12-22 16:00:31 +0100265 uint32_t cntrs_active = ETHOSU_PMU_CNTR_Status_v2(drv);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200266
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200267 // Disable counters
Anton Moberg61da4d32020-12-22 16:00:31 +0100268 ETHOSU_PMU_CNTR_Disable_v2(drv, mask);
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200269
270 // Increment cycle counter
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200271 if (mask & ETHOSU_PMU_CCNT_Msk)
272 {
Anton Moberg61da4d32020-12-22 16:00:31 +0100273 uint64_t val = ETHOSU_PMU_Get_CCNTR_v2(drv) + 1;
274 ethosu_write_reg_shadow(&drv->dev, NPU_REG_PMCCNTR_LO, val & MASK_0_31_BITS, &drv->dev.pmccntr[0]);
275 ethosu_write_reg_shadow(&drv->dev, NPU_REG_PMCCNTR_HI, (val & MASK_32_47_BITS) >> 32, &drv->dev.pmccntr[1]);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200276 }
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200277
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200278 for (int i = 0; i < ETHOSU_PMU_NCOUNTERS; i++)
279 {
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200280 if (mask & (1 << i))
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200281 {
Anton Moberg61da4d32020-12-22 16:00:31 +0100282 uint32_t val = ETHOSU_PMU_Get_EVCNTR_v2(drv, i);
283 ethosu_write_reg_shadow(&drv->dev, NPU_REG_PMEVCNTR(i), val + 1, &drv->dev.pmu_evcntr[i]);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200284 }
285 }
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200286
287 // Reenable the active counters
Anton Moberg61da4d32020-12-22 16:00:31 +0100288 ETHOSU_PMU_CNTR_Enable_v2(drv, cntrs_active);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200289}
290
Anton Moberg61da4d32020-12-22 16:00:31 +0100291void ETHOSU_PMU_PMCCNTR_CFG_Set_Start_Event_v2(struct ethosu_driver *drv, uint32_t start_event)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200292{
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200293 LOG_DEBUG("%s: start_event=%u\n", __FUNCTION__, start_event);
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200294 struct pmccntr_cfg_r cfg;
Anton Moberg61da4d32020-12-22 16:00:31 +0100295 cfg.word = drv->dev.pmccntr_cfg;
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200296 cfg.CYCLE_CNT_CFG_START = start_event;
Anton Moberg61da4d32020-12-22 16:00:31 +0100297 ethosu_write_reg_shadow(&drv->dev, NPU_REG_PMCCNTR_CFG, cfg.word, &drv->dev.pmccntr_cfg);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200298}
299
Anton Moberg61da4d32020-12-22 16:00:31 +0100300void ETHOSU_PMU_PMCCNTR_CFG_Set_Stop_Event_v2(struct ethosu_driver *drv, uint32_t stop_event)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200301{
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200302 LOG_DEBUG("%s: stop_event=%u\n", __FUNCTION__, stop_event);
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200303 struct pmccntr_cfg_r cfg;
Anton Moberg61da4d32020-12-22 16:00:31 +0100304 cfg.word = drv->dev.pmccntr_cfg;
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200305 cfg.CYCLE_CNT_CFG_STOP = stop_event;
Anton Moberg61da4d32020-12-22 16:00:31 +0100306 ethosu_write_reg_shadow(&drv->dev, NPU_REG_PMCCNTR_CFG, cfg.word, &drv->dev.pmccntr_cfg);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200307}