Lines Matching +full:1 +full:- +full:cpu

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
11 * 1. Redistributions of source code must retain the above copyright
42 #include <machine/cpu.h>
61 void (*powerpc_set_pmc)(int cpu, int ri, int config);
85 pc = sp[1]; in pmc_save_kernel_callchain()
106 powerpc_describe(int cpu, int ri, struct pmc_info *pi, struct pmc **ppmc) in powerpc_describe() argument
110 KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), in powerpc_describe()
111 ("[powerpc,%d], illegal CPU %d", __LINE__, cpu)); in powerpc_describe()
113 phw = &powerpc_pcpu[cpu]->pc_ppcpmcs[ri]; in powerpc_describe()
115 snprintf(pi->pm_name, sizeof(pi->pm_name), "POWERPC-%d", ri); in powerpc_describe()
116 pi->pm_class = powerpc_pcpu[cpu]->pc_class; in powerpc_describe()
118 if (phw->phw_state & PMC_PHW_FLAG_IS_ENABLED) { in powerpc_describe()
119 pi->pm_enabled = TRUE; in powerpc_describe()
120 *ppmc = phw->phw_pmc; in powerpc_describe()
122 pi->pm_enabled = FALSE; in powerpc_describe()
130 powerpc_get_config(int cpu, int ri, struct pmc **ppm) in powerpc_get_config() argument
133 *ppm = powerpc_pcpu[cpu]->pc_ppcpmcs[ri].phw_pmc; in powerpc_get_config()
139 powerpc_pcpu_init(struct pmc_mdep *md, int cpu) in powerpc_pcpu_init() argument
146 KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), in powerpc_pcpu_init()
147 ("[powerpc,%d] wrong cpu number %d", __LINE__, cpu)); in powerpc_pcpu_init()
148 PMCDBG1(MDP,INI,1,"powerpc-init cpu=%d", cpu); in powerpc_pcpu_init()
150 powerpc_pcpu[cpu] = pac = malloc(sizeof(struct powerpc_cpu) + in powerpc_pcpu_init()
152 pac->pc_class = in powerpc_pcpu_init()
153 md->pmd_classdep[PMC_MDEP_CLASS_INDEX_POWERPC].pcd_class; in powerpc_pcpu_init()
155 pc = pmc_pcpu[cpu]; in powerpc_pcpu_init()
156 first_ri = md->pmd_classdep[PMC_MDEP_CLASS_INDEX_POWERPC].pcd_ri; in powerpc_pcpu_init()
157 KASSERT(pc != NULL, ("[powerpc,%d] NULL per-cpu pointer", __LINE__)); in powerpc_pcpu_init()
159 for (i = 0, phw = pac->pc_ppcpmcs; i < ppc_max_pmcs; i++, phw++) { in powerpc_pcpu_init()
160 phw->phw_state = PMC_PHW_FLAG_IS_ENABLED | in powerpc_pcpu_init()
161 PMC_PHW_CPU_TO_STATE(cpu) | PMC_PHW_INDEX_TO_STATE(i); in powerpc_pcpu_init()
162 phw->phw_pmc = NULL; in powerpc_pcpu_init()
163 pc->pc_hwpmcs[i + first_ri] = phw; in powerpc_pcpu_init()
170 powerpc_pcpu_fini(struct pmc_mdep *md, int cpu) in powerpc_pcpu_fini() argument
172 PMCDBG1(MDP,INI,1,"powerpc-fini cpu=%d", cpu); in powerpc_pcpu_fini()
174 free(powerpc_pcpu[cpu], M_PMC); in powerpc_pcpu_fini()
175 powerpc_pcpu[cpu] = NULL; in powerpc_pcpu_fini()
181 powerpc_allocate_pmc(int cpu, int ri, struct pmc *pm, in powerpc_allocate_pmc() argument
188 KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), in powerpc_allocate_pmc()
189 ("[powerpc,%d] illegal CPU value %d", __LINE__, cpu)); in powerpc_allocate_pmc()
193 if (a->pm_class != ppc_class) in powerpc_allocate_pmc()
196 caps = a->pm_caps; in powerpc_allocate_pmc()
198 pe = a->pm_ev; in powerpc_allocate_pmc()
213 if ((counter & (1 << ri)) == 0) in powerpc_allocate_pmc()
223 pm->pm_md.pm_powerpc.pm_powerpc_evsel = config; in powerpc_allocate_pmc()
225 PMCDBG3(MDP,ALL,1,"powerpc-allocate cpu=%d ri=%d -> config=0x%x", in powerpc_allocate_pmc()
226 cpu, ri, config); in powerpc_allocate_pmc()
231 powerpc_release_pmc(int cpu, int ri, struct pmc *pmc) in powerpc_release_pmc() argument
235 KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), in powerpc_release_pmc()
236 ("[powerpc,%d] illegal CPU value %d", __LINE__, cpu)); in powerpc_release_pmc()
238 ("[powerpc,%d] illegal row-index %d", __LINE__, ri)); in powerpc_release_pmc()
240 phw = &powerpc_pcpu[cpu]->pc_ppcpmcs[ri]; in powerpc_release_pmc()
241 KASSERT(phw->phw_pmc == NULL, in powerpc_release_pmc()
242 ("[powerpc,%d] PHW pmc %p non-NULL", __LINE__, phw->phw_pmc)); in powerpc_release_pmc()
248 powerpc_start_pmc(int cpu, int ri, struct pmc *pm) in powerpc_start_pmc() argument
251 PMCDBG2(MDP,STA,1,"powerpc-start cpu=%d ri=%d", cpu, ri); in powerpc_start_pmc()
252 powerpc_set_pmc(cpu, ri, pm->pm_md.pm_powerpc.pm_powerpc_evsel); in powerpc_start_pmc()
258 powerpc_stop_pmc(int cpu, int ri, struct pmc *pm __unused) in powerpc_stop_pmc() argument
260 PMCDBG2(MDP,STO,1, "powerpc-stop cpu=%d ri=%d", cpu, ri); in powerpc_stop_pmc()
261 powerpc_set_pmc(cpu, ri, PMCN_NONE); in powerpc_stop_pmc()
266 powerpc_config_pmc(int cpu, int ri, struct pmc *pm) in powerpc_config_pmc() argument
270 PMCDBG3(MDP,CFG,1, "powerpc-config cpu=%d ri=%d pm=%p", cpu, ri, pm); in powerpc_config_pmc()
272 KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), in powerpc_config_pmc()
273 ("[powerpc,%d] illegal CPU value %d", __LINE__, cpu)); in powerpc_config_pmc()
275 ("[powerpc,%d] illegal row-index %d", __LINE__, ri)); in powerpc_config_pmc()
277 phw = &powerpc_pcpu[cpu]->pc_ppcpmcs[ri]; in powerpc_config_pmc()
279 KASSERT(pm == NULL || phw->phw_pmc == NULL, in powerpc_config_pmc()
280 ("[powerpc,%d] pm=%p phw->pm=%p hwpmc not unconfigured", in powerpc_config_pmc()
281 __LINE__, pm, phw->phw_pmc)); in powerpc_config_pmc()
283 phw->phw_pmc = pm; in powerpc_config_pmc()
300 case 1: in powerpc_pmcn_read_default()
336 case 1: in powerpc_pmcn_write_default()
361 powerpc_read_pmc(int cpu, int ri, struct pmc *pm, pmc_value_t *v) in powerpc_read_pmc() argument
365 KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), in powerpc_read_pmc()
366 ("[powerpc,%d] illegal CPU value %d", __LINE__, cpu)); in powerpc_read_pmc()
372 * is not always MAX_PMC_VALUE + 1, but may be a little above it. in powerpc_read_pmc()
379 r = pm->pm_sc.pm_reloadcount; in powerpc_read_pmc()
383 * Special case 1: r is too big in powerpc_read_pmc()
398 tmp = p + (POWERPC_MAX_PMC_VALUE + 1) * PPC_OVERFLOWCNT(pm); in powerpc_read_pmc()
400 PMCDBG5(MDP,REA,1,"ppc-read cpu=%d ri=%d -> %jx (%jx,%jx)", in powerpc_read_pmc()
401 cpu, ri, (uintmax_t)tmp, (uintmax_t)PPC_OVERFLOWCNT(pm), in powerpc_read_pmc()
408 powerpc_write_pmc(int cpu, int ri, struct pmc *pm, pmc_value_t v) in powerpc_write_pmc() argument
412 KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), in powerpc_write_pmc()
413 ("[powerpc,%d] illegal CPU value %d", __LINE__, cpu)); in powerpc_write_pmc()
415 ("[powerpc,%d] illegal row-index %d", __LINE__, ri)); in powerpc_write_pmc()
418 PPC_OVERFLOWCNT(pm) = v / (POWERPC_MAX_PMC_VALUE + 1); in powerpc_write_pmc()
419 vlo = v % (POWERPC_MAX_PMC_VALUE + 1); in powerpc_write_pmc()
422 "powerpc-write cpu=%d ri=%d: PMC value is too big: %jx", in powerpc_write_pmc()
423 cpu, ri, (uintmax_t)v); in powerpc_write_pmc()
428 PMCDBG5(MDP,WRI,1,"powerpc-write cpu=%d ri=%d -> %jx (%jx,%jx)", in powerpc_write_pmc()
429 cpu, ri, (uintmax_t)v, (uintmax_t)PPC_OVERFLOWCNT(pm), in powerpc_write_pmc()
441 int cpu, error, i, retval; in powerpc_pmc_intr() local
443 cpu = curcpu; in powerpc_pmc_intr()
444 KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), in powerpc_pmc_intr()
445 ("[powerpc,%d] out of range CPU %d", __LINE__, cpu)); in powerpc_pmc_intr()
447 PMCDBG3(MDP,INT,1, "cpu=%d tf=%p um=%d", cpu, (void *) tf, in powerpc_pmc_intr()
451 pc = powerpc_pcpu[cpu]; in powerpc_pmc_intr()
460 retval = 1; /* Found an interrupting PMC. */ in powerpc_pmc_intr()
468 if ((pm = pc->pc_ppcpmcs[i].phw_pmc) != NULL && in powerpc_pmc_intr()
470 if (pm->pm_state != PMC_STATE_RUNNING) { in powerpc_pmc_intr()
471 powerpc_write_pmc(cpu, i, pm, in powerpc_pmc_intr()
472 pm->pm_sc.pm_reloadcount); in powerpc_pmc_intr()
478 1) % PPC_OVERFLOWCNT_MAX; in powerpc_pmc_intr()
480 "cpu=%d ri=%d: overflowcnt=%d", in powerpc_pmc_intr()
481 cpu, i, PPC_OVERFLOWCNT(pm)); in powerpc_pmc_intr()
491 "cpu=%d ri=%d: error %d processing interrupt", in powerpc_pmc_intr()
492 cpu, i, error); in powerpc_pmc_intr()
493 powerpc_stop_pmc(cpu, i, pm); in powerpc_pmc_intr()
497 powerpc_write_pmc(cpu, i, pm, pm->pm_sc.pm_reloadcount); in powerpc_pmc_intr()
501 counter_u64_add(pmc_stats.pm_intr_processed, 1); in powerpc_pmc_intr()
503 counter_u64_add(pmc_stats.pm_intr_ignored, 1); in powerpc_pmc_intr()
506 * Re-enable PERF exceptions if we were able to find the interrupt in powerpc_pmc_intr()
514 "pmc_intr: couldn't find interrupting PMC on cpu %d - " in powerpc_pmc_intr()
515 "disabling PERF interrupts\n", cpu); in powerpc_pmc_intr()
535 pmc_mdep = pmc_mdep_alloc(1); in pmc_md_initialize()
565 error = -1; in pmc_md_initialize()
583 PMCDBG0(MDP, INI, 1, "powerpc-finalize"); in pmc_md_finalize()
587 ("[powerpc,%d] non-null pcpu cpu %d", __LINE__, i)); in pmc_md_finalize()
609 /* Check if 32-bit mode. */ in pmc_save_user_callchain()
610 if (!(tf->srr1 & PSL_SF)) { in pmc_save_user_callchain()
611 cc[frames] = fuword32((uint32_t *)sp + 1); in pmc_save_user_callchain()
618 cc[frames] = fuword32((uint32_t *)sp + 1); in pmc_save_user_callchain()