1*68dd7182SLeandro Lupori /*- 2*68dd7182SLeandro Lupori * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 3*68dd7182SLeandro Lupori * 4*68dd7182SLeandro Lupori * Copyright (c) 2013 Justin Hibbits 5*68dd7182SLeandro Lupori * Copyright (c) 2020 Leandro Lupori 6*68dd7182SLeandro Lupori * All rights reserved. 7*68dd7182SLeandro Lupori * 8*68dd7182SLeandro Lupori * Redistribution and use in source and binary forms, with or without 9*68dd7182SLeandro Lupori * modification, are permitted provided that the following conditions 10*68dd7182SLeandro Lupori * are met: 11*68dd7182SLeandro Lupori * 1. Redistributions of source code must retain the above copyright 12*68dd7182SLeandro Lupori * notice, this list of conditions and the following disclaimer. 13*68dd7182SLeandro Lupori * 2. Redistributions in binary form must reproduce the above copyright 14*68dd7182SLeandro Lupori * notice, this list of conditions and the following disclaimer in the 15*68dd7182SLeandro Lupori * documentation and/or other materials provided with the distribution. 16*68dd7182SLeandro Lupori * 17*68dd7182SLeandro Lupori * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18*68dd7182SLeandro Lupori * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19*68dd7182SLeandro Lupori * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20*68dd7182SLeandro Lupori * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21*68dd7182SLeandro Lupori * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22*68dd7182SLeandro Lupori * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23*68dd7182SLeandro Lupori * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24*68dd7182SLeandro Lupori * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25*68dd7182SLeandro Lupori * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26*68dd7182SLeandro Lupori * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27*68dd7182SLeandro Lupori * SUCH DAMAGE. 28*68dd7182SLeandro Lupori */ 29*68dd7182SLeandro Lupori 30*68dd7182SLeandro Lupori #include <sys/cdefs.h> 31*68dd7182SLeandro Lupori __FBSDID("$FreeBSD$"); 32*68dd7182SLeandro Lupori 33*68dd7182SLeandro Lupori #include <sys/param.h> 34*68dd7182SLeandro Lupori #include <sys/pmc.h> 35*68dd7182SLeandro Lupori #include <sys/pmckern.h> 36*68dd7182SLeandro Lupori #include <sys/systm.h> 37*68dd7182SLeandro Lupori 38*68dd7182SLeandro Lupori #include <machine/pmc_mdep.h> 39*68dd7182SLeandro Lupori #include <machine/spr.h> 40*68dd7182SLeandro Lupori #include <machine/cpu.h> 41*68dd7182SLeandro Lupori 42*68dd7182SLeandro Lupori #include "hwpmc_powerpc.h" 43*68dd7182SLeandro Lupori 44*68dd7182SLeandro Lupori #define POWER8_MAX_PMCS 6 45*68dd7182SLeandro Lupori 46*68dd7182SLeandro Lupori static struct pmc_ppc_event power8_event_codes[] = { 47*68dd7182SLeandro Lupori {PMC_EV_POWER8_INSTR_COMPLETED, 48*68dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC5, 49*68dd7182SLeandro Lupori .pe_code = 0x00 50*68dd7182SLeandro Lupori }, 51*68dd7182SLeandro Lupori /* 52*68dd7182SLeandro Lupori * PMC1 can also count cycles, but as PMC6 can only count cycles 53*68dd7182SLeandro Lupori * it's better to always use it and leave PMC1 free to count 54*68dd7182SLeandro Lupori * other events. 55*68dd7182SLeandro Lupori */ 56*68dd7182SLeandro Lupori {PMC_EV_POWER8_CYCLES, 57*68dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC6, 58*68dd7182SLeandro Lupori .pe_code = 0xf0 59*68dd7182SLeandro Lupori }, 60*68dd7182SLeandro Lupori {PMC_EV_POWER8_CYCLES_WITH_INSTRS_COMPLETED, 61*68dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC1, 62*68dd7182SLeandro Lupori .pe_code = 0xf2 63*68dd7182SLeandro Lupori }, 64*68dd7182SLeandro Lupori {PMC_EV_POWER8_FPU_INSTR_COMPLETED, 65*68dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC1, 66*68dd7182SLeandro Lupori .pe_code = 0xf4 67*68dd7182SLeandro Lupori }, 68*68dd7182SLeandro Lupori {PMC_EV_POWER8_ERAT_INSTR_MISS, 69*68dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC1, 70*68dd7182SLeandro Lupori .pe_code = 0xf6 71*68dd7182SLeandro Lupori }, 72*68dd7182SLeandro Lupori {PMC_EV_POWER8_CYCLES_IDLE, 73*68dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC1, 74*68dd7182SLeandro Lupori .pe_code = 0xf8 75*68dd7182SLeandro Lupori }, 76*68dd7182SLeandro Lupori {PMC_EV_POWER8_CYCLES_WITH_ANY_THREAD_RUNNING, 77*68dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC1, 78*68dd7182SLeandro Lupori .pe_code = 0xfa 79*68dd7182SLeandro Lupori }, 80*68dd7182SLeandro Lupori {PMC_EV_POWER8_STORE_COMPLETED, 81*68dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC2, 82*68dd7182SLeandro Lupori .pe_code = 0xf0 83*68dd7182SLeandro Lupori }, 84*68dd7182SLeandro Lupori {PMC_EV_POWER8_INSTR_DISPATCHED, 85*68dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC2 | PMC_FLAG_PMC3, 86*68dd7182SLeandro Lupori .pe_code = 0xf2 87*68dd7182SLeandro Lupori }, 88*68dd7182SLeandro Lupori {PMC_EV_POWER8_CYCLES_RUNNING, 89*68dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC2, 90*68dd7182SLeandro Lupori .pe_code = 0xf4 91*68dd7182SLeandro Lupori }, 92*68dd7182SLeandro Lupori {PMC_EV_POWER8_ERAT_DATA_MISS, 93*68dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC2, 94*68dd7182SLeandro Lupori .pe_code = 0xf6 95*68dd7182SLeandro Lupori }, 96*68dd7182SLeandro Lupori {PMC_EV_POWER8_EXTERNAL_INTERRUPT, 97*68dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC2, 98*68dd7182SLeandro Lupori .pe_code = 0xf8 99*68dd7182SLeandro Lupori }, 100*68dd7182SLeandro Lupori {PMC_EV_POWER8_BRANCH_TAKEN, 101*68dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC2, 102*68dd7182SLeandro Lupori .pe_code = 0xfa 103*68dd7182SLeandro Lupori }, 104*68dd7182SLeandro Lupori {PMC_EV_POWER8_L1_INSTR_MISS, 105*68dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC2, 106*68dd7182SLeandro Lupori .pe_code = 0xfc 107*68dd7182SLeandro Lupori }, 108*68dd7182SLeandro Lupori {PMC_EV_POWER8_L2_LOAD_MISS, 109*68dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC2, 110*68dd7182SLeandro Lupori .pe_code = 0xfe 111*68dd7182SLeandro Lupori }, 112*68dd7182SLeandro Lupori {PMC_EV_POWER8_STORE_NO_REAL_ADDR, 113*68dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC3, 114*68dd7182SLeandro Lupori .pe_code = 0xf0 115*68dd7182SLeandro Lupori }, 116*68dd7182SLeandro Lupori {PMC_EV_POWER8_INSTR_COMPLETED_WITH_ALL_THREADS_RUNNING, 117*68dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC3, 118*68dd7182SLeandro Lupori .pe_code = 0xf4 119*68dd7182SLeandro Lupori }, 120*68dd7182SLeandro Lupori {PMC_EV_POWER8_L1_LOAD_MISS, 121*68dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC3, 122*68dd7182SLeandro Lupori .pe_code = 0xf6 123*68dd7182SLeandro Lupori }, 124*68dd7182SLeandro Lupori {PMC_EV_POWER8_TIMEBASE_EVENT, 125*68dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC3, 126*68dd7182SLeandro Lupori .pe_code = 0xf8 127*68dd7182SLeandro Lupori }, 128*68dd7182SLeandro Lupori {PMC_EV_POWER8_L3_INSTR_MISS, 129*68dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC3, 130*68dd7182SLeandro Lupori .pe_code = 0xfa 131*68dd7182SLeandro Lupori }, 132*68dd7182SLeandro Lupori {PMC_EV_POWER8_TLB_DATA_MISS, 133*68dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC3, 134*68dd7182SLeandro Lupori .pe_code = 0xfc 135*68dd7182SLeandro Lupori }, 136*68dd7182SLeandro Lupori {PMC_EV_POWER8_L3_LOAD_MISS, 137*68dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC3, 138*68dd7182SLeandro Lupori .pe_code = 0xfe 139*68dd7182SLeandro Lupori }, 140*68dd7182SLeandro Lupori {PMC_EV_POWER8_LOAD_NO_REAL_ADDR, 141*68dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC4, 142*68dd7182SLeandro Lupori .pe_code = 0xf0 143*68dd7182SLeandro Lupori }, 144*68dd7182SLeandro Lupori {PMC_EV_POWER8_CYCLES_WITH_INSTRS_DISPATCHED, 145*68dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC4, 146*68dd7182SLeandro Lupori .pe_code = 0xf2 147*68dd7182SLeandro Lupori }, 148*68dd7182SLeandro Lupori {PMC_EV_POWER8_CYCLES_RUNNING_PURR_INC, 149*68dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC4, 150*68dd7182SLeandro Lupori .pe_code = 0xf4 151*68dd7182SLeandro Lupori }, 152*68dd7182SLeandro Lupori {PMC_EV_POWER8_BRANCH_MISPREDICTED, 153*68dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC4, 154*68dd7182SLeandro Lupori .pe_code = 0xf6 155*68dd7182SLeandro Lupori }, 156*68dd7182SLeandro Lupori {PMC_EV_POWER8_PREFETCHED_INSTRS_DISCARDED, 157*68dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC4, 158*68dd7182SLeandro Lupori .pe_code = 0xf8 159*68dd7182SLeandro Lupori }, 160*68dd7182SLeandro Lupori {PMC_EV_POWER8_INSTR_COMPLETED_RUNNING, 161*68dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC4, 162*68dd7182SLeandro Lupori .pe_code = 0xfa 163*68dd7182SLeandro Lupori }, 164*68dd7182SLeandro Lupori {PMC_EV_POWER8_TLB_INSTR_MISS, 165*68dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC4, 166*68dd7182SLeandro Lupori .pe_code = 0xfc 167*68dd7182SLeandro Lupori }, 168*68dd7182SLeandro Lupori {PMC_EV_POWER8_CACHE_LOAD_MISS, 169*68dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC4, 170*68dd7182SLeandro Lupori .pe_code = 0xfe 171*68dd7182SLeandro Lupori } 172*68dd7182SLeandro Lupori }; 173*68dd7182SLeandro Lupori static size_t power8_event_codes_size = nitems(power8_event_codes); 174*68dd7182SLeandro Lupori 175*68dd7182SLeandro Lupori static void 176*68dd7182SLeandro Lupori power8_set_pmc(int cpu, int ri, int config) 177*68dd7182SLeandro Lupori { 178*68dd7182SLeandro Lupori register_t mmcr; 179*68dd7182SLeandro Lupori 180*68dd7182SLeandro Lupori /* Select event */ 181*68dd7182SLeandro Lupori switch (ri) { 182*68dd7182SLeandro Lupori case 0: 183*68dd7182SLeandro Lupori case 1: 184*68dd7182SLeandro Lupori case 2: 185*68dd7182SLeandro Lupori case 3: 186*68dd7182SLeandro Lupori mmcr = mfspr(SPR_MMCR1); 187*68dd7182SLeandro Lupori mmcr &= ~SPR_MMCR1_P8_PMCNSEL_MASK(ri); 188*68dd7182SLeandro Lupori mmcr |= SPR_MMCR1_P8_PMCNSEL(ri, config & ~POWERPC_PMC_ENABLE); 189*68dd7182SLeandro Lupori mtspr(SPR_MMCR1, mmcr); 190*68dd7182SLeandro Lupori break; 191*68dd7182SLeandro Lupori } 192*68dd7182SLeandro Lupori 193*68dd7182SLeandro Lupori /* 194*68dd7182SLeandro Lupori * By default, freeze counter in all states. 195*68dd7182SLeandro Lupori * If counter is being started, unfreeze it in selected states. 196*68dd7182SLeandro Lupori */ 197*68dd7182SLeandro Lupori mmcr = mfspr(SPR_MMCR2) | SPR_MMCR2_FCNHSP(ri); 198*68dd7182SLeandro Lupori if (config != PMCN_NONE) { 199*68dd7182SLeandro Lupori if (config & POWERPC_PMC_USER_ENABLE) 200*68dd7182SLeandro Lupori mmcr &= ~(SPR_MMCR2_FCNP0(ri) | 201*68dd7182SLeandro Lupori SPR_MMCR2_FCNP1(ri)); 202*68dd7182SLeandro Lupori if (config & POWERPC_PMC_KERNEL_ENABLE) 203*68dd7182SLeandro Lupori mmcr &= ~(SPR_MMCR2_FCNH(ri) | 204*68dd7182SLeandro Lupori SPR_MMCR2_FCNS(ri)); 205*68dd7182SLeandro Lupori } 206*68dd7182SLeandro Lupori mtspr(SPR_MMCR2, mmcr); 207*68dd7182SLeandro Lupori } 208*68dd7182SLeandro Lupori 209*68dd7182SLeandro Lupori static int 210*68dd7182SLeandro Lupori power8_pcpu_init(struct pmc_mdep *md, int cpu) 211*68dd7182SLeandro Lupori { 212*68dd7182SLeandro Lupori register_t mmcr0; 213*68dd7182SLeandro Lupori int i; 214*68dd7182SLeandro Lupori 215*68dd7182SLeandro Lupori powerpc_pcpu_init(md, cpu); 216*68dd7182SLeandro Lupori 217*68dd7182SLeandro Lupori /* Freeze all counters before modifying PMC registers */ 218*68dd7182SLeandro Lupori mmcr0 = mfspr(SPR_MMCR0) | SPR_MMCR0_FC; 219*68dd7182SLeandro Lupori mtspr(SPR_MMCR0, mmcr0); 220*68dd7182SLeandro Lupori 221*68dd7182SLeandro Lupori /* 222*68dd7182SLeandro Lupori * Now setup MMCR0: 223*68dd7182SLeandro Lupori * - PMAO=0: clear alerts 224*68dd7182SLeandro Lupori * - FCPC=0, FCP=0: don't freeze counters in problem state 225*68dd7182SLeandro Lupori * - FCECE: Freeze Counters on Enabled Condition or Event 226*68dd7182SLeandro Lupori * - PMC1CE/PMCNCE: PMC1/N Condition Enable 227*68dd7182SLeandro Lupori */ 228*68dd7182SLeandro Lupori mmcr0 &= ~(SPR_MMCR0_PMAO | SPR_MMCR0_FCPC | SPR_MMCR0_FCP); 229*68dd7182SLeandro Lupori mmcr0 |= SPR_MMCR0_FCECE | SPR_MMCR0_PMC1CE | SPR_MMCR0_PMCNCE; 230*68dd7182SLeandro Lupori mtspr(SPR_MMCR0, mmcr0); 231*68dd7182SLeandro Lupori 232*68dd7182SLeandro Lupori /* Clear all PMCs to prevent enabled condition interrupts */ 233*68dd7182SLeandro Lupori for (i = 0; i < POWER8_MAX_PMCS; i++) 234*68dd7182SLeandro Lupori powerpc_pmcn_write(i, 0); 235*68dd7182SLeandro Lupori 236*68dd7182SLeandro Lupori /* Disable events in PMCs 1-4 */ 237*68dd7182SLeandro Lupori mtspr(SPR_MMCR1, mfspr(SPR_MMCR1) & ~SPR_MMCR1_P8_PMCSEL_ALL); 238*68dd7182SLeandro Lupori 239*68dd7182SLeandro Lupori /* Freeze each counter, in all states */ 240*68dd7182SLeandro Lupori mtspr(SPR_MMCR2, mfspr(SPR_MMCR2) | 241*68dd7182SLeandro Lupori SPR_MMCR2_FCNHSP(0) | SPR_MMCR2_FCNHSP(1) | SPR_MMCR2_FCNHSP(2) | 242*68dd7182SLeandro Lupori SPR_MMCR2_FCNHSP(3) | SPR_MMCR2_FCNHSP(4) | SPR_MMCR2_FCNHSP(5)); 243*68dd7182SLeandro Lupori 244*68dd7182SLeandro Lupori /* Enable interrupts, unset global freeze */ 245*68dd7182SLeandro Lupori mmcr0 &= ~SPR_MMCR0_FC; 246*68dd7182SLeandro Lupori mmcr0 |= SPR_MMCR0_PMAE; 247*68dd7182SLeandro Lupori mtspr(SPR_MMCR0, mmcr0); 248*68dd7182SLeandro Lupori return (0); 249*68dd7182SLeandro Lupori } 250*68dd7182SLeandro Lupori 251*68dd7182SLeandro Lupori static int 252*68dd7182SLeandro Lupori power8_pcpu_fini(struct pmc_mdep *md, int cpu) 253*68dd7182SLeandro Lupori { 254*68dd7182SLeandro Lupori register_t mmcr0; 255*68dd7182SLeandro Lupori 256*68dd7182SLeandro Lupori /* Freeze counters, disable interrupts */ 257*68dd7182SLeandro Lupori mmcr0 = mfspr(SPR_MMCR0); 258*68dd7182SLeandro Lupori mmcr0 &= ~SPR_MMCR0_PMAE; 259*68dd7182SLeandro Lupori mmcr0 |= SPR_MMCR0_FC; 260*68dd7182SLeandro Lupori mtspr(SPR_MMCR0, mmcr0); 261*68dd7182SLeandro Lupori 262*68dd7182SLeandro Lupori return (powerpc_pcpu_fini(md, cpu)); 263*68dd7182SLeandro Lupori } 264*68dd7182SLeandro Lupori 265*68dd7182SLeandro Lupori static void 266*68dd7182SLeandro Lupori power8_resume_pmc(bool ie) 267*68dd7182SLeandro Lupori { 268*68dd7182SLeandro Lupori register_t mmcr0; 269*68dd7182SLeandro Lupori 270*68dd7182SLeandro Lupori /* Unfreeze counters and re-enable PERF exceptions if requested. */ 271*68dd7182SLeandro Lupori mmcr0 = mfspr(SPR_MMCR0); 272*68dd7182SLeandro Lupori mmcr0 &= ~(SPR_MMCR0_FC | SPR_MMCR0_PMAO | SPR_MMCR0_PMAE); 273*68dd7182SLeandro Lupori if (ie) 274*68dd7182SLeandro Lupori mmcr0 |= SPR_MMCR0_PMAE; 275*68dd7182SLeandro Lupori mtspr(SPR_MMCR0, mmcr0); 276*68dd7182SLeandro Lupori } 277*68dd7182SLeandro Lupori 278*68dd7182SLeandro Lupori int 279*68dd7182SLeandro Lupori pmc_power8_initialize(struct pmc_mdep *pmc_mdep) 280*68dd7182SLeandro Lupori { 281*68dd7182SLeandro Lupori struct pmc_classdep *pcd; 282*68dd7182SLeandro Lupori 283*68dd7182SLeandro Lupori pmc_mdep->pmd_cputype = PMC_CPU_PPC_POWER8; 284*68dd7182SLeandro Lupori 285*68dd7182SLeandro Lupori pcd = &pmc_mdep->pmd_classdep[PMC_MDEP_CLASS_INDEX_POWERPC]; 286*68dd7182SLeandro Lupori pcd->pcd_caps = POWERPC_PMC_CAPS; 287*68dd7182SLeandro Lupori pcd->pcd_class = PMC_CLASS_POWER8; 288*68dd7182SLeandro Lupori pcd->pcd_num = POWER8_MAX_PMCS; 289*68dd7182SLeandro Lupori pcd->pcd_ri = pmc_mdep->pmd_npmc; 290*68dd7182SLeandro Lupori pcd->pcd_width = 32; 291*68dd7182SLeandro Lupori 292*68dd7182SLeandro Lupori pcd->pcd_pcpu_init = power8_pcpu_init; 293*68dd7182SLeandro Lupori pcd->pcd_pcpu_fini = power8_pcpu_fini; 294*68dd7182SLeandro Lupori pcd->pcd_allocate_pmc = powerpc_allocate_pmc; 295*68dd7182SLeandro Lupori pcd->pcd_release_pmc = powerpc_release_pmc; 296*68dd7182SLeandro Lupori pcd->pcd_start_pmc = powerpc_start_pmc; 297*68dd7182SLeandro Lupori pcd->pcd_stop_pmc = powerpc_stop_pmc; 298*68dd7182SLeandro Lupori pcd->pcd_get_config = powerpc_get_config; 299*68dd7182SLeandro Lupori pcd->pcd_config_pmc = powerpc_config_pmc; 300*68dd7182SLeandro Lupori pcd->pcd_describe = powerpc_describe; 301*68dd7182SLeandro Lupori pcd->pcd_read_pmc = powerpc_read_pmc; 302*68dd7182SLeandro Lupori pcd->pcd_write_pmc = powerpc_write_pmc; 303*68dd7182SLeandro Lupori 304*68dd7182SLeandro Lupori pmc_mdep->pmd_npmc += POWER8_MAX_PMCS; 305*68dd7182SLeandro Lupori pmc_mdep->pmd_intr = powerpc_pmc_intr; 306*68dd7182SLeandro Lupori 307*68dd7182SLeandro Lupori ppc_event_codes = power8_event_codes; 308*68dd7182SLeandro Lupori ppc_event_codes_size = power8_event_codes_size; 309*68dd7182SLeandro Lupori ppc_event_first = PMC_EV_POWER8_FIRST; 310*68dd7182SLeandro Lupori ppc_event_last = PMC_EV_POWER8_LAST; 311*68dd7182SLeandro Lupori ppc_max_pmcs = POWER8_MAX_PMCS; 312*68dd7182SLeandro Lupori 313*68dd7182SLeandro Lupori powerpc_set_pmc = power8_set_pmc; 314*68dd7182SLeandro Lupori powerpc_pmcn_read = powerpc_pmcn_read_default; 315*68dd7182SLeandro Lupori powerpc_pmcn_write = powerpc_pmcn_write_default; 316*68dd7182SLeandro Lupori powerpc_resume_pmc = power8_resume_pmc; 317*68dd7182SLeandro Lupori 318*68dd7182SLeandro Lupori return (0); 319*68dd7182SLeandro Lupori } 320