/* * Copyright (c) 2019-2020 Arm Limited. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the License); you may * not use this file except in compliance with the License. * You may obtain a copy of the License at * * www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an AS IS BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /***************************************************************************** * Includes *****************************************************************************/ #include "ethosu55_interface.h" #include "ethosu_common.h" #include #include #include #include /***************************************************************************** * Defines *****************************************************************************/ #define COMMA , #define SEMICOLON ; #define ETHOSU_PMU_CTRL_BASE (NPU_BASE + ((uint32_t)0x180)) #define ETHOSU_PMU_CNTR_BASE (NPU_BASE + ((uint32_t)0x300)) #define ETHOSU_PMU_EVNT_BASE (NPU_BASE + ((uint32_t)0x380)) #define EVTYPE(A, name) \ case PMU_EVENT_TYPE_##name: \ return ETHOSU_PMU_##name #define EVID(A, name) (PMU_EVENT_TYPE_##name) /***************************************************************************** * Variables *****************************************************************************/ PMU_Ethosu_ctrl_Type *ethosu_pmu_ctrl = (PMU_Ethosu_ctrl_Type *)ETHOSU_PMU_CTRL_BASE; PMU_Ethosu_cntr_Type *ethosu_pmu_cntr = (PMU_Ethosu_cntr_Type *)ETHOSU_PMU_CNTR_BASE; PMU_Ethosu_evnt_Type *ethosu_pmu_evnt = (PMU_Ethosu_evnt_Type *)ETHOSU_PMU_EVNT_BASE; static const enum pmu_event_type eventbyid[] = {EXPAND_PMU_EVENT_TYPE(EVID, COMMA)}; /***************************************************************************** * Functions *****************************************************************************/ enum ethosu_pmu_event_type pmu_event_type(uint32_t id) { switch (id) { EXPAND_PMU_EVENT_TYPE(EVTYPE, SEMICOLON); } return ETHOSU_PMU_SENTINEL; } uint32_t pmu_event_value(enum ethosu_pmu_event_type event) { if (!(event < ETHOSU_PMU_SENTINEL) || (event < 0)) { return (uint32_t)(-1); } return eventbyid[event]; } void ethosu_pmu_driver_init(void) { #ifdef PMU_AUTOINIT *ethosu_pmu_ctrl = (PMU_Ethosu_ctrl_Type){.PMCR = INIT_PMCR, .PMCNTENSET = INIT_PMCNTENSET, .PMCNTENCLR = INIT_PMCNTENCLR, .PMOVSSET = INIT_PMOVSSET, .PMOVSCLR = INIT_PMOVSCLR, .PMINTSET = INIT_PMINTSET, .PMINTCLR = INIT_PMINTCLR, .PMCCNTR = INIT_PMCCNTR, .PMCCNTR_CFG = INIT_PMCCNTR_CFG}; for (int i = 0; i < ETHOSU_PMU_NCOUNTERS; i++) { *ethosu_pmu_cntr[i] = 0; *ethosu_pmu_evnt[i] = 0; } #endif } void ethosu_pmu_driver_exit(void) {}