1e3572eb6SAleksandr Rybalko /*- 2*5ec1d020SAndrew Turner * SPDX-License-Identifier: BSD-2-Clause 3e3572eb6SAleksandr Rybalko * 4e3572eb6SAleksandr Rybalko * Copyright (c) 2021 Ampere Computing LLC 5e3572eb6SAleksandr Rybalko * 6e3572eb6SAleksandr Rybalko * Redistribution and use in source and binary forms, with or without 7e3572eb6SAleksandr Rybalko * modification, are permitted provided that the following conditions 8e3572eb6SAleksandr Rybalko * are met: 9e3572eb6SAleksandr Rybalko * 1. Redistributions of source code must retain the above copyright 10e3572eb6SAleksandr Rybalko * notice, this list of conditions and the following disclaimer. 11e3572eb6SAleksandr Rybalko * 2. Redistributions in binary form must reproduce the above copyright 12e3572eb6SAleksandr Rybalko * notice, this list of conditions and the following disclaimer in the 13e3572eb6SAleksandr Rybalko * documentation and/or other materials provided with the distribution. 14e3572eb6SAleksandr Rybalko * 15e3572eb6SAleksandr Rybalko * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16e3572eb6SAleksandr Rybalko * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17e3572eb6SAleksandr Rybalko * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18e3572eb6SAleksandr Rybalko * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19e3572eb6SAleksandr Rybalko * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20e3572eb6SAleksandr Rybalko * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21e3572eb6SAleksandr Rybalko * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22e3572eb6SAleksandr Rybalko * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23e3572eb6SAleksandr Rybalko * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24e3572eb6SAleksandr Rybalko * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25e3572eb6SAleksandr Rybalko * SUCH DAMAGE. 26e3572eb6SAleksandr Rybalko */ 27e3572eb6SAleksandr Rybalko 28e3572eb6SAleksandr Rybalko #ifndef _DEV_HWPMC_PMU_DMC620_REG_H_ 29e3572eb6SAleksandr Rybalko #define _DEV_HWPMC_PMU_DMC620_REG_H_ 30e3572eb6SAleksandr Rybalko 31e3572eb6SAleksandr Rybalko #define DMC620_UNIT_PER_SOCKET 8 32e3572eb6SAleksandr Rybalko #define DMC620_MAX_SOCKET 2 33e3572eb6SAleksandr Rybalko #define DMC620_UNIT_MAX (DMC620_UNIT_PER_SOCKET * DMC620_MAX_SOCKET) 34e3572eb6SAleksandr Rybalko 35e3572eb6SAleksandr Rybalko #define DMC620_SNAPSHOT_REQ 0x000 /* WO */ 36e3572eb6SAleksandr Rybalko #define DMC620_SNAPSHOT_ACK 0x004 /* RO */ 37e3572eb6SAleksandr Rybalko #define DMC620_OVERFLOW_STATUS_CLKDIV2 0x008 /* RW */ 38e3572eb6SAleksandr Rybalko #define DMC620_OVERFLOW_STATUS_CLK 0x00C /* RW */ 39e3572eb6SAleksandr Rybalko 40e3572eb6SAleksandr Rybalko #define DMC620_COUNTER_MASK_LO 0x000 /* RW */ 41e3572eb6SAleksandr Rybalko #define DMC620_COUNTER_MASK_HI 0x004 /* RW */ 42e3572eb6SAleksandr Rybalko #define DMC620_COUNTER_MATCH_LO 0x008 /* RW */ 43e3572eb6SAleksandr Rybalko #define DMC620_COUNTER_MATCH_HI 0x00C /* RW */ 44e3572eb6SAleksandr Rybalko #define DMC620_COUNTER_CONTROL 0x010 /* RW */ 45e3572eb6SAleksandr Rybalko #define DMC620_COUNTER_CONTROL_ENABLE (1 << 0) 46e3572eb6SAleksandr Rybalko #define DMC620_COUNTER_CONTROL_INVERT (1 << 1) 47e3572eb6SAleksandr Rybalko #define DMC620_COUNTER_CONTROL_EVENT_SHIFT 2 48e3572eb6SAleksandr Rybalko #define DMC620_COUNTER_CONTROL_EVENT_MASK (0x1f << 2) 49e3572eb6SAleksandr Rybalko #define DMC620_COUNTER_CONTROL_INCR_SHIFT 7 50e3572eb6SAleksandr Rybalko #define DMC620_COUNTER_CONTROL_INCR_MASK (0x3 << 7) 51e3572eb6SAleksandr Rybalko #define DMC620_COUNTER_SNAPSHOT_VALUE_LO 0x018 /* RO */ 52e3572eb6SAleksandr Rybalko #define DMC620_COUNTER_VALUE_LO 0x020 /* RW */ 53e3572eb6SAleksandr Rybalko 54e3572eb6SAleksandr Rybalko #define DMC620_CLKDIV2_COUNTERS_BASE 0x010 55e3572eb6SAleksandr Rybalko #define DMC620_CLKDIV2_COUNTERS_OFF 0x28 56e3572eb6SAleksandr Rybalko #define DMC620_CLKDIV2_COUNTERS_N 8 57e3572eb6SAleksandr Rybalko #define DMC620_CLKDIV2_REG(u, r) (DMC620_CLKDIV2_COUNTERS_BASE + \ 58e3572eb6SAleksandr Rybalko (DMC620_CLKDIV2_COUNTERS_OFF * (u)) + (r)) 59e3572eb6SAleksandr Rybalko 60e3572eb6SAleksandr Rybalko #define DMC620_CLK_COUNTERS_BASE 0x150 61e3572eb6SAleksandr Rybalko #define DMC620_CLK_COUNTERS_OFF 0x28 62e3572eb6SAleksandr Rybalko #define DMC620_CLK_COUNTERS_N 2 63e3572eb6SAleksandr Rybalko #define DMC620_CLK_REG(u, r) (DMC620_CLK_COUNTERS_BASE + \ 64e3572eb6SAleksandr Rybalko (DMC620_CLK_COUNTERS_OFF * (u)) + (r)) 65e3572eb6SAleksandr Rybalko 66e3572eb6SAleksandr Rybalko /* CLK counters continue registers set. */ 67e3572eb6SAleksandr Rybalko #define DMC620_REG(u, r) (DMC620_CLKDIV2_COUNTERS_BASE + \ 68e3572eb6SAleksandr Rybalko (DMC620_CLKDIV2_COUNTERS_OFF * (u)) + (r)) 69e3572eb6SAleksandr Rybalko 70e3572eb6SAleksandr Rybalko #define DMC620_PMU_DEFAULT_UNITS_N 8 71e3572eb6SAleksandr Rybalko 72e3572eb6SAleksandr Rybalko #define DMC620_COUNTERS_N (DMC620_CLKDIV2_COUNTERS_N + \ 73e3572eb6SAleksandr Rybalko DMC620_CLK_COUNTERS_N) 74e3572eb6SAleksandr Rybalko 75e3572eb6SAleksandr Rybalko /* IO from HWPMC module to driver. */ 76e3572eb6SAleksandr Rybalko uint32_t pmu_dmc620_rd4(void *arg, u_int cntr, off_t reg); 77e3572eb6SAleksandr Rybalko void pmu_dmc620_wr4(void *arg, u_int cntr, off_t reg, uint32_t val); 78e3572eb6SAleksandr Rybalko 79e3572eb6SAleksandr Rybalko /* Driver's interrupt notification to HWPMC module. */ 80e3572eb6SAleksandr Rybalko int dmc620_intr(struct trapframe *tf, int c, int unit, int ri); 81e3572eb6SAleksandr Rybalko 82e3572eb6SAleksandr Rybalko /* Registration of counters pool. */ 83e3572eb6SAleksandr Rybalko void dmc620_pmc_register(int unit, void *argi, int domain); 84e3572eb6SAleksandr Rybalko void dmc620_pmc_unregister(int unit); 85e3572eb6SAleksandr Rybalko 86e3572eb6SAleksandr Rybalko #endif /*_DEV_HWPMC_PMU_DMC620_REG_H_ */ 87