xref: /freebsd-src/sys/dev/hwpmc/hwpmc_power8.c (revision 68dd71825601b91365ff0c01e5ea064fe25b51a7)
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