blob: a5143e2489a7f8e3ceb0cc4956bd9ea3f18ac034 [file] [log] [blame]
Kristofer Jonsson537c71c2020-05-05 14:17:22 +02001/*
Per Åstrand0fd65ce2021-03-11 10:25:18 +01002 * Copyright (c) 2019-2021 Arm Limited. All rights reserved.
Kristofer Jonsson537c71c2020-05-05 14:17:22 +02003 *
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 Moberg0a614292021-03-24 14:08:22 +010093 set_clock_and_power_request(drv, ETHOSU_PMU_REQUEST, ETHOSU_CLOCK_Q_DISABLE, ETHOSU_POWER_Q_DISABLE);
Anton Moberg61da4d32020-12-22 16:00:31 +010094 ethosu_write_reg_shadow(&drv->dev, NPU_REG_PMCR, pmcr.word, &drv->dev.pmcr);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +020095}
96
Anton Moberg61da4d32020-12-22 16:00:31 +010097void ETHOSU_PMU_Disable_v2(struct ethosu_driver *drv)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +020098{
Kristofer Jonssonef387ea2020-08-25 16:32:21 +020099 LOG_DEBUG("%s:\n", __FUNCTION__);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200100 struct pmcr_r pmcr;
Anton Moberg61da4d32020-12-22 16:00:31 +0100101 pmcr.word = drv->dev.pmcr;
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200102 pmcr.cnt_en = 0;
Anton Moberg0a614292021-03-24 14:08:22 +0100103 set_clock_and_power_request(drv, ETHOSU_PMU_REQUEST, ETHOSU_CLOCK_Q_ENABLE, ETHOSU_POWER_Q_ENABLE);
Anton Moberg61da4d32020-12-22 16:00:31 +0100104 ethosu_write_reg_shadow(&drv->dev, NPU_REG_PMCR, pmcr.word, &drv->dev.pmcr);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200105}
106
Anton Moberg61da4d32020-12-22 16:00:31 +0100107void 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 +0200108{
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200109 ASSERT(num < ETHOSU_PMU_NCOUNTERS);
110 uint32_t val = pmu_event_value(type);
111 LOG_DEBUG("%s: num=%u, type=%d, val=%u\n", __FUNCTION__, num, type, val);
Anton Moberg61da4d32020-12-22 16:00:31 +0100112 ethosu_write_reg_shadow(&drv->dev, NPU_REG_PMEVTYPER(num), val, &drv->dev.pmu_evtypr[num]);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200113}
114
Anton Moberg61da4d32020-12-22 16:00:31 +0100115enum ethosu_pmu_event_type ETHOSU_PMU_Get_EVTYPER_v2(struct ethosu_driver *drv, uint32_t num)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200116{
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200117 ASSERT(num < ETHOSU_PMU_NCOUNTERS);
Anton Moberg61da4d32020-12-22 16:00:31 +0100118 uint32_t val = drv->dev.pmu_evtypr[num];
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200119 enum ethosu_pmu_event_type type = pmu_event_type(val);
120 LOG_DEBUG("%s: num=%u, type=%d, val=%u\n", __FUNCTION__, num, type, val);
121 return type;
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200122}
123
Anton Moberg61da4d32020-12-22 16:00:31 +0100124void ETHOSU_PMU_CYCCNT_Reset_v2(struct ethosu_driver *drv)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200125{
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200126 LOG_DEBUG("%s:\n", __FUNCTION__);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200127 struct pmcr_r pmcr;
Anton Moberg61da4d32020-12-22 16:00:31 +0100128 pmcr.word = drv->dev.pmcr;
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200129 pmcr.cycle_cnt_rst = 1;
Anton Moberg61da4d32020-12-22 16:00:31 +0100130 ethosu_write_reg_shadow(&drv->dev, NPU_REG_PMCR, pmcr.word, &drv->dev.pmcr);
131 drv->dev.pmccntr[0] = 0;
132 drv->dev.pmccntr[1] = 0;
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200133}
134
Anton Moberg61da4d32020-12-22 16:00:31 +0100135void ETHOSU_PMU_EVCNTR_ALL_Reset_v2(struct ethosu_driver *drv)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200136{
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200137 LOG_DEBUG("%s:\n", __FUNCTION__);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200138 struct pmcr_r pmcr;
Anton Moberg61da4d32020-12-22 16:00:31 +0100139 pmcr.word = drv->dev.pmcr;
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200140 pmcr.event_cnt_rst = 1;
Anton Moberg61da4d32020-12-22 16:00:31 +0100141 ethosu_write_reg_shadow(&drv->dev, NPU_REG_PMCR, pmcr.word, &drv->dev.pmcr);
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200142
143 for (uint32_t i = 0; i < ETHOSU_PMU_NCOUNTERS; i++)
144 {
Anton Moberg61da4d32020-12-22 16:00:31 +0100145 drv->dev.pmu_evcntr[i] = 0;
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200146 }
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200147}
148
Anton Moberg61da4d32020-12-22 16:00:31 +0100149void ETHOSU_PMU_CNTR_Enable_v2(struct ethosu_driver *drv, uint32_t mask)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200150{
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200151 LOG_DEBUG("%s: mask=0x%08x\n", __FUNCTION__, mask);
Anton Moberg61da4d32020-12-22 16:00:31 +0100152 ethosu_write_reg_shadow(&drv->dev, NPU_REG_PMCNTENSET, mask, &drv->dev.pmcnten);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200153}
154
Anton Moberg61da4d32020-12-22 16:00:31 +0100155void ETHOSU_PMU_CNTR_Disable_v2(struct ethosu_driver *drv, uint32_t mask)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200156{
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200157 LOG_DEBUG("%s: mask=0x%08x\n", __FUNCTION__, mask);
Anton Moberg61da4d32020-12-22 16:00:31 +0100158 ethosu_write_reg_shadow(&drv->dev, NPU_REG_PMCNTENCLR, mask, &drv->dev.pmcnten);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200159}
160
Anton Moberg61da4d32020-12-22 16:00:31 +0100161uint32_t ETHOSU_PMU_CNTR_Status_v2(struct ethosu_driver *drv)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200162{
Anton Moberg61da4d32020-12-22 16:00:31 +0100163 LOG_DEBUG("%s: mask=0x%08x\n", __FUNCTION__, drv->dev.pmcnten);
164 return drv->dev.pmcnten;
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200165}
166
Anton Moberg61da4d32020-12-22 16:00:31 +0100167uint64_t ETHOSU_PMU_Get_CCNTR_v2(struct ethosu_driver *drv)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200168{
Anton Moberg61da4d32020-12-22 16:00:31 +0100169 uint32_t val_lo = ethosu_read_reg(&drv->dev, NPU_REG_PMCCNTR_LO);
170 uint32_t val_hi = ethosu_read_reg(&drv->dev, NPU_REG_PMCCNTR_HI);
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200171 uint64_t val = ((uint64_t)val_hi << 32) | val_lo;
Anton Moberg61da4d32020-12-22 16:00:31 +0100172 uint64_t shadow = ((uint64_t)drv->dev.pmccntr[1] << 32) | drv->dev.pmccntr[0];
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200173
Kristofer Jonssonbad5a492020-10-23 10:45:30 +0200174 LOG_DEBUG("%s: val=%" PRIu64 ", shadow=%" PRIu64 "\n", __FUNCTION__, val, shadow);
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200175
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200176 // Return the shadow variable in case the NPU was powered off and lost the cycle count
177 if (shadow > val)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200178 {
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200179 return shadow;
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200180 }
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200181
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200182 // Update the shadow variable
Anton Moberg61da4d32020-12-22 16:00:31 +0100183 drv->dev.pmccntr[0] = val_lo;
184 drv->dev.pmccntr[1] = val_hi;
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200185
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200186 return val;
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200187}
188
Anton Moberg61da4d32020-12-22 16:00:31 +0100189void ETHOSU_PMU_Set_CCNTR_v2(struct ethosu_driver *drv, uint64_t val)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200190{
Anton Moberg61da4d32020-12-22 16:00:31 +0100191 uint32_t active = ETHOSU_PMU_CNTR_Status_v2(drv) & ETHOSU_PMU_CCNT_Msk;
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200192
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200193 LOG_DEBUG("%s: val=%llu\n", __FUNCTION__, val);
194
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200195 if (active)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200196 {
Anton Moberg61da4d32020-12-22 16:00:31 +0100197 ETHOSU_PMU_CNTR_Disable_v2(drv, ETHOSU_PMU_CCNT_Msk);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200198 }
199
Anton Moberg61da4d32020-12-22 16:00:31 +0100200 ethosu_write_reg_shadow(&drv->dev, NPU_REG_PMCCNTR_LO, val & MASK_0_31_BITS, &drv->dev.pmccntr[0]);
201 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 +0200202
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200203 if (active)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200204 {
Anton Moberg61da4d32020-12-22 16:00:31 +0100205 ETHOSU_PMU_CNTR_Enable_v2(drv, ETHOSU_PMU_CCNT_Msk);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200206 }
207}
208
Anton Moberg61da4d32020-12-22 16:00:31 +0100209uint32_t ETHOSU_PMU_Get_EVCNTR_v2(struct ethosu_driver *drv, uint32_t num)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200210{
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200211 ASSERT(num < ETHOSU_PMU_NCOUNTERS);
Anton Moberg61da4d32020-12-22 16:00:31 +0100212 uint32_t val = ethosu_read_reg(&drv->dev, NPU_REG_PMEVCNTR(num));
213 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 +0200214
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200215 // Return the shadow variable in case the NPU was powered off and lost the event count
Anton Moberg61da4d32020-12-22 16:00:31 +0100216 if (drv->dev.pmu_evcntr[num] > val)
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200217 {
Anton Moberg61da4d32020-12-22 16:00:31 +0100218 return drv->dev.pmu_evcntr[num];
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200219 }
220
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200221 // Update the shadow variable
Anton Moberg61da4d32020-12-22 16:00:31 +0100222 drv->dev.pmu_evcntr[num] = val;
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200223
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200224 return val;
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200225}
226
Anton Moberg61da4d32020-12-22 16:00:31 +0100227void ETHOSU_PMU_Set_EVCNTR_v2(struct ethosu_driver *drv, uint32_t num, uint32_t val)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200228{
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200229 ASSERT(num < ETHOSU_PMU_NCOUNTERS);
230 LOG_DEBUG("%s: num=%u, val=%u\n", __FUNCTION__, num, val);
Anton Moberg61da4d32020-12-22 16:00:31 +0100231 ethosu_write_reg(&drv->dev, NPU_REG_PMEVCNTR(num), val);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200232}
233
Anton Moberg61da4d32020-12-22 16:00:31 +0100234uint32_t ETHOSU_PMU_Get_CNTR_OVS_v2(struct ethosu_driver *drv)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200235{
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200236 LOG_DEBUG("%s:\n", __FUNCTION__);
Anton Moberg61da4d32020-12-22 16:00:31 +0100237 return ethosu_read_reg(&drv->dev, NPU_REG_PMOVSSET);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200238}
239
Anton Moberg61da4d32020-12-22 16:00:31 +0100240void ETHOSU_PMU_Set_CNTR_OVS_v2(struct ethosu_driver *drv, uint32_t mask)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200241{
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200242 LOG_DEBUG("%s:\n", __FUNCTION__);
Anton Moberg61da4d32020-12-22 16:00:31 +0100243 ethosu_write_reg(&drv->dev, NPU_REG_PMOVSCLR, mask);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200244}
245
Anton Moberg61da4d32020-12-22 16:00:31 +0100246void ETHOSU_PMU_Set_CNTR_IRQ_Enable_v2(struct ethosu_driver *drv, uint32_t mask)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200247{
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200248 LOG_DEBUG("%s: mask=0x%08x\n", __FUNCTION__, mask);
Anton Moberg61da4d32020-12-22 16:00:31 +0100249 ethosu_write_reg_shadow(&drv->dev, NPU_REG_PMINTSET, mask, &drv->dev.pmint);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200250}
251
Anton Moberg61da4d32020-12-22 16:00:31 +0100252void ETHOSU_PMU_Set_CNTR_IRQ_Disable_v2(struct ethosu_driver *drv, uint32_t mask)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200253{
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200254 LOG_DEBUG("%s: mask=0x%08x\n", __FUNCTION__, mask);
Anton Moberg61da4d32020-12-22 16:00:31 +0100255 ethosu_write_reg_shadow(&drv->dev, NPU_REG_PMINTCLR, mask, &drv->dev.pmint);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200256}
257
Anton Moberg61da4d32020-12-22 16:00:31 +0100258uint32_t ETHOSU_PMU_Get_IRQ_Enable_v2(struct ethosu_driver *drv)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200259{
Anton Moberg61da4d32020-12-22 16:00:31 +0100260 LOG_DEBUG("%s: mask=0x%08x\n", __FUNCTION__, drv->dev.pmint);
261 return drv->dev.pmint;
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200262}
263
Anton Moberg61da4d32020-12-22 16:00:31 +0100264void ETHOSU_PMU_CNTR_Increment_v2(struct ethosu_driver *drv, uint32_t mask)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200265{
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200266 LOG_DEBUG("%s:\n", __FUNCTION__);
Anton Moberg61da4d32020-12-22 16:00:31 +0100267 uint32_t cntrs_active = ETHOSU_PMU_CNTR_Status_v2(drv);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200268
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200269 // Disable counters
Anton Moberg61da4d32020-12-22 16:00:31 +0100270 ETHOSU_PMU_CNTR_Disable_v2(drv, mask);
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200271
272 // Increment cycle counter
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200273 if (mask & ETHOSU_PMU_CCNT_Msk)
274 {
Anton Moberg61da4d32020-12-22 16:00:31 +0100275 uint64_t val = ETHOSU_PMU_Get_CCNTR_v2(drv) + 1;
276 ethosu_write_reg_shadow(&drv->dev, NPU_REG_PMCCNTR_LO, val & MASK_0_31_BITS, &drv->dev.pmccntr[0]);
277 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 +0200278 }
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200279
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200280 for (int i = 0; i < ETHOSU_PMU_NCOUNTERS; i++)
281 {
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200282 if (mask & (1 << i))
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200283 {
Anton Moberg61da4d32020-12-22 16:00:31 +0100284 uint32_t val = ETHOSU_PMU_Get_EVCNTR_v2(drv, i);
285 ethosu_write_reg_shadow(&drv->dev, NPU_REG_PMEVCNTR(i), val + 1, &drv->dev.pmu_evcntr[i]);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200286 }
287 }
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200288
289 // Reenable the active counters
Anton Moberg61da4d32020-12-22 16:00:31 +0100290 ETHOSU_PMU_CNTR_Enable_v2(drv, cntrs_active);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200291}
292
Per Åstrand0fd65ce2021-03-11 10:25:18 +0100293void ETHOSU_PMU_PMCCNTR_CFG_Set_Start_Event_v2(struct ethosu_driver *drv, enum ethosu_pmu_event_type start_event)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200294{
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200295 LOG_DEBUG("%s: start_event=%u\n", __FUNCTION__, start_event);
Per Åstrand0fd65ce2021-03-11 10:25:18 +0100296 uint32_t val = pmu_event_value(start_event);
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200297 struct pmccntr_cfg_r cfg;
Anton Moberg61da4d32020-12-22 16:00:31 +0100298 cfg.word = drv->dev.pmccntr_cfg;
Per Åstrand0fd65ce2021-03-11 10:25:18 +0100299 cfg.CYCLE_CNT_CFG_START = val;
Anton Moberg61da4d32020-12-22 16:00:31 +0100300 ethosu_write_reg_shadow(&drv->dev, NPU_REG_PMCCNTR_CFG, cfg.word, &drv->dev.pmccntr_cfg);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200301}
302
Per Åstrand0fd65ce2021-03-11 10:25:18 +0100303void ETHOSU_PMU_PMCCNTR_CFG_Set_Stop_Event_v2(struct ethosu_driver *drv, enum ethosu_pmu_event_type stop_event)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200304{
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200305 LOG_DEBUG("%s: stop_event=%u\n", __FUNCTION__, stop_event);
Per Åstrand0fd65ce2021-03-11 10:25:18 +0100306 uint32_t val = pmu_event_value(stop_event);
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200307 struct pmccntr_cfg_r cfg;
Anton Moberg61da4d32020-12-22 16:00:31 +0100308 cfg.word = drv->dev.pmccntr_cfg;
Per Åstrand0fd65ce2021-03-11 10:25:18 +0100309 cfg.CYCLE_CNT_CFG_STOP = val;
Anton Moberg61da4d32020-12-22 16:00:31 +0100310 ethosu_write_reg_shadow(&drv->dev, NPU_REG_PMCCNTR_CFG, cfg.word, &drv->dev.pmccntr_cfg);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200311}