1f263522aSJoseph Koshy /*- 24d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 3718cf2ccSPedro F. Giffuni * 4f263522aSJoseph Koshy * Copyright (c) 2005, Joseph Koshy 5f263522aSJoseph Koshy * All rights reserved. 6f263522aSJoseph Koshy * 7f263522aSJoseph Koshy * Redistribution and use in source and binary forms, with or without 8f263522aSJoseph Koshy * modification, are permitted provided that the following conditions 9f263522aSJoseph Koshy * are met: 10f263522aSJoseph Koshy * 1. Redistributions of source code must retain the above copyright 11f263522aSJoseph Koshy * notice, this list of conditions and the following disclaimer. 12f263522aSJoseph Koshy * 2. Redistributions in binary form must reproduce the above copyright 13f263522aSJoseph Koshy * notice, this list of conditions and the following disclaimer in the 14f263522aSJoseph Koshy * documentation and/or other materials provided with the distribution. 15f263522aSJoseph Koshy * 16f263522aSJoseph Koshy * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17f263522aSJoseph Koshy * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18f263522aSJoseph Koshy * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19f263522aSJoseph Koshy * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20f263522aSJoseph Koshy * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21f263522aSJoseph Koshy * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22f263522aSJoseph Koshy * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23f263522aSJoseph Koshy * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24f263522aSJoseph Koshy * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25f263522aSJoseph Koshy * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26f263522aSJoseph Koshy * SUCH DAMAGE. 27f263522aSJoseph Koshy */ 28f263522aSJoseph Koshy 29f263522aSJoseph Koshy /* Machine dependent interfaces */ 30f263522aSJoseph Koshy 31f263522aSJoseph Koshy #ifndef _DEV_HWPMC_AMD_H_ 32f263522aSJoseph Koshy #define _DEV_HWPMC_AMD_H_ 1 33f263522aSJoseph Koshy 34*2c6f474eSMitchell Horne /* AMD K8 PMCs */ 35f263522aSJoseph Koshy 36f263522aSJoseph Koshy #define AMD_PMC_EVSEL_0 0xC0010000 37f263522aSJoseph Koshy #define AMD_PMC_EVSEL_1 0xC0010001 38f263522aSJoseph Koshy #define AMD_PMC_EVSEL_2 0xC0010002 39f263522aSJoseph Koshy #define AMD_PMC_EVSEL_3 0xC0010003 40f263522aSJoseph Koshy 41f263522aSJoseph Koshy #define AMD_PMC_PERFCTR_0 0xC0010004 42f263522aSJoseph Koshy #define AMD_PMC_PERFCTR_1 0xC0010005 43f263522aSJoseph Koshy #define AMD_PMC_PERFCTR_2 0xC0010006 44f263522aSJoseph Koshy #define AMD_PMC_PERFCTR_3 0xC0010007 45dacc43dfSMatt Macy /* CORE */ 46dacc43dfSMatt Macy #define AMD_PMC_EVSEL_4 0xC0010208 47dacc43dfSMatt Macy #define AMD_PMC_EVSEL_5 0xC001020A 48f263522aSJoseph Koshy 49dacc43dfSMatt Macy #define AMD_PMC_PERFCTR_4 0xC0010209 50dacc43dfSMatt Macy #define AMD_PMC_PERFCTR_5 0xC001020B 51dacc43dfSMatt Macy /* L3 */ 52dacc43dfSMatt Macy #define AMD_PMC_EVSEL_EP_L3_0 0xC0010230 53dacc43dfSMatt Macy #define AMD_PMC_EVSEL_EP_L3_1 0xC0010232 54dacc43dfSMatt Macy #define AMD_PMC_EVSEL_EP_L3_2 0xC0010234 55dacc43dfSMatt Macy #define AMD_PMC_EVSEL_EP_L3_3 0xC0010236 56dacc43dfSMatt Macy #define AMD_PMC_EVSEL_EP_L3_4 0xC0010238 57dacc43dfSMatt Macy #define AMD_PMC_EVSEL_EP_L3_5 0xC001023A 58f263522aSJoseph Koshy 59dacc43dfSMatt Macy #define AMD_PMC_PERFCTR_EP_L3_0 0xC0010231 60dacc43dfSMatt Macy #define AMD_PMC_PERFCTR_EP_L3_1 0xC0010233 61dacc43dfSMatt Macy #define AMD_PMC_PERFCTR_EP_L3_2 0xC0010235 62dacc43dfSMatt Macy #define AMD_PMC_PERFCTR_EP_L3_3 0xC0010237 63dacc43dfSMatt Macy #define AMD_PMC_PERFCTR_EP_L3_4 0xC0010239 64dacc43dfSMatt Macy #define AMD_PMC_PERFCTR_EP_L3_5 0xC001023B 65dacc43dfSMatt Macy /* DF */ 66dacc43dfSMatt Macy #define AMD_PMC_EVSEL_EP_DF_0 0xC0010240 67dacc43dfSMatt Macy #define AMD_PMC_EVSEL_EP_DF_1 0xC0010242 68dacc43dfSMatt Macy #define AMD_PMC_EVSEL_EP_DF_2 0xC0010244 69dacc43dfSMatt Macy #define AMD_PMC_EVSEL_EP_DF_3 0xC0010246 70dacc43dfSMatt Macy 71dacc43dfSMatt Macy #define AMD_PMC_PERFCTR_EP_DF_0 0xC0010241 72dacc43dfSMatt Macy #define AMD_PMC_PERFCTR_EP_DF_1 0xC0010243 73dacc43dfSMatt Macy #define AMD_PMC_PERFCTR_EP_DF_2 0xC0010245 74dacc43dfSMatt Macy #define AMD_PMC_PERFCTR_EP_DF_3 0xC0010247 75dacc43dfSMatt Macy 76dacc43dfSMatt Macy #define AMD_NPMCS 16 77c5445f8bSAndrew Gallatin #define AMD_CORE_NPMCS 6 78dacc43dfSMatt Macy 79f263522aSJoseph Koshy 80f263522aSJoseph Koshy #define AMD_PMC_COUNTERMASK 0xFF000000 81f263522aSJoseph Koshy #define AMD_PMC_TO_COUNTER(x) (((x) << 24) & AMD_PMC_COUNTERMASK) 82f263522aSJoseph Koshy #define AMD_PMC_INVERT (1 << 23) 83f263522aSJoseph Koshy #define AMD_PMC_ENABLE (1 << 22) 84f263522aSJoseph Koshy #define AMD_PMC_INT (1 << 20) 85f263522aSJoseph Koshy #define AMD_PMC_PC (1 << 19) 86f263522aSJoseph Koshy #define AMD_PMC_EDGE (1 << 18) 87f263522aSJoseph Koshy #define AMD_PMC_OS (1 << 17) 88f263522aSJoseph Koshy #define AMD_PMC_USR (1 << 16) 89dacc43dfSMatt Macy #define AMD_PMC_L3SLICEMASK (0x000F000000000000) 90dacc43dfSMatt Macy #define AMD_PMC_L3COREMASK (0xFF00000000000000) 91dacc43dfSMatt Macy #define AMD_PMC_TO_L3SLICE(x) (((x) << 48) & AMD_PMC_L3SLICEMASK) 92dacc43dfSMatt Macy #define AMD_PMC_TO_L3CORE(x) (((x) << 56) & AMD_PMC_L3COREMASK) 93f263522aSJoseph Koshy 94f263522aSJoseph Koshy #define AMD_PMC_UNITMASK_M 0x10 95f263522aSJoseph Koshy #define AMD_PMC_UNITMASK_O 0x08 96f263522aSJoseph Koshy #define AMD_PMC_UNITMASK_E 0x04 97f263522aSJoseph Koshy #define AMD_PMC_UNITMASK_S 0x02 98f263522aSJoseph Koshy #define AMD_PMC_UNITMASK_I 0x01 99f263522aSJoseph Koshy #define AMD_PMC_UNITMASK_MOESI 0x1F 100f263522aSJoseph Koshy 101f263522aSJoseph Koshy #define AMD_PMC_UNITMASK 0xFF00 1021d3aa362SConrad Meyer #define AMD_PMC_EVENTMASK 0xF000000FF 103f263522aSJoseph Koshy 104f263522aSJoseph Koshy #define AMD_PMC_TO_UNITMASK(x) (((x) << 8) & AMD_PMC_UNITMASK) 1051356a2e6SConrad Meyer #define AMD_PMC_TO_EVENTMASK(x) (((x) & 0xFF) | (((uint64_t)(x) & 0xF00) << 24)) 106dacc43dfSMatt Macy #define AMD_PMC_TO_EVENTMASK_DF(x) (((x) & 0xFF) | (((uint64_t)(x) & 0x0F00) << 24)) | (((uint64_t)(x) & 0x3000) << 47) 107f263522aSJoseph Koshy #define AMD_VALID_BITS (AMD_PMC_COUNTERMASK | AMD_PMC_INVERT | \ 108f263522aSJoseph Koshy AMD_PMC_ENABLE | AMD_PMC_INT | AMD_PMC_PC | AMD_PMC_EDGE | \ 109f263522aSJoseph Koshy AMD_PMC_OS | AMD_PMC_USR | AMD_PMC_UNITMASK | AMD_PMC_EVENTMASK) 110f263522aSJoseph Koshy 111f263522aSJoseph Koshy #define AMD_PMC_CAPS (PMC_CAP_INTERRUPT | PMC_CAP_USER | \ 112f263522aSJoseph Koshy PMC_CAP_SYSTEM | PMC_CAP_EDGE | PMC_CAP_THRESHOLD | \ 113f263522aSJoseph Koshy PMC_CAP_READ | PMC_CAP_WRITE | PMC_CAP_INVERT | PMC_CAP_QUALIFIER) 114f263522aSJoseph Koshy 115f263522aSJoseph Koshy #define AMD_PMC_IS_STOPPED(evsel) ((rdmsr((evsel)) & AMD_PMC_ENABLE) == 0) 116f263522aSJoseph Koshy #define AMD_PMC_HAS_OVERFLOWED(pmc) ((rdpmc(pmc) & (1ULL << 47)) == 0) 117f263522aSJoseph Koshy 118f263522aSJoseph Koshy #define AMD_RELOAD_COUNT_TO_PERFCTR_VALUE(V) (-(V)) 119f263522aSJoseph Koshy #define AMD_PERFCTR_VALUE_TO_RELOAD_COUNT(P) (-(P)) 120f263522aSJoseph Koshy 121dacc43dfSMatt Macy enum sub_class{ 122dacc43dfSMatt Macy PMC_AMD_SUB_CLASS_CORE, 123dacc43dfSMatt Macy PMC_AMD_SUB_CLASS_L3_CACHE, 124dacc43dfSMatt Macy PMC_AMD_SUB_CLASS_DATA_FABRIC 125dacc43dfSMatt Macy }; 126dacc43dfSMatt Macy 127f263522aSJoseph Koshy struct pmc_md_amd_op_pmcallocate { 128dacc43dfSMatt Macy uint64_t pm_amd_config; 129dacc43dfSMatt Macy uint32_t pm_amd_sub_class; 130f263522aSJoseph Koshy }; 131f263522aSJoseph Koshy 132f263522aSJoseph Koshy #ifdef _KERNEL 133f263522aSJoseph Koshy 134f263522aSJoseph Koshy /* MD extension for 'struct pmc' */ 135f263522aSJoseph Koshy struct pmc_md_amd_pmc { 136dacc43dfSMatt Macy uint64_t pm_amd_evsel; 137f263522aSJoseph Koshy }; 138f263522aSJoseph Koshy 139f263522aSJoseph Koshy #endif /* _KERNEL */ 140f263522aSJoseph Koshy #endif /* _DEV_HWPMC_AMD_H_ */ 141