1169dd953SJustin Hibbits /*-
2*4d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause
3718cf2ccSPedro F. Giffuni *
4169dd953SJustin Hibbits * Copyright (c) 2013 Justin Hibbits
5169dd953SJustin Hibbits * All rights reserved.
6169dd953SJustin Hibbits *
7169dd953SJustin Hibbits * Redistribution and use in source and binary forms, with or without
8169dd953SJustin Hibbits * modification, are permitted provided that the following conditions
9169dd953SJustin Hibbits * are met:
10169dd953SJustin Hibbits * 1. Redistributions of source code must retain the above copyright
11169dd953SJustin Hibbits * notice, this list of conditions and the following disclaimer.
12169dd953SJustin Hibbits * 2. Redistributions in binary form must reproduce the above copyright
13169dd953SJustin Hibbits * notice, this list of conditions and the following disclaimer in the
14169dd953SJustin Hibbits * documentation and/or other materials provided with the distribution.
15169dd953SJustin Hibbits *
16169dd953SJustin Hibbits * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17169dd953SJustin Hibbits * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18169dd953SJustin Hibbits * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19169dd953SJustin Hibbits * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20169dd953SJustin Hibbits * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21169dd953SJustin Hibbits * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22169dd953SJustin Hibbits * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23169dd953SJustin Hibbits * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24169dd953SJustin Hibbits * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25169dd953SJustin Hibbits * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26169dd953SJustin Hibbits * SUCH DAMAGE.
27169dd953SJustin Hibbits *
28169dd953SJustin Hibbits */
29169dd953SJustin Hibbits
30169dd953SJustin Hibbits #include <sys/param.h>
31169dd953SJustin Hibbits #include <sys/pmc.h>
32169dd953SJustin Hibbits #include <sys/pmckern.h>
33169dd953SJustin Hibbits #include <sys/systm.h>
34169dd953SJustin Hibbits
35169dd953SJustin Hibbits #include <machine/pmc_mdep.h>
36169dd953SJustin Hibbits #include <machine/spr.h>
37169dd953SJustin Hibbits #include <machine/cpu.h>
38169dd953SJustin Hibbits
39169dd953SJustin Hibbits #include "hwpmc_powerpc.h"
40169dd953SJustin Hibbits
41169dd953SJustin Hibbits #define PPC970_MAX_PMCS 8
4268dd7182SLeandro Lupori #define PMC_PPC970_FLAG_PMCS 0x000000ff
43169dd953SJustin Hibbits
44169dd953SJustin Hibbits /* MMCR0, PMC1 is 8 bytes in, PMC2 is 1 byte in. */
45169dd953SJustin Hibbits #define PPC970_SET_MMCR0_PMCSEL(r, x, i) \
46169dd953SJustin Hibbits ((r & ~(0x1f << (7 * (1 - i) + 1))) | (x << (7 * (1 - i) + 1)))
47169dd953SJustin Hibbits /* MMCR1 has 6 PMC*SEL items (PMC3->PMC8), in sequence. */
48169dd953SJustin Hibbits #define PPC970_SET_MMCR1_PMCSEL(r, x, i) \
49169dd953SJustin Hibbits ((r & ~(0x1f << (5 * (7 - i) + 2))) | (x << (5 * (7 - i) + 2)))
50169dd953SJustin Hibbits
51169dd953SJustin Hibbits /* How PMC works on PPC970:
52169dd953SJustin Hibbits *
53169dd953SJustin Hibbits * Any PMC can count a direct event. Indirect events are handled specially.
54169dd953SJustin Hibbits * Direct events: As published.
55169dd953SJustin Hibbits *
56169dd953SJustin Hibbits * Encoding 00 000 -- Add byte lane bit counters
57169dd953SJustin Hibbits * MMCR1[24:31] -- select bit matching PMC being an adder.
58169dd953SJustin Hibbits * Bus events:
59169dd953SJustin Hibbits * PMCxSEL: 1x -- select from byte lane: 10 == lower lane (0/1), 11 == upper
60169dd953SJustin Hibbits * lane (2/3).
61169dd953SJustin Hibbits * PMCxSEL[2:4] -- bit in the byte lane selected.
62169dd953SJustin Hibbits *
63169dd953SJustin Hibbits * PMC[1,2,5,6] == lane 0/lane 2
64169dd953SJustin Hibbits * PMC[3,4,7,8] == lane 1,3
65169dd953SJustin Hibbits *
66169dd953SJustin Hibbits *
67169dd953SJustin Hibbits * Lanes:
68169dd953SJustin Hibbits * Lane 0 -- TTM0(FPU,ISU,IFU,VPU)
69169dd953SJustin Hibbits * TTM1(IDU,ISU,STS)
70169dd953SJustin Hibbits * LSU0 byte 0
71169dd953SJustin Hibbits * LSU1 byte 0
72169dd953SJustin Hibbits * Lane 1 -- TTM0
73169dd953SJustin Hibbits * TTM1
74169dd953SJustin Hibbits * LSU0 byte 1
75169dd953SJustin Hibbits * LSU1 byte 1
76169dd953SJustin Hibbits * Lane 2 -- TTM0
77169dd953SJustin Hibbits * TTM1
78169dd953SJustin Hibbits * LSU0 byte 2
79169dd953SJustin Hibbits * LSU1 byte 2 or byte 6
80169dd953SJustin Hibbits * Lane 3 -- TTM0
81169dd953SJustin Hibbits * TTM1
82169dd953SJustin Hibbits * LSU0 byte 3
83169dd953SJustin Hibbits * LSU1 byte 3 or byte 7
84169dd953SJustin Hibbits *
85169dd953SJustin Hibbits * Adders:
86169dd953SJustin Hibbits * Add byte lane for PMC (above), bit 0+4, 1+5, 2+6, 3+7
87169dd953SJustin Hibbits */
88169dd953SJustin Hibbits
8968dd7182SLeandro Lupori static struct pmc_ppc_event ppc970_event_codes[] = {
90169dd953SJustin Hibbits {PMC_EV_PPC970_INSTR_COMPLETED,
91169dd953SJustin Hibbits .pe_flags = PMC_PPC970_FLAG_PMCS,
92169dd953SJustin Hibbits .pe_code = 0x09
93169dd953SJustin Hibbits },
94169dd953SJustin Hibbits {PMC_EV_PPC970_MARKED_GROUP_DISPATCH,
9568dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC1,
96169dd953SJustin Hibbits .pe_code = 0x2
97169dd953SJustin Hibbits },
98169dd953SJustin Hibbits {PMC_EV_PPC970_MARKED_STORE_COMPLETED,
9968dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC1,
100169dd953SJustin Hibbits .pe_code = 0x03
101169dd953SJustin Hibbits },
102169dd953SJustin Hibbits {PMC_EV_PPC970_GCT_EMPTY,
10368dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC1,
104169dd953SJustin Hibbits .pe_code = 0x04
105169dd953SJustin Hibbits },
106169dd953SJustin Hibbits {PMC_EV_PPC970_RUN_CYCLES,
10768dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC1,
108169dd953SJustin Hibbits .pe_code = 0x05
109169dd953SJustin Hibbits },
110169dd953SJustin Hibbits {PMC_EV_PPC970_OVERFLOW,
111169dd953SJustin Hibbits .pe_flags = PMC_PPC970_FLAG_PMCS,
112169dd953SJustin Hibbits .pe_code = 0x0a
113169dd953SJustin Hibbits },
114169dd953SJustin Hibbits {PMC_EV_PPC970_CYCLES,
115169dd953SJustin Hibbits .pe_flags = PMC_PPC970_FLAG_PMCS,
116169dd953SJustin Hibbits .pe_code = 0x0f
117169dd953SJustin Hibbits },
118169dd953SJustin Hibbits {PMC_EV_PPC970_THRESHOLD_TIMEOUT,
11968dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC2,
120169dd953SJustin Hibbits .pe_code = 0x3
121169dd953SJustin Hibbits },
122169dd953SJustin Hibbits {PMC_EV_PPC970_GROUP_DISPATCH,
12368dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC2,
124169dd953SJustin Hibbits .pe_code = 0x4
125169dd953SJustin Hibbits },
126169dd953SJustin Hibbits {PMC_EV_PPC970_BR_MARKED_INSTR_FINISH,
12768dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC2,
128169dd953SJustin Hibbits .pe_code = 0x5
129169dd953SJustin Hibbits },
130169dd953SJustin Hibbits {PMC_EV_PPC970_GCT_EMPTY_BY_SRQ_FULL,
13168dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC2,
132169dd953SJustin Hibbits .pe_code = 0xb
133169dd953SJustin Hibbits },
134169dd953SJustin Hibbits {PMC_EV_PPC970_STOP_COMPLETION,
13568dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC3,
136169dd953SJustin Hibbits .pe_code = 0x1
137169dd953SJustin Hibbits },
138169dd953SJustin Hibbits {PMC_EV_PPC970_LSU_EMPTY,
13968dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC3,
140169dd953SJustin Hibbits .pe_code = 0x2
141169dd953SJustin Hibbits },
142169dd953SJustin Hibbits {PMC_EV_PPC970_MARKED_STORE_WITH_INTR,
14368dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC3,
144169dd953SJustin Hibbits .pe_code = 0x3
145169dd953SJustin Hibbits },
146169dd953SJustin Hibbits {PMC_EV_PPC970_CYCLES_IN_SUPER,
14768dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC3,
148169dd953SJustin Hibbits .pe_code = 0x4
149169dd953SJustin Hibbits },
150169dd953SJustin Hibbits {PMC_EV_PPC970_VPU_MARKED_INSTR_COMPLETED,
15168dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC3,
152169dd953SJustin Hibbits .pe_code = 0x5
153169dd953SJustin Hibbits },
154169dd953SJustin Hibbits {PMC_EV_PPC970_FXU0_IDLE_FXU1_BUSY,
15568dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC4,
156169dd953SJustin Hibbits .pe_code = 0x2
157169dd953SJustin Hibbits },
158169dd953SJustin Hibbits {PMC_EV_PPC970_SRQ_EMPTY,
15968dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC4,
160169dd953SJustin Hibbits .pe_code = 0x3
161169dd953SJustin Hibbits },
162169dd953SJustin Hibbits {PMC_EV_PPC970_MARKED_GROUP_COMPLETED,
16368dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC4,
164169dd953SJustin Hibbits .pe_code = 0x4
165169dd953SJustin Hibbits },
166169dd953SJustin Hibbits {PMC_EV_PPC970_CR_MARKED_INSTR_FINISH,
16768dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC4,
168169dd953SJustin Hibbits .pe_code = 0x5
169169dd953SJustin Hibbits },
170169dd953SJustin Hibbits {PMC_EV_PPC970_DISPATCH_SUCCESS,
17168dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC5,
172169dd953SJustin Hibbits .pe_code = 0x1
173169dd953SJustin Hibbits },
174169dd953SJustin Hibbits {PMC_EV_PPC970_FXU0_IDLE_FXU1_IDLE,
17568dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC5,
176169dd953SJustin Hibbits .pe_code = 0x2
177169dd953SJustin Hibbits },
178169dd953SJustin Hibbits {PMC_EV_PPC970_ONE_PLUS_INSTR_COMPLETED,
17968dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC5,
180169dd953SJustin Hibbits .pe_code = 0x3
181169dd953SJustin Hibbits },
182169dd953SJustin Hibbits {PMC_EV_PPC970_GROUP_MARKED_IDU,
18368dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC5,
184169dd953SJustin Hibbits .pe_code = 0x4
185169dd953SJustin Hibbits },
186169dd953SJustin Hibbits {PMC_EV_PPC970_MARKED_GROUP_COMPLETE_TIMEOUT,
18768dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC5,
188169dd953SJustin Hibbits .pe_code = 0x5
189169dd953SJustin Hibbits },
190169dd953SJustin Hibbits {PMC_EV_PPC970_FXU0_BUSY_FXU1_BUSY,
19168dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC6,
192169dd953SJustin Hibbits .pe_code = 0x2
193169dd953SJustin Hibbits },
194169dd953SJustin Hibbits {PMC_EV_PPC970_MARKED_STORE_SENT_TO_STS,
19568dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC6,
196169dd953SJustin Hibbits .pe_code = 0x3
197169dd953SJustin Hibbits },
198169dd953SJustin Hibbits {PMC_EV_PPC970_FXU_MARKED_INSTR_FINISHED,
19968dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC6,
200169dd953SJustin Hibbits .pe_code = 0x4
201169dd953SJustin Hibbits },
202169dd953SJustin Hibbits {PMC_EV_PPC970_MARKED_GROUP_ISSUED,
20368dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC6,
204169dd953SJustin Hibbits .pe_code = 0x5
205169dd953SJustin Hibbits },
206169dd953SJustin Hibbits {PMC_EV_PPC970_FXU0_BUSY_FXU1_IDLE,
20768dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC7,
208169dd953SJustin Hibbits .pe_code = 0x2
209169dd953SJustin Hibbits },
210169dd953SJustin Hibbits {PMC_EV_PPC970_GROUP_COMPLETED,
21168dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC7,
212169dd953SJustin Hibbits .pe_code = 0x3
213169dd953SJustin Hibbits },
214169dd953SJustin Hibbits {PMC_EV_PPC970_FPU_MARKED_INSTR_COMPLETED,
21568dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC7,
216169dd953SJustin Hibbits .pe_code = 0x4
217169dd953SJustin Hibbits },
218169dd953SJustin Hibbits {PMC_EV_PPC970_MARKED_INSTR_FINISH_ANY_UNIT,
21968dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC7,
220169dd953SJustin Hibbits .pe_code = 0x5
221169dd953SJustin Hibbits },
222169dd953SJustin Hibbits {PMC_EV_PPC970_EXTERNAL_INTERRUPT,
22368dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC8,
224169dd953SJustin Hibbits .pe_code = 0x2
225169dd953SJustin Hibbits },
226169dd953SJustin Hibbits {PMC_EV_PPC970_GROUP_DISPATCH_REJECT,
22768dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC8,
228169dd953SJustin Hibbits .pe_code = 0x3
229169dd953SJustin Hibbits },
230169dd953SJustin Hibbits {PMC_EV_PPC970_LSU_MARKED_INSTR_FINISH,
23168dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC8,
232169dd953SJustin Hibbits .pe_code = 0x4
233169dd953SJustin Hibbits },
234169dd953SJustin Hibbits {PMC_EV_PPC970_TIMEBASE_EVENT,
23568dd7182SLeandro Lupori .pe_flags = PMC_FLAG_PMC8,
236169dd953SJustin Hibbits .pe_code = 0x5
237169dd953SJustin Hibbits },
238169dd953SJustin Hibbits #if 0
239169dd953SJustin Hibbits {PMC_EV_PPC970_LSU_COMPLETION_STALL, },
240169dd953SJustin Hibbits {PMC_EV_PPC970_FXU_COMPLETION_STALL, },
241169dd953SJustin Hibbits {PMC_EV_PPC970_DCACHE_MISS_COMPLETION_STALL, },
242169dd953SJustin Hibbits {PMC_EV_PPC970_FPU_COMPLETION_STALL, },
243169dd953SJustin Hibbits {PMC_EV_PPC970_FXU_LONG_INSTR_COMPLETION_STALL, },
244169dd953SJustin Hibbits {PMC_EV_PPC970_REJECT_COMPLETION_STALL, },
245169dd953SJustin Hibbits {PMC_EV_PPC970_FPU_LONG_INSTR_COMPLETION_STALL, },
246169dd953SJustin Hibbits {PMC_EV_PPC970_GCT_EMPTY_BY_ICACHE_MISS, },
247169dd953SJustin Hibbits {PMC_EV_PPC970_REJECT_COMPLETION_STALL_ERAT_MISS, },
248169dd953SJustin Hibbits {PMC_EV_PPC970_GCT_EMPTY_BY_BRANCH_MISS_PREDICT, },
249169dd953SJustin Hibbits #endif
250169dd953SJustin Hibbits };
251169dd953SJustin Hibbits static size_t ppc970_event_codes_size = nitems(ppc970_event_codes);
252169dd953SJustin Hibbits
253169dd953SJustin Hibbits static void
ppc970_set_pmc(int cpu,int ri,int config)254169dd953SJustin Hibbits ppc970_set_pmc(int cpu, int ri, int config)
255169dd953SJustin Hibbits {
256169dd953SJustin Hibbits register_t pmc_mmcr;
25768dd7182SLeandro Lupori int config_mask;
258169dd953SJustin Hibbits
25968dd7182SLeandro Lupori if (config == PMCN_NONE)
26068dd7182SLeandro Lupori config = PMC970N_NONE;
26168dd7182SLeandro Lupori
26268dd7182SLeandro Lupori /*
26368dd7182SLeandro Lupori * The mask is inverted (enable is 1) compared to the flags in MMCR0,
26468dd7182SLeandro Lupori * which are Freeze flags.
26568dd7182SLeandro Lupori */
26668dd7182SLeandro Lupori config_mask = ~config & POWERPC_PMC_ENABLE;
26768dd7182SLeandro Lupori config &= ~POWERPC_PMC_ENABLE;
26868dd7182SLeandro Lupori
269169dd953SJustin Hibbits /*
270169dd953SJustin Hibbits * Disable the PMCs.
271169dd953SJustin Hibbits */
272169dd953SJustin Hibbits switch (ri) {
273169dd953SJustin Hibbits case 0:
274169dd953SJustin Hibbits case 1:
2759fe896ecSLeandro Lupori pmc_mmcr = mfspr(SPR_MMCR0);
276169dd953SJustin Hibbits pmc_mmcr = PPC970_SET_MMCR0_PMCSEL(pmc_mmcr, config, ri);
2779fe896ecSLeandro Lupori mtspr(SPR_MMCR0, pmc_mmcr);
278169dd953SJustin Hibbits break;
279169dd953SJustin Hibbits case 2:
280169dd953SJustin Hibbits case 3:
281169dd953SJustin Hibbits case 4:
282169dd953SJustin Hibbits case 5:
283169dd953SJustin Hibbits case 6:
284169dd953SJustin Hibbits case 7:
2859fe896ecSLeandro Lupori pmc_mmcr = mfspr(SPR_MMCR1);
286169dd953SJustin Hibbits pmc_mmcr = PPC970_SET_MMCR1_PMCSEL(pmc_mmcr, config, ri);
2879fe896ecSLeandro Lupori mtspr(SPR_MMCR1, pmc_mmcr);
288169dd953SJustin Hibbits break;
289169dd953SJustin Hibbits }
290169dd953SJustin Hibbits
29168dd7182SLeandro Lupori if (config != PMC970N_NONE) {
2929fe896ecSLeandro Lupori pmc_mmcr = mfspr(SPR_MMCR0);
293169dd953SJustin Hibbits pmc_mmcr &= ~SPR_MMCR0_FC;
29468dd7182SLeandro Lupori pmc_mmcr |= config_mask;
2959fe896ecSLeandro Lupori mtspr(SPR_MMCR0, pmc_mmcr);
296169dd953SJustin Hibbits }
297169dd953SJustin Hibbits }
298169dd953SJustin Hibbits
299169dd953SJustin Hibbits static int
ppc970_pcpu_init(struct pmc_mdep * md,int cpu)300169dd953SJustin Hibbits ppc970_pcpu_init(struct pmc_mdep *md, int cpu)
301169dd953SJustin Hibbits {
30268dd7182SLeandro Lupori powerpc_pcpu_init(md, cpu);
303169dd953SJustin Hibbits
304169dd953SJustin Hibbits /* Clear the MMCRs, and set FC, to disable all PMCs. */
305169dd953SJustin Hibbits /* 970 PMC is not counted when set to 0x08 */
3069fe896ecSLeandro Lupori mtspr(SPR_MMCR0, SPR_MMCR0_FC | SPR_MMCR0_PMXE |
307409062f1SJustin Hibbits SPR_MMCR0_FCECE | SPR_MMCR0_PMC1CE | SPR_MMCR0_PMCNCE |
3089fe896ecSLeandro Lupori SPR_MMCR0_PMC1SEL(0x8) | SPR_MMCR0_PMC2SEL(0x8));
3099fe896ecSLeandro Lupori mtspr(SPR_MMCR1, 0x4218420);
310169dd953SJustin Hibbits
31168dd7182SLeandro Lupori return (0);
312169dd953SJustin Hibbits }
313169dd953SJustin Hibbits
314169dd953SJustin Hibbits static int
ppc970_pcpu_fini(struct pmc_mdep * md,int cpu)315169dd953SJustin Hibbits ppc970_pcpu_fini(struct pmc_mdep *md, int cpu)
316169dd953SJustin Hibbits {
31768dd7182SLeandro Lupori register_t mmcr0;
318169dd953SJustin Hibbits
31968dd7182SLeandro Lupori /* Freeze counters, disable interrupts */
32068dd7182SLeandro Lupori mmcr0 = mfspr(SPR_MMCR0);
321169dd953SJustin Hibbits mmcr0 &= ~SPR_MMCR0_PMXE;
32268dd7182SLeandro Lupori mmcr0 |= SPR_MMCR0_FC;
323169dd953SJustin Hibbits mtspr(SPR_MMCR0, mmcr0);
3248a00edeaSJustin Hibbits
32568dd7182SLeandro Lupori return (powerpc_pcpu_fini(md, cpu));
326169dd953SJustin Hibbits }
327169dd953SJustin Hibbits
32868dd7182SLeandro Lupori static void
ppc970_resume_pmc(bool ie)32968dd7182SLeandro Lupori ppc970_resume_pmc(bool ie)
330169dd953SJustin Hibbits {
33168dd7182SLeandro Lupori register_t mmcr0;
332169dd953SJustin Hibbits
33368dd7182SLeandro Lupori /* Unfreeze counters and re-enable PERF exceptions if requested. */
33468dd7182SLeandro Lupori mmcr0 = mfspr(SPR_MMCR0);
33568dd7182SLeandro Lupori mmcr0 &= ~(SPR_MMCR0_FC | SPR_MMCR0_PMXE);
33668dd7182SLeandro Lupori if (ie)
33768dd7182SLeandro Lupori mmcr0 |= SPR_MMCR0_PMXE;
33868dd7182SLeandro Lupori mtspr(SPR_MMCR0, mmcr0);
339169dd953SJustin Hibbits }
340169dd953SJustin Hibbits
341169dd953SJustin Hibbits int
pmc_ppc970_initialize(struct pmc_mdep * pmc_mdep)342169dd953SJustin Hibbits pmc_ppc970_initialize(struct pmc_mdep *pmc_mdep)
343169dd953SJustin Hibbits {
344169dd953SJustin Hibbits struct pmc_classdep *pcd;
345169dd953SJustin Hibbits
346169dd953SJustin Hibbits pmc_mdep->pmd_cputype = PMC_CPU_PPC_970;
347169dd953SJustin Hibbits
348a7452468SJustin Hibbits pcd = &pmc_mdep->pmd_classdep[PMC_MDEP_CLASS_INDEX_POWERPC];
349169dd953SJustin Hibbits pcd->pcd_caps = POWERPC_PMC_CAPS;
350169dd953SJustin Hibbits pcd->pcd_class = PMC_CLASS_PPC970;
351169dd953SJustin Hibbits pcd->pcd_num = PPC970_MAX_PMCS;
352169dd953SJustin Hibbits pcd->pcd_ri = pmc_mdep->pmd_npmc;
353169dd953SJustin Hibbits pcd->pcd_width = 32;
354169dd953SJustin Hibbits
35568dd7182SLeandro Lupori pcd->pcd_allocate_pmc = powerpc_allocate_pmc;
35668dd7182SLeandro Lupori pcd->pcd_config_pmc = powerpc_config_pmc;
357169dd953SJustin Hibbits pcd->pcd_pcpu_fini = ppc970_pcpu_fini;
358169dd953SJustin Hibbits pcd->pcd_pcpu_init = ppc970_pcpu_init;
359169dd953SJustin Hibbits pcd->pcd_describe = powerpc_describe;
360169dd953SJustin Hibbits pcd->pcd_get_config = powerpc_get_config;
36168dd7182SLeandro Lupori pcd->pcd_read_pmc = powerpc_read_pmc;
36268dd7182SLeandro Lupori pcd->pcd_release_pmc = powerpc_release_pmc;
36368dd7182SLeandro Lupori pcd->pcd_start_pmc = powerpc_start_pmc;
36468dd7182SLeandro Lupori pcd->pcd_stop_pmc = powerpc_stop_pmc;
36568dd7182SLeandro Lupori pcd->pcd_write_pmc = powerpc_write_pmc;
366169dd953SJustin Hibbits
367169dd953SJustin Hibbits pmc_mdep->pmd_npmc += PPC970_MAX_PMCS;
36868dd7182SLeandro Lupori pmc_mdep->pmd_intr = powerpc_pmc_intr;
36968dd7182SLeandro Lupori
37068dd7182SLeandro Lupori ppc_event_codes = ppc970_event_codes;
37168dd7182SLeandro Lupori ppc_event_codes_size = ppc970_event_codes_size;
37268dd7182SLeandro Lupori ppc_event_first = PMC_EV_PPC970_FIRST;
37368dd7182SLeandro Lupori ppc_event_last = PMC_EV_PPC970_LAST;
37468dd7182SLeandro Lupori ppc_max_pmcs = PPC970_MAX_PMCS;
375315cd55dSMitchell Horne ppc_class = pcd->pcd_class;
37668dd7182SLeandro Lupori
37768dd7182SLeandro Lupori powerpc_set_pmc = ppc970_set_pmc;
37868dd7182SLeandro Lupori powerpc_pmcn_read = powerpc_pmcn_read_default;
37968dd7182SLeandro Lupori powerpc_pmcn_write = powerpc_pmcn_write_default;
38068dd7182SLeandro Lupori powerpc_resume_pmc = ppc970_resume_pmc;
381169dd953SJustin Hibbits
382169dd953SJustin Hibbits return (0);
383169dd953SJustin Hibbits }
384