blob: d1cd79c28915e44a9240d68013c77a1732d35852 [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"
Anton Moberg6eab40b2021-07-07 11:43:51 +020026#include "ethosu_log.h"
Bhavik Pateldae5be02020-06-18 15:25:15 +020027#include "pmu_ethosu.h"
28
Kristofer Jonsson537c71c2020-05-05 14:17:22 +020029#include <assert.h>
Per Åstrande07b1f92020-09-28 08:31:46 +020030#include <inttypes.h>
Bhavik Pateldae5be02020-06-18 15:25:15 +020031#include <stddef.h>
Kristofer Jonsson537c71c2020-05-05 14:17:22 +020032
33/*****************************************************************************
34 * Defines
35 *****************************************************************************/
36
37#define COMMA ,
38#define SEMICOLON ;
39
Kristofer Jonsson537c71c2020-05-05 14:17:22 +020040#define EVTYPE(A, name) \
41 case PMU_EVENT_TYPE_##name: \
42 return ETHOSU_PMU_##name
43
44#define EVID(A, name) (PMU_EVENT_TYPE_##name)
45
Bhavik Patel8e32b0b2020-06-23 13:48:25 +020046#define NPU_REG_PMEVCNTR(x) (NPU_REG_PMEVCNTR0 + ((x) * sizeof(uint32_t)))
47#define NPU_REG_PMEVTYPER(x) (NPU_REG_PMEVTYPER0 + ((x) * sizeof(uint32_t)))
48
Kristofer Jonsson537c71c2020-05-05 14:17:22 +020049/*****************************************************************************
50 * Variables
51 *****************************************************************************/
52
Kristofer Jonsson537c71c2020-05-05 14:17:22 +020053static const enum pmu_event_type eventbyid[] = {EXPAND_PMU_EVENT_TYPE(EVID, COMMA)};
54
55/*****************************************************************************
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +020056 * Static functions
Kristofer Jonsson537c71c2020-05-05 14:17:22 +020057 *****************************************************************************/
58
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +020059static enum ethosu_pmu_event_type pmu_event_type(uint32_t id)
Kristofer Jonsson537c71c2020-05-05 14:17:22 +020060{
61 switch (id)
62 {
63 EXPAND_PMU_EVENT_TYPE(EVTYPE, SEMICOLON);
Per Åstrande07b1f92020-09-28 08:31:46 +020064 default:
65 LOG_ERR("Unknown PMU event id: 0x%" PRIx32 "\n", id);
Kristofer Jonsson537c71c2020-05-05 14:17:22 +020066 }
67
68 return ETHOSU_PMU_SENTINEL;
69}
70
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +020071static uint32_t pmu_event_value(enum ethosu_pmu_event_type event)
Kristofer Jonsson537c71c2020-05-05 14:17:22 +020072{
Per Åstrand51c18ba2020-09-28 11:25:36 +020073 int a = event;
74 if ((a < ETHOSU_PMU_SENTINEL) && (a >= ETHOSU_PMU_NO_EVENT))
75 {
76 return eventbyid[event];
77 }
78 else
Kristofer Jonsson537c71c2020-05-05 14:17:22 +020079 {
80 return (uint32_t)(-1);
81 }
Kristofer Jonsson537c71c2020-05-05 14:17:22 +020082}
83
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +020084/*****************************************************************************
85 * Functions
86 *****************************************************************************/
Bhavik Patel8e32b0b2020-06-23 13:48:25 +020087
Anton Mobergc6fd88e2021-05-03 17:00:33 +020088void ETHOSU_PMU_Enable(struct ethosu_driver *drv)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +020089{
Anton Moberg6eab40b2021-07-07 11:43:51 +020090 LOG_DEBUG("Enable PMU\n");
Bhavik Patel8e32b0b2020-06-23 13:48:25 +020091 struct pmcr_r pmcr;
Anton Moberg61da4d32020-12-22 16:00:31 +010092 pmcr.word = drv->dev.pmcr;
Bhavik Patel8e32b0b2020-06-23 13:48:25 +020093 pmcr.cnt_en = 1;
Anton Moberg0a614292021-03-24 14:08:22 +010094 set_clock_and_power_request(drv, ETHOSU_PMU_REQUEST, ETHOSU_CLOCK_Q_DISABLE, ETHOSU_POWER_Q_DISABLE);
Jonny Svärda830f172021-06-07 16:57:00 +020095 ethosu_dev_write_reg_shadow(&drv->dev, NPU_REG_PMCR, pmcr.word, &drv->dev.pmcr);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +020096}
97
Anton Mobergc6fd88e2021-05-03 17:00:33 +020098void ETHOSU_PMU_Disable(struct ethosu_driver *drv)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +020099{
Anton Moberg6eab40b2021-07-07 11:43:51 +0200100 LOG_DEBUG("Disable PMU\n");
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200101 struct pmcr_r pmcr;
Anton Moberg61da4d32020-12-22 16:00:31 +0100102 pmcr.word = drv->dev.pmcr;
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200103 pmcr.cnt_en = 0;
Anton Moberg0a614292021-03-24 14:08:22 +0100104 set_clock_and_power_request(drv, ETHOSU_PMU_REQUEST, ETHOSU_CLOCK_Q_ENABLE, ETHOSU_POWER_Q_ENABLE);
Jonny Svärda830f172021-06-07 16:57:00 +0200105 ethosu_dev_write_reg_shadow(&drv->dev, NPU_REG_PMCR, pmcr.word, &drv->dev.pmcr);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200106}
107
Anton Mobergc6fd88e2021-05-03 17:00:33 +0200108void ETHOSU_PMU_Set_EVTYPER(struct ethosu_driver *drv, uint32_t num, enum ethosu_pmu_event_type type)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200109{
Kristofer Jonsson1c893b52021-05-26 12:06:14 +0200110 assert(num < ETHOSU_PMU_NCOUNTERS);
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200111 uint32_t val = pmu_event_value(type);
Anton Moberg6eab40b2021-07-07 11:43:51 +0200112 LOG_DEBUG("num=%u, type=%d, val=%u\n", num, type, val);
Jonny Svärda830f172021-06-07 16:57:00 +0200113 ethosu_dev_write_reg_shadow(&drv->dev, NPU_REG_PMEVTYPER(num), val, &drv->dev.pmu_evtypr[num]);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200114}
115
Anton Mobergc6fd88e2021-05-03 17:00:33 +0200116enum ethosu_pmu_event_type ETHOSU_PMU_Get_EVTYPER(struct ethosu_driver *drv, uint32_t num)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200117{
Kristofer Jonsson1c893b52021-05-26 12:06:14 +0200118 assert(num < ETHOSU_PMU_NCOUNTERS);
Anton Moberg61da4d32020-12-22 16:00:31 +0100119 uint32_t val = drv->dev.pmu_evtypr[num];
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200120 enum ethosu_pmu_event_type type = pmu_event_type(val);
Anton Moberg6eab40b2021-07-07 11:43:51 +0200121 LOG_DEBUG("num=%u, type=%d, val=%u\n", num, type, val);
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200122 return type;
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200123}
124
Anton Mobergc6fd88e2021-05-03 17:00:33 +0200125void ETHOSU_PMU_CYCCNT_Reset(struct ethosu_driver *drv)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200126{
Anton Moberg6eab40b2021-07-07 11:43:51 +0200127 LOG_DEBUG("Reset PMU\n");
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200128 struct pmcr_r pmcr;
Anton Moberg61da4d32020-12-22 16:00:31 +0100129 pmcr.word = drv->dev.pmcr;
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200130 pmcr.cycle_cnt_rst = 1;
Jonny Svärda830f172021-06-07 16:57:00 +0200131 ethosu_dev_write_reg_shadow(&drv->dev, NPU_REG_PMCR, pmcr.word, &drv->dev.pmcr);
Anton Moberg61da4d32020-12-22 16:00:31 +0100132 drv->dev.pmccntr[0] = 0;
133 drv->dev.pmccntr[1] = 0;
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200134}
135
Anton Mobergc6fd88e2021-05-03 17:00:33 +0200136void ETHOSU_PMU_EVCNTR_ALL_Reset(struct ethosu_driver *drv)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200137{
Anton Moberg6eab40b2021-07-07 11:43:51 +0200138 LOG_DEBUG("Reset all events\n");
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200139 struct pmcr_r pmcr;
Anton Moberg61da4d32020-12-22 16:00:31 +0100140 pmcr.word = drv->dev.pmcr;
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200141 pmcr.event_cnt_rst = 1;
Jonny Svärda830f172021-06-07 16:57:00 +0200142 ethosu_dev_write_reg_shadow(&drv->dev, NPU_REG_PMCR, pmcr.word, &drv->dev.pmcr);
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200143
144 for (uint32_t i = 0; i < ETHOSU_PMU_NCOUNTERS; i++)
145 {
Anton Moberg61da4d32020-12-22 16:00:31 +0100146 drv->dev.pmu_evcntr[i] = 0;
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200147 }
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200148}
149
Anton Mobergc6fd88e2021-05-03 17:00:33 +0200150void ETHOSU_PMU_CNTR_Enable(struct ethosu_driver *drv, uint32_t mask)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200151{
Anton Moberg6eab40b2021-07-07 11:43:51 +0200152 LOG_DEBUG("mask=0x%08x\n", mask);
Jonny Svärda830f172021-06-07 16:57:00 +0200153 ethosu_dev_write_reg_shadow(&drv->dev, NPU_REG_PMCNTENSET, mask, &drv->dev.pmcnten);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200154}
155
Anton Mobergc6fd88e2021-05-03 17:00:33 +0200156void ETHOSU_PMU_CNTR_Disable(struct ethosu_driver *drv, uint32_t mask)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200157{
Anton Moberg6eab40b2021-07-07 11:43:51 +0200158 LOG_DEBUG("mask=0x%08x\n", mask);
Jonny Svärda830f172021-06-07 16:57:00 +0200159 ethosu_dev_write_reg_shadow(&drv->dev, NPU_REG_PMCNTENCLR, mask, &drv->dev.pmcnten);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200160}
161
Anton Mobergc6fd88e2021-05-03 17:00:33 +0200162uint32_t ETHOSU_PMU_CNTR_Status(struct ethosu_driver *drv)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200163{
Anton Moberg6eab40b2021-07-07 11:43:51 +0200164 LOG_DEBUG("mask=0x%08x\n", drv->dev.pmcnten);
Anton Moberg61da4d32020-12-22 16:00:31 +0100165 return drv->dev.pmcnten;
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200166}
167
Anton Mobergc6fd88e2021-05-03 17:00:33 +0200168uint64_t ETHOSU_PMU_Get_CCNTR(struct ethosu_driver *drv)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200169{
Jonny Svärda830f172021-06-07 16:57:00 +0200170 uint32_t val_lo = ethosu_dev_read_reg(&drv->dev, NPU_REG_PMCCNTR_LO);
171 uint32_t val_hi = ethosu_dev_read_reg(&drv->dev, NPU_REG_PMCCNTR_HI);
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200172 uint64_t val = ((uint64_t)val_hi << 32) | val_lo;
Anton Moberg61da4d32020-12-22 16:00:31 +0100173 uint64_t shadow = ((uint64_t)drv->dev.pmccntr[1] << 32) | drv->dev.pmccntr[0];
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200174
Anton Moberg6eab40b2021-07-07 11:43:51 +0200175 LOG_DEBUG("val=%" PRIu64 ", shadow=%" PRIu64 "\n", val, shadow);
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200176
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200177 // Return the shadow variable in case the NPU was powered off and lost the cycle count
178 if (shadow > val)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200179 {
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200180 return shadow;
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200181 }
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200182
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200183 // Update the shadow variable
Anton Moberg61da4d32020-12-22 16:00:31 +0100184 drv->dev.pmccntr[0] = val_lo;
185 drv->dev.pmccntr[1] = val_hi;
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200186
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200187 return val;
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200188}
189
Anton Mobergc6fd88e2021-05-03 17:00:33 +0200190void ETHOSU_PMU_Set_CCNTR(struct ethosu_driver *drv, uint64_t val)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200191{
Anton Mobergc6fd88e2021-05-03 17:00:33 +0200192 uint32_t active = ETHOSU_PMU_CNTR_Status(drv) & ETHOSU_PMU_CCNT_Msk;
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200193
Anton Moberg6eab40b2021-07-07 11:43:51 +0200194 LOG_DEBUG("val=%llu\n", val);
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200195
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200196 if (active)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200197 {
Anton Mobergc6fd88e2021-05-03 17:00:33 +0200198 ETHOSU_PMU_CNTR_Disable(drv, ETHOSU_PMU_CCNT_Msk);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200199 }
200
Jonny Svärda830f172021-06-07 16:57:00 +0200201 ethosu_dev_write_reg_shadow(&drv->dev, NPU_REG_PMCCNTR_LO, val & MASK_0_31_BITS, &drv->dev.pmccntr[0]);
202 ethosu_dev_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 +0200203
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200204 if (active)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200205 {
Anton Mobergc6fd88e2021-05-03 17:00:33 +0200206 ETHOSU_PMU_CNTR_Enable(drv, ETHOSU_PMU_CCNT_Msk);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200207 }
208}
209
Anton Mobergc6fd88e2021-05-03 17:00:33 +0200210uint32_t ETHOSU_PMU_Get_EVCNTR(struct ethosu_driver *drv, uint32_t num)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200211{
Kristofer Jonsson1c893b52021-05-26 12:06:14 +0200212 assert(num < ETHOSU_PMU_NCOUNTERS);
Jonny Svärda830f172021-06-07 16:57:00 +0200213 uint32_t val = ethosu_dev_read_reg(&drv->dev, NPU_REG_PMEVCNTR(num));
Anton Moberg6eab40b2021-07-07 11:43:51 +0200214 LOG_DEBUG("num=%u, val=%u, shadow=%u\n", num, val, drv->dev.pmu_evcntr[num]);
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200215
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200216 // Return the shadow variable in case the NPU was powered off and lost the event count
Anton Moberg61da4d32020-12-22 16:00:31 +0100217 if (drv->dev.pmu_evcntr[num] > val)
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200218 {
Anton Moberg61da4d32020-12-22 16:00:31 +0100219 return drv->dev.pmu_evcntr[num];
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200220 }
221
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200222 // Update the shadow variable
Anton Moberg61da4d32020-12-22 16:00:31 +0100223 drv->dev.pmu_evcntr[num] = val;
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200224
Kristofer Jonssonef387ea2020-08-25 16:32:21 +0200225 return val;
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200226}
227
Anton Mobergc6fd88e2021-05-03 17:00:33 +0200228void ETHOSU_PMU_Set_EVCNTR(struct ethosu_driver *drv, uint32_t num, uint32_t val)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200229{
Kristofer Jonsson1c893b52021-05-26 12:06:14 +0200230 assert(num < ETHOSU_PMU_NCOUNTERS);
Anton Moberg6eab40b2021-07-07 11:43:51 +0200231 LOG_DEBUG("num=%u, val=%u\n", num, val);
Jonny Svärda830f172021-06-07 16:57:00 +0200232 ethosu_dev_write_reg(&drv->dev, NPU_REG_PMEVCNTR(num), val);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200233}
234
Anton Mobergc6fd88e2021-05-03 17:00:33 +0200235uint32_t ETHOSU_PMU_Get_CNTR_OVS(struct ethosu_driver *drv)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200236{
Anton Moberg6eab40b2021-07-07 11:43:51 +0200237 LOG_DEBUG("");
Jonny Svärda830f172021-06-07 16:57:00 +0200238 return ethosu_dev_read_reg(&drv->dev, NPU_REG_PMOVSSET);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200239}
240
Anton Mobergc6fd88e2021-05-03 17:00:33 +0200241void ETHOSU_PMU_Set_CNTR_OVS(struct ethosu_driver *drv, uint32_t mask)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200242{
Anton Moberg6eab40b2021-07-07 11:43:51 +0200243 LOG_DEBUG("");
Jonny Svärda830f172021-06-07 16:57:00 +0200244 ethosu_dev_write_reg(&drv->dev, NPU_REG_PMOVSCLR, mask);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200245}
246
Anton Mobergc6fd88e2021-05-03 17:00:33 +0200247void ETHOSU_PMU_Set_CNTR_IRQ_Enable(struct ethosu_driver *drv, uint32_t mask)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200248{
Anton Moberg6eab40b2021-07-07 11:43:51 +0200249 LOG_DEBUG("mask=0x%08x\n", mask);
Jonny Svärda830f172021-06-07 16:57:00 +0200250 ethosu_dev_write_reg_shadow(&drv->dev, NPU_REG_PMINTSET, mask, &drv->dev.pmint);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200251}
252
Anton Mobergc6fd88e2021-05-03 17:00:33 +0200253void ETHOSU_PMU_Set_CNTR_IRQ_Disable(struct ethosu_driver *drv, uint32_t mask)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200254{
Anton Moberg6eab40b2021-07-07 11:43:51 +0200255 LOG_DEBUG("mask=0x%08x\n", mask);
Jonny Svärda830f172021-06-07 16:57:00 +0200256 ethosu_dev_write_reg_shadow(&drv->dev, NPU_REG_PMINTCLR, mask, &drv->dev.pmint);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200257}
258
Anton Mobergc6fd88e2021-05-03 17:00:33 +0200259uint32_t ETHOSU_PMU_Get_IRQ_Enable(struct ethosu_driver *drv)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200260{
Anton Moberg6eab40b2021-07-07 11:43:51 +0200261 LOG_DEBUG("mask=0x%08x\n", drv->dev.pmint);
Anton Moberg61da4d32020-12-22 16:00:31 +0100262 return drv->dev.pmint;
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200263}
264
Anton Mobergc6fd88e2021-05-03 17:00:33 +0200265void ETHOSU_PMU_CNTR_Increment(struct ethosu_driver *drv, uint32_t mask)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200266{
Anton Moberg6eab40b2021-07-07 11:43:51 +0200267 LOG_DEBUG("");
Anton Mobergc6fd88e2021-05-03 17:00:33 +0200268 uint32_t cntrs_active = ETHOSU_PMU_CNTR_Status(drv);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200269
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200270 // Disable counters
Anton Mobergc6fd88e2021-05-03 17:00:33 +0200271 ETHOSU_PMU_CNTR_Disable(drv, mask);
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200272
273 // Increment cycle counter
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200274 if (mask & ETHOSU_PMU_CCNT_Msk)
275 {
Anton Mobergc6fd88e2021-05-03 17:00:33 +0200276 uint64_t val = ETHOSU_PMU_Get_CCNTR(drv) + 1;
Jonny Svärda830f172021-06-07 16:57:00 +0200277 ethosu_dev_write_reg_shadow(&drv->dev, NPU_REG_PMCCNTR_LO, val & MASK_0_31_BITS, &drv->dev.pmccntr[0]);
278 ethosu_dev_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 +0200279 }
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200280
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200281 for (int i = 0; i < ETHOSU_PMU_NCOUNTERS; i++)
282 {
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200283 if (mask & (1 << i))
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200284 {
Anton Mobergc6fd88e2021-05-03 17:00:33 +0200285 uint32_t val = ETHOSU_PMU_Get_EVCNTR(drv, i);
Jonny Svärda830f172021-06-07 16:57:00 +0200286 ethosu_dev_write_reg_shadow(&drv->dev, NPU_REG_PMEVCNTR(i), val + 1, &drv->dev.pmu_evcntr[i]);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200287 }
288 }
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200289
290 // Reenable the active counters
Anton Mobergc6fd88e2021-05-03 17:00:33 +0200291 ETHOSU_PMU_CNTR_Enable(drv, cntrs_active);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200292}
293
Anton Mobergc6fd88e2021-05-03 17:00:33 +0200294void ETHOSU_PMU_PMCCNTR_CFG_Set_Start_Event(struct ethosu_driver *drv, enum ethosu_pmu_event_type start_event)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200295{
Anton Moberg6eab40b2021-07-07 11:43:51 +0200296 LOG_DEBUG("start_event=%u\n", start_event);
Per Åstrand0fd65ce2021-03-11 10:25:18 +0100297 uint32_t val = pmu_event_value(start_event);
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200298 struct pmccntr_cfg_r cfg;
Anton Moberg61da4d32020-12-22 16:00:31 +0100299 cfg.word = drv->dev.pmccntr_cfg;
Per Åstrand0fd65ce2021-03-11 10:25:18 +0100300 cfg.CYCLE_CNT_CFG_START = val;
Jonny Svärda830f172021-06-07 16:57:00 +0200301 ethosu_dev_write_reg_shadow(&drv->dev, NPU_REG_PMCCNTR_CFG, cfg.word, &drv->dev.pmccntr_cfg);
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200302}
303
Anton Mobergc6fd88e2021-05-03 17:00:33 +0200304void ETHOSU_PMU_PMCCNTR_CFG_Set_Stop_Event(struct ethosu_driver *drv, enum ethosu_pmu_event_type stop_event)
Bhavik Patel8e32b0b2020-06-23 13:48:25 +0200305{
Anton Moberg6eab40b2021-07-07 11:43:51 +0200306 LOG_DEBUG("stop_event=%u\n", stop_event);
Per Åstrand0fd65ce2021-03-11 10:25:18 +0100307 uint32_t val = pmu_event_value(stop_event);
Kristofer Jonsson4dc73dc2020-10-16 12:33:47 +0200308 struct pmccntr_cfg_r cfg;
Anton Moberg61da4d32020-12-22 16:00:31 +0100309 cfg.word = drv->dev.pmccntr_cfg;
Per Åstrand0fd65ce2021-03-11 10:25:18 +0100310 cfg.CYCLE_CNT_CFG_STOP = val;
Jonny Svärda830f172021-06-07 16:57:00 +0200311 ethosu_dev_write_reg_shadow(&drv->dev, NPU_REG_PMCCNTR_CFG, cfg.word, &drv->dev.pmccntr_cfg);
Anton Moberg6eab40b2021-07-07 11:43:51 +0200312}