Lines Matching +full:class +full:- +full:d

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
4 * Copyright (c) 2003-2008 Joseph Koshy
33 /* Support for ARM DMC-620 Memory Controller PMU */
47 #define CLASS2TYPE(c) ((c) - PMC_CLASS_DMC620_PMU_CD2)
49 /* Create wrapper for each class. */
51 static int fn(int class, t1 a1, t2 a2); \
60 static int fn(int class, t1 a1, t2 a2)
63 static int fn(int class, t1 a1, t2 a2, t3 a3); \
72 static int fn(int class, t1 a1, t2 a2, t3 a3)
75 static int fn(int class, t1 a1, t2 a2, t3 a3, t4 a4); \
84 static int fn(int class, t1 a1, t2 a2, t3 a3, t4 a4)
92 struct pmc_descr pd_descr; /* "base class" */
127 dmc620_npmcs--; in dmc620_pmc_unregister()
140 dmc620desc(int class, int cpu, int ri) in dmc620desc() argument
144 c = CLASS2TYPE(class); in dmc620desc()
145 KASSERT((c & 0xfffffffe) == 0, ("[dmc620,%d] 'c' can only be 0 or 1. " in dmc620desc()
146 "now %d", __LINE__, c)); in dmc620desc()
152 cntr(int class, int ri) in cntr() argument
156 c = CLASS2TYPE(class); in cntr()
157 KASSERT((c & 0xfffffffe) == 0, ("[dmc620,%d] 'c' can only be 0 or 1. " in cntr()
158 "now %d", __LINE__, c)); in cntr()
166 class2mdep(int class) in class2mdep() argument
169 switch (class) { in class2mdep()
175 return (-1); in class2mdep()
179 class_ri2unit(int class, int ri) in class_ri2unit() argument
182 if (class == PMC_CLASS_DMC620_PMU_CD2) in class_ri2unit()
198 ("[dmc620,%d] illegal CPU value %d", __LINE__, cpu)); in CLASSDEP_FN4()
199 KASSERT(ri >= 0, ("[dmc620,%d] row-index %d out of range", __LINE__, in CLASSDEP_FN4()
202 desc = dmc620desc(class, cpu, ri); in CLASSDEP_FN4()
204 PMCDBG3(MDP,REA,1,"%s id=%d class=%d", __func__, ri, class); in CLASSDEP_FN4()
211 *v = ((uint64_t)pm->pm_pcpu_state[0].pps_overflowcnt << 32) | in CLASSDEP_FN4()
212 pmu_dmc620_rd4(desc->pd_rw_arg, cntr(class, ri), in CLASSDEP_FN4()
215 PMCDBG3(MDP, REA, 2, "%s id=%d -> %jd", __func__, ri, *v); in CLASSDEP_FN4()
230 ("[dmc620,%d] illegal CPU value %d", __LINE__, cpu)); in CLASSDEP_FN4()
231 KASSERT(ri >= 0, ("[dmc620,%d] row-index %d out of range", __LINE__, in CLASSDEP_FN4()
234 desc = dmc620desc(class, cpu, ri); in CLASSDEP_FN4()
236 PMCDBG4(MDP, WRI, 1, "%s cpu=%d ri=%d v=%jx", __func__, cpu, ri, v); in CLASSDEP_FN4()
238 pmu_dmc620_wr4(desc->pd_rw_arg, cntr(class, ri), in CLASSDEP_FN4()
252 PMCDBG4(MDP, CFG, 1, "%s cpu=%d ri=%d pm=%p", __func__, cpu, ri, pm); in CLASSDEP_FN3()
255 ("[dmc620,%d] illegal CPU value %d", __LINE__, cpu)); in CLASSDEP_FN3()
256 KASSERT(ri >= 0, ("[dmc620,%d] row-index %d out of range", __LINE__, in CLASSDEP_FN3()
259 phw = dmc620desc(class, cpu, ri)->pd_phw; in CLASSDEP_FN3()
261 KASSERT(pm == NULL || phw->phw_pmc == NULL, in CLASSDEP_FN3()
262 ("[dmc620,%d] pm=%p phw->pm=%p hwpmc not unconfigured", in CLASSDEP_FN3()
263 __LINE__, pm, phw->phw_pmc)); in CLASSDEP_FN3()
265 phw->phw_pmc = pm; in CLASSDEP_FN3()
276 *ppm = dmc620desc(class, cpu, ri)->pd_phw->phw_pmc; in CLASSDEP_FN3()
296 ("[dmc620,%d] illegal CPU value %d", __LINE__, cpu)); in CLASSDEP_FN4()
297 KASSERT(ri >= 0, ("[dmc620,%d] row-index %d out of range", __LINE__, in CLASSDEP_FN4()
300 pd = &dmc620desc(class, cpu, ri)->pd_descr; in CLASSDEP_FN4()
301 if (dmc620_pmcs[class_ri2unit(class, ri)].domain != in CLASSDEP_FN4()
302 pcpu_find(cpu)->pc_domain) in CLASSDEP_FN4()
305 /* check class match */ in CLASSDEP_FN4()
306 if (pd->pd_class != a->pm_class) in CLASSDEP_FN4()
309 caps = pm->pm_caps; in CLASSDEP_FN4()
311 PMCDBG3(MDP, ALL, 1, "%s ri=%d caps=0x%x", __func__, ri, caps); in CLASSDEP_FN4()
313 pe = a->pm_ev; in CLASSDEP_FN4()
314 if (class == PMC_CLASS_DMC620_PMU_CD2) in CLASSDEP_FN4()
315 e = pe - PMC_EV_DMC620_PMU_CD2_FIRST; in CLASSDEP_FN4()
317 e = pe - PMC_EV_DMC620_PMU_C_FIRST; in CLASSDEP_FN4()
325 pm->pm_md.pm_dmc620.pm_control = control; in CLASSDEP_FN4()
326 pm->pm_md.pm_dmc620.pm_match = a->pm_md.pm_dmc620.pm_dmc620_match; in CLASSDEP_FN4()
327 pm->pm_md.pm_dmc620.pm_mask = a->pm_md.pm_dmc620.pm_dmc620_mask; in CLASSDEP_FN4()
329 PMCDBG3(MDP, ALL, 2, "%s ri=%d -> control=0x%x", __func__, ri, control); in CLASSDEP_FN4()
336 * no-op on this architecture.
348 ("[dmc620,%d] illegal CPU value %d", __LINE__, cpu)); in CLASSDEP_FN3()
349 KASSERT(ri >= 0, ("[dmc620,%d] row-index %d out of range", __LINE__, in CLASSDEP_FN3()
352 phw = dmc620desc(class, cpu, ri)->pd_phw; in CLASSDEP_FN3()
354 KASSERT(phw->phw_pmc == NULL, in CLASSDEP_FN3()
355 ("[dmc620,%d] PHW pmc %p non-NULL", __LINE__, phw->phw_pmc)); in CLASSDEP_FN3()
370 ("[dmc620,%d] illegal CPU value %d", __LINE__, cpu)); in CLASSDEP_FN3()
371 KASSERT(ri >= 0, ("[dmc620,%d] row-index %d out of range", __LINE__, in CLASSDEP_FN3()
374 desc = dmc620desc(class, cpu, ri); in CLASSDEP_FN3()
376 PMCDBG3(MDP, STA, 1, "%s cpu=%d ri=%d", __func__, cpu, ri); in CLASSDEP_FN3()
378 pmu_dmc620_wr4(desc->pd_rw_arg, cntr(class, ri), in CLASSDEP_FN3()
379 DMC620_COUNTER_MASK_LO, pm->pm_md.pm_dmc620.pm_mask & 0xffffffff); in CLASSDEP_FN3()
380 pmu_dmc620_wr4(desc->pd_rw_arg, cntr(class, ri), in CLASSDEP_FN3()
381 DMC620_COUNTER_MASK_HI, pm->pm_md.pm_dmc620.pm_mask >> 32); in CLASSDEP_FN3()
382 pmu_dmc620_wr4(desc->pd_rw_arg, cntr(class, ri), in CLASSDEP_FN3()
383 DMC620_COUNTER_MATCH_LO, pm->pm_md.pm_dmc620.pm_match & 0xffffffff); in CLASSDEP_FN3()
384 pmu_dmc620_wr4(desc->pd_rw_arg, cntr(class, ri), in CLASSDEP_FN3()
385 DMC620_COUNTER_MATCH_HI, pm->pm_md.pm_dmc620.pm_match >> 32); in CLASSDEP_FN3()
387 control = pm->pm_md.pm_dmc620.pm_control | DMC620_COUNTER_CONTROL_ENABLE; in CLASSDEP_FN3()
391 pmu_dmc620_wr4(desc->pd_rw_arg, cntr(class, ri), in CLASSDEP_FN3()
406 ("[dmc620,%d] illegal CPU value %d", __LINE__, cpu)); in CLASSDEP_FN3()
407 KASSERT(ri >= 0, ("[dmc620,%d] row-index %d out of range", __LINE__, in CLASSDEP_FN3()
410 desc = dmc620desc(class, cpu, ri); in CLASSDEP_FN3()
412 PMCDBG2(MDP, STO, 1, "%s ri=%d", __func__, ri); in CLASSDEP_FN3()
415 control = pm->pm_md.pm_dmc620.pm_control & ~DMC620_COUNTER_CONTROL_ENABLE; in CLASSDEP_FN3()
416 pmu_dmc620_wr4(desc->pd_rw_arg, cntr(class, ri), in CLASSDEP_FN3()
432 ("[dmc620,%d] illegal CPU %d", __LINE__, cpu)); in CLASSDEP_FN4()
433 KASSERT(ri >= 0, ("[dmc620,%d] row-index %d out of range", __LINE__, in CLASSDEP_FN4()
436 phw = dmc620desc(class, cpu, ri)->pd_phw; in CLASSDEP_FN4()
437 pd = &dmc620desc(class, cpu, ri)->pd_descr; in CLASSDEP_FN4()
439 strlcpy(pi->pm_name, pd->pd_name, sizeof(pi->pm_name)); in CLASSDEP_FN4()
440 pi->pm_class = pd->pd_class; in CLASSDEP_FN4()
442 if (phw->phw_state & PMC_PHW_FLAG_IS_ENABLED) { in CLASSDEP_FN4()
443 pi->pm_enabled = TRUE; in CLASSDEP_FN4()
444 *ppmc = phw->phw_pmc; in CLASSDEP_FN4()
446 pi->pm_enabled = FALSE; in CLASSDEP_FN4()
464 mdep_class = class2mdep(class); in CLASSDEP_FN2()
465 KASSERT(mdep_class != -1, ("[dmc620,%d] wrong class %d", __LINE__, in CLASSDEP_FN2()
466 class)); in CLASSDEP_FN2()
468 ("[dmc620,%d] insane cpu number %d", __LINE__, cpu)); in CLASSDEP_FN2()
470 PMCDBG1(MDP, INI, 1, "dmc620-init cpu=%d", cpu); in CLASSDEP_FN2()
474 * state and initialize pointers in the MI per-cpu descriptor. in CLASSDEP_FN2()
478 first_ri = md->pmd_classdep[mdep_class].pcd_ri; in CLASSDEP_FN2()
479 npmc = md->pmd_classdep[mdep_class].pcd_num; in CLASSDEP_FN2()
482 phw = dmc620desc(class, cpu, n)->pd_phw; in CLASSDEP_FN2()
483 phw->phw_state = PMC_PHW_CPU_TO_STATE(cpu) | in CLASSDEP_FN2()
486 if (dmc620_pmcs[class_ri2unit(class, n)].arg != NULL) in CLASSDEP_FN2()
487 phw->phw_state |= PMC_PHW_FLAG_IS_ENABLED; in CLASSDEP_FN2()
488 phw->phw_pmc = NULL; in CLASSDEP_FN2()
489 pc->pc_hwpmcs[n + first_ri] = phw; in CLASSDEP_FN2()
506 dmc620_intr(struct trapframe *tf, int class, int unit, int i) in dmc620_intr() argument
513 ri = i + unit * ((class == PMC_CLASS_DMC620_PMU_CD2) ? in dmc620_intr()
517 ("[dmc620,%d] CPU %d out of range", __LINE__, cpu)); in dmc620_intr()
521 phw = dmc620desc(class, cpu, ri)->pd_phw; in dmc620_intr()
523 pm = phw->phw_pmc; in dmc620_intr()
529 pm->pm_pcpu_state[0].pps_overflowcnt += 1; in dmc620_intr()
533 if (pm->pm_state != PMC_STATE_RUNNING) in dmc620_intr()
538 dmc620_stop_pmc(class, cpu, ri, pm); in dmc620_intr()
541 dmc620_write_pmc(class, cpu, ri, pm, pm->pm_sc.pm_reloadcount); in dmc620_intr()
556 KASSERT(md != NULL, ("[dmc620,%d] md is NULL", __LINE__)); in pmc_dmc620_initialize_cd2()
558 ("[dmc620,%d] dmc620_npmcs too big", __LINE__)); in pmc_dmc620_initialize_cd2()
560 PMCDBG0(MDP,INI,1, "dmc620-initialize"); in pmc_dmc620_initialize_cd2()
563 pcd = &md->pmd_classdep[PMC_MDEP_CLASS_INDEX_DMC620_CD2]; in pmc_dmc620_initialize_cd2()
565 pcd->pcd_caps = PMC_CAP_SYSTEM | PMC_CAP_READ | in pmc_dmc620_initialize_cd2()
568 pcd->pcd_class = PMC_CLASS_DMC620_PMU_CD2; in pmc_dmc620_initialize_cd2()
569 pcd->pcd_num = npmc; in pmc_dmc620_initialize_cd2()
570 pcd->pcd_ri = md->pmd_npmc; in pmc_dmc620_initialize_cd2()
571 pcd->pcd_width = 32; in pmc_dmc620_initialize_cd2()
573 pcd->pcd_allocate_pmc = dmc620_allocate_pmc_cd2; in pmc_dmc620_initialize_cd2()
574 pcd->pcd_config_pmc = dmc620_config_pmc_cd2; in pmc_dmc620_initialize_cd2()
575 pcd->pcd_describe = dmc620_describe_cd2; in pmc_dmc620_initialize_cd2()
576 pcd->pcd_get_config = dmc620_get_config_cd2; in pmc_dmc620_initialize_cd2()
577 pcd->pcd_get_msr = NULL; in pmc_dmc620_initialize_cd2()
578 pcd->pcd_pcpu_fini = dmc620_pcpu_fini_cd2; in pmc_dmc620_initialize_cd2()
579 pcd->pcd_pcpu_init = dmc620_pcpu_init_cd2; in pmc_dmc620_initialize_cd2()
580 pcd->pcd_read_pmc = dmc620_read_pmc_cd2; in pmc_dmc620_initialize_cd2()
581 pcd->pcd_release_pmc = dmc620_release_pmc_cd2; in pmc_dmc620_initialize_cd2()
582 pcd->pcd_start_pmc = dmc620_start_pmc_cd2; in pmc_dmc620_initialize_cd2()
583 pcd->pcd_stop_pmc = dmc620_stop_pmc_cd2; in pmc_dmc620_initialize_cd2()
584 pcd->pcd_write_pmc = dmc620_write_pmc_cd2; in pmc_dmc620_initialize_cd2()
586 md->pmd_npmc += npmc; in pmc_dmc620_initialize_cd2()
597 dmc620_pmcdesc[0][i]->pd_rw_arg = dmc620_pmcs[unit].arg; in pmc_dmc620_initialize_cd2()
598 dmc620_pmcdesc[0][i]->pd_descr.pd_class = in pmc_dmc620_initialize_cd2()
600 dmc620_pmcdesc[0][i]->pd_descr.pd_caps = pcd->pcd_caps; in pmc_dmc620_initialize_cd2()
601 dmc620_pmcdesc[0][i]->pd_phw = malloc(sizeof(struct pmc_hw), in pmc_dmc620_initialize_cd2()
603 snprintf(dmc620_pmcdesc[0][i]->pd_descr.pd_name, 63, in pmc_dmc620_initialize_cd2()
604 "DMC620_CD2_%d", i); in pmc_dmc620_initialize_cd2()
616 KASSERT(md != NULL, ("[dmc620,%d] md is NULL", __LINE__)); in pmc_dmc620_initialize_c()
618 ("[dmc620,%d] dmc620_npmcs too big", __LINE__)); in pmc_dmc620_initialize_c()
620 PMCDBG0(MDP,INI,1, "dmc620-initialize"); in pmc_dmc620_initialize_c()
623 pcd = &md->pmd_classdep[PMC_MDEP_CLASS_INDEX_DMC620_C]; in pmc_dmc620_initialize_c()
625 pcd->pcd_caps = PMC_CAP_SYSTEM | PMC_CAP_READ | in pmc_dmc620_initialize_c()
628 pcd->pcd_class = PMC_CLASS_DMC620_PMU_C; in pmc_dmc620_initialize_c()
629 pcd->pcd_num = npmc; in pmc_dmc620_initialize_c()
630 pcd->pcd_ri = md->pmd_npmc; in pmc_dmc620_initialize_c()
631 pcd->pcd_width = 32; in pmc_dmc620_initialize_c()
633 pcd->pcd_allocate_pmc = dmc620_allocate_pmc_c; in pmc_dmc620_initialize_c()
634 pcd->pcd_config_pmc = dmc620_config_pmc_c; in pmc_dmc620_initialize_c()
635 pcd->pcd_describe = dmc620_describe_c; in pmc_dmc620_initialize_c()
636 pcd->pcd_get_config = dmc620_get_config_c; in pmc_dmc620_initialize_c()
637 pcd->pcd_get_msr = NULL; in pmc_dmc620_initialize_c()
638 pcd->pcd_pcpu_fini = dmc620_pcpu_fini_c; in pmc_dmc620_initialize_c()
639 pcd->pcd_pcpu_init = dmc620_pcpu_init_c; in pmc_dmc620_initialize_c()
640 pcd->pcd_read_pmc = dmc620_read_pmc_c; in pmc_dmc620_initialize_c()
641 pcd->pcd_release_pmc = dmc620_release_pmc_c; in pmc_dmc620_initialize_c()
642 pcd->pcd_start_pmc = dmc620_start_pmc_c; in pmc_dmc620_initialize_c()
643 pcd->pcd_stop_pmc = dmc620_stop_pmc_c; in pmc_dmc620_initialize_c()
644 pcd->pcd_write_pmc = dmc620_write_pmc_c; in pmc_dmc620_initialize_c()
646 md->pmd_npmc += npmc; in pmc_dmc620_initialize_c()
657 dmc620_pmcdesc[1][i]->pd_rw_arg = dmc620_pmcs[unit].arg; in pmc_dmc620_initialize_c()
658 dmc620_pmcdesc[1][i]->pd_descr.pd_class = PMC_CLASS_DMC620_PMU_C; in pmc_dmc620_initialize_c()
659 dmc620_pmcdesc[1][i]->pd_descr.pd_caps = pcd->pcd_caps; in pmc_dmc620_initialize_c()
660 dmc620_pmcdesc[1][i]->pd_phw = malloc(sizeof(struct pmc_hw), in pmc_dmc620_initialize_c()
662 snprintf(dmc620_pmcdesc[1][i]->pd_descr.pd_name, 63, in pmc_dmc620_initialize_c()
663 "DMC620_C_%d", i); in pmc_dmc620_initialize_c()
675 KASSERT(md->pmd_classdep[PMC_MDEP_CLASS_INDEX_DMC620_CD2].pcd_class == in pmc_dmc620_finalize_cd2()
676 PMC_CLASS_DMC620_PMU_CD2, ("[dmc620,%d] pmc class mismatch", in pmc_dmc620_finalize_cd2()
679 pcd = &md->pmd_classdep[PMC_MDEP_CLASS_INDEX_DMC620_CD2]; in pmc_dmc620_finalize_cd2()
681 npmc = pcd->pcd_num; in pmc_dmc620_finalize_cd2()
683 free(dmc620_pmcdesc[0][i]->pd_phw, M_PMC); in pmc_dmc620_finalize_cd2()
696 KASSERT(md->pmd_classdep[PMC_MDEP_CLASS_INDEX_DMC620_C].pcd_class == in pmc_dmc620_finalize_c()
697 PMC_CLASS_DMC620_PMU_C, ("[dmc620,%d] pmc class mismatch", in pmc_dmc620_finalize_c()
700 pcd = &md->pmd_classdep[PMC_MDEP_CLASS_INDEX_DMC620_C]; in pmc_dmc620_finalize_c()
702 npmc = pcd->pcd_num; in pmc_dmc620_finalize_c()
704 free(dmc620_pmcdesc[1][i]->pd_phw, M_PMC); in pmc_dmc620_finalize_c()