| // SPDX-License-Identifier: GPL-2.0-only |
| /* |
| * GXP bus performance monitor interface. |
| * |
| * Copyright (C) 2021 Google LLC |
| */ |
| |
| #include "gxp-bpm.h" |
| #include "gxp-config.h" |
| |
| #define BPM_EVENT_TYPE_BIT 2 |
| #define BPM_EVENT_TYPE_MASK 0x1F |
| |
| #define BPM_START_BIT 10 |
| #define BPM_STOP_BIT 11 |
| |
| #define BPM_CONFIG_OFFSET 0x00 |
| #define BPM_CNTR_CONFIG_OFFSET 0x18 |
| #define BPM_SNAPSHOT_CNTR_OFFSET 0x98 |
| |
| #define BPM_DISABLE 0x0 |
| #define BPM_ENABLE 0x1 |
| |
| void gxp_bpm_configure(struct gxp_dev *gxp, u8 core, u32 bpm_offset, u32 event) |
| { |
| u32 val = ((event & BPM_EVENT_TYPE_MASK) << BPM_EVENT_TYPE_BIT) | |
| BPM_ENABLE; |
| u32 bpm_base = GXP_CORE_REG_INST_BPM(core) + bpm_offset; |
| |
| /* Configure event */ |
| gxp_write_32(gxp, bpm_base + BPM_CNTR_CONFIG_OFFSET, val); |
| /* Arm counter */ |
| gxp_write_32(gxp, bpm_base + BPM_CONFIG_OFFSET, BPM_ENABLE); |
| } |
| |
| void gxp_bpm_start(struct gxp_dev *gxp, u8 core) |
| { |
| gxp_write_32(gxp, GXP_CORE_REG_PROFILING_CONDITION(core), |
| BPM_ENABLE << BPM_START_BIT); |
| } |
| |
| void gxp_bpm_stop(struct gxp_dev *gxp, u8 core) |
| { |
| gxp_write_32(gxp, GXP_CORE_REG_PROFILING_CONDITION(core), |
| BPM_ENABLE << BPM_STOP_BIT); |
| } |
| |
| u32 gxp_bpm_read_counter(struct gxp_dev *gxp, u8 core, u32 bpm_offset) |
| { |
| u32 bpm_base = GXP_CORE_REG_INST_BPM(core) + bpm_offset; |
| |
| /* Disarm counter */ |
| gxp_write_32(gxp, bpm_base + BPM_CONFIG_OFFSET, BPM_DISABLE); |
| /* Read final counter value */ |
| return gxp_read_32(gxp, bpm_base + BPM_SNAPSHOT_CNTR_OFFSET); |
| } |