Lines Matching +full:4 +full:- +full:cpu

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
4 * Copyright (c) 2003-2008 Joseph Koshy
33 /* Arm CoreLink CMN-600 Coherent Mesh Network PMU Driver */
87 KASSERT(xpcntr < 4, ("[cmn600,%d] XP counter number %d is too big." in cmn600_pmu_readcntr()
94 if (width == 4) { in cmn600_pmu_readcntr()
112 KASSERT(xpcntr < 4, ("[cmn600,%d] XP counter number %d is too big." in cmn600_pmu_writecntr()
117 if (width == 4) { in cmn600_pmu_writecntr()
141 cmn600_read_pmc(int cpu, int ri, struct pmc *pm, pmc_value_t *v) in cmn600_read_pmc() argument
147 KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), in cmn600_read_pmc()
148 ("[cmn600,%d] illegal CPU value %d", __LINE__, cpu)); in cmn600_read_pmc()
149 KASSERT(ri >= 0, ("[cmn600,%d] row-index %d out of range", __LINE__, in cmn600_read_pmc()
154 arg = desc->pd_rw_arg; in cmn600_read_pmc()
155 nodeid = pm->pm_md.pm_cmn600.pm_cmn600_nodeid; in cmn600_read_pmc()
156 local_counter = pm->pm_md.pm_cmn600.pm_cmn600_local_counter; in cmn600_read_pmc()
158 *v = cmn600_pmu_readcntr(arg, nodeid, local_counter, counter, 4); in cmn600_read_pmc()
159 PMCDBG3(MDP, REA, 2, "%s id=%d -> %jd", __func__, ri, *v); in cmn600_read_pmc()
168 cmn600_write_pmc(int cpu, int ri, struct pmc *pm, pmc_value_t v) in cmn600_write_pmc() argument
174 KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), in cmn600_write_pmc()
175 ("[cmn600,%d] illegal CPU value %d", __LINE__, cpu)); in cmn600_write_pmc()
176 KASSERT(ri >= 0, ("[cmn600,%d] row-index %d out of range", __LINE__, in cmn600_write_pmc()
181 arg = desc->pd_rw_arg; in cmn600_write_pmc()
182 nodeid = pm->pm_md.pm_cmn600.pm_cmn600_nodeid; in cmn600_write_pmc()
183 local_counter = pm->pm_md.pm_cmn600.pm_cmn600_local_counter; in cmn600_write_pmc()
186 ("[cmn600,%d] PMC not owned (cpu%d,pmc%d)", __LINE__, in cmn600_write_pmc()
187 cpu, ri)); in cmn600_write_pmc()
189 PMCDBG4(MDP, WRI, 1, "%s cpu=%d ri=%d v=%jx", __func__, cpu, ri, v); in cmn600_write_pmc()
191 cmn600_pmu_writecntr(arg, nodeid, local_counter, counter, 4, v); in cmn600_write_pmc()
200 cmn600_config_pmc(int cpu, int ri, struct pmc *pm) in cmn600_config_pmc() argument
204 PMCDBG4(MDP, CFG, 1, "%s cpu=%d ri=%d pm=%p", __func__, cpu, ri, pm); in cmn600_config_pmc()
206 KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), in cmn600_config_pmc()
207 ("[cmn600,%d] illegal CPU value %d", __LINE__, cpu)); in cmn600_config_pmc()
208 KASSERT(ri >= 0, ("[cmn600,%d] row-index %d out of range", __LINE__, in cmn600_config_pmc()
211 phw = cmn600desc(ri)->pd_phw; in cmn600_config_pmc()
213 KASSERT(pm == NULL || phw->phw_pmc == NULL, in cmn600_config_pmc()
214 ("[cmn600,%d] pm=%p phw->pm=%p hwpmc not unconfigured", in cmn600_config_pmc()
215 __LINE__, pm, phw->phw_pmc)); in cmn600_config_pmc()
217 phw->phw_pmc = pm; in cmn600_config_pmc()
225 cmn600_get_config(int cpu, int ri, struct pmc **ppm) in cmn600_get_config() argument
228 *ppm = cmn600desc(ri)->pd_phw->phw_pmc; in cmn600_get_config()
248 CASE_DN_VER_EVT(dn_rxreq_retried, 4); in cmn600_map_ev2event()
270 *event = ev - PMC_EV_CMN600_PMU_hnf_cache_miss; in cmn600_map_ev2event()
274 *event = ev - PMC_EV_CMN600_PMU_hni_rrt_rd_occ_cnt_ovfl; in cmn600_map_ev2event()
278 *event = ev - PMC_EV_CMN600_PMU_xp_txflit_valid; in cmn600_map_ev2event()
282 *event = ev - PMC_EV_CMN600_PMU_sbsx_rd_req; in cmn600_map_ev2event()
286 *event = ev - PMC_EV_CMN600_PMU_rnd_s0_rdata_beats; in cmn600_map_ev2event()
290 *event = ev - PMC_EV_CMN600_PMU_rni_s0_rdata_beats; in cmn600_map_ev2event()
294 *event = ev - PMC_EV_CMN600_PMU_cxha_rddatbyp; in cmn600_map_ev2event()
298 *event = ev - PMC_EV_CMN600_PMU_cxra_req_trk_occ; in cmn600_map_ev2event()
302 *event = ev - PMC_EV_CMN600_PMU_cxla_rx_tlp_link0; in cmn600_map_ev2event()
313 cmn600_allocate_pmc(int cpu, int ri, struct pmc *pm, in cmn600_allocate_pmc() argument
325 (void) cpu; in cmn600_allocate_pmc()
327 KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), in cmn600_allocate_pmc()
328 ("[cmn600,%d] illegal CPU value %d", __LINE__, cpu)); in cmn600_allocate_pmc()
329 KASSERT(ri >= 0, ("[cmn600,%d] row-index %d out of range", __LINE__, in cmn600_allocate_pmc()
333 arg = desc->pd_rw_arg; in cmn600_allocate_pmc()
334 pd = &desc->pd_descr; in cmn600_allocate_pmc()
335 if (cmn600_pmcs[class_ri2unit(ri)].domain != pcpu_find(cpu)->pc_domain) in cmn600_allocate_pmc()
339 if (pd->pd_class != a->pm_class) in cmn600_allocate_pmc()
342 caps = pm->pm_caps; in cmn600_allocate_pmc()
346 pe = a->pm_ev; in cmn600_allocate_pmc()
351 a->pm_md.pm_cmn600.pma_cmn600_nodeid, node_type, &local_counter); in cmn600_allocate_pmc()
355 pm->pm_md.pm_cmn600.pm_cmn600_config = in cmn600_allocate_pmc()
356 a->pm_md.pm_cmn600.pma_cmn600_config; in cmn600_allocate_pmc()
357 pm->pm_md.pm_cmn600.pm_cmn600_occupancy = in cmn600_allocate_pmc()
358 a->pm_md.pm_cmn600.pma_cmn600_occupancy; in cmn600_allocate_pmc()
359 desc->pd_nodeid = pm->pm_md.pm_cmn600.pm_cmn600_nodeid = in cmn600_allocate_pmc()
360 a->pm_md.pm_cmn600.pma_cmn600_nodeid; in cmn600_allocate_pmc()
361 desc->pd_node_type = pm->pm_md.pm_cmn600.pm_cmn600_node_type = in cmn600_allocate_pmc()
363 pm->pm_md.pm_cmn600.pm_cmn600_event = e; in cmn600_allocate_pmc()
364 desc->pd_local_counter = pm->pm_md.pm_cmn600.pm_cmn600_local_counter = in cmn600_allocate_pmc()
373 cmn600_release_pmc(int cpu, int ri, struct pmc *pmc) in cmn600_release_pmc() argument
382 KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), in cmn600_release_pmc()
383 ("[cmn600,%d] illegal CPU value %d", __LINE__, cpu)); in cmn600_release_pmc()
384 KASSERT(ri >= 0, ("[cmn600,%d] row-index %d out of range", __LINE__, in cmn600_release_pmc()
388 phw = desc->pd_phw; in cmn600_release_pmc()
389 pm = phw->phw_pmc; in cmn600_release_pmc()
390 err = pmu_cmn600_free_localpmc(desc->pd_rw_arg, desc->pd_nodeid, in cmn600_release_pmc()
391 desc->pd_node_type, desc->pd_local_counter); in cmn600_release_pmc()
395 KASSERT(pm == NULL, ("[cmn600,%d] PHW pmc %p non-NULL", __LINE__, pm)); in cmn600_release_pmc()
404 /* Calculate pmevcnt0_input_sel based on list in Table 3-794. */ in cmn600_encode_source()
408 return (((port + 1) << 4) | (sub << 2) | counter); in cmn600_encode_source()
416 cmn600_start_pmc(int cpu, int ri, struct pmc *pm) in cmn600_start_pmc() argument
425 KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), in cmn600_start_pmc()
426 ("[cmn600,%d] illegal CPU value %d", __LINE__, cpu)); in cmn600_start_pmc()
427 KASSERT(ri >= 0, ("[cmn600,%d] row-index %d out of range", __LINE__, in cmn600_start_pmc()
432 arg = desc->pd_rw_arg; in cmn600_start_pmc()
434 PMCDBG3(MDP, STA, 1, "%s cpu=%d ri=%d", __func__, cpu, ri); in cmn600_start_pmc()
436 config = pm->pm_md.pm_cmn600.pm_cmn600_config; in cmn600_start_pmc()
437 occupancy = pm->pm_md.pm_cmn600.pm_cmn600_occupancy; in cmn600_start_pmc()
438 node_type = pm->pm_md.pm_cmn600.pm_cmn600_node_type; in cmn600_start_pmc()
439 event = pm->pm_md.pm_cmn600.pm_cmn600_event; in cmn600_start_pmc()
440 nodeid = pm->pm_md.pm_cmn600.pm_cmn600_nodeid; in cmn600_start_pmc()
441 local_counter = pm->pm_md.pm_cmn600.pm_cmn600_local_counter; in cmn600_start_pmc()
480 /* 4. Pair with global counters A, B, C, ..., H. */ in cmn600_start_pmc()
481 shift = (local_counter * 4) + 16; in cmn600_start_pmc()
485 xp_pmucfg |= 1 << (local_counter + 4); in cmn600_start_pmc()
525 cmn600_stop_pmc(int cpu, int ri, struct pmc *pm) in cmn600_stop_pmc() argument
531 KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), in cmn600_stop_pmc()
532 ("[cmn600,%d] illegal CPU value %d", __LINE__, cpu)); in cmn600_stop_pmc()
533 KASSERT(ri >= 0, ("[cmn600,%d] row-index %d out of range", __LINE__, in cmn600_stop_pmc()
541 local_counter = pm->pm_md.pm_cmn600.pm_cmn600_local_counter; in cmn600_stop_pmc()
542 pmu_cmn600_clr8(desc->pd_rw_arg, pm->pm_md.pm_cmn600.pm_cmn600_nodeid, in cmn600_stop_pmc()
543 NODE_TYPE_XP, POR_DTM_PMU_CONFIG, (1 << (local_counter + 4))); in cmn600_stop_pmc()
546 val = pmu_cmn600_rd8(desc->pd_rw_arg, in cmn600_stop_pmc()
547 pm->pm_md.pm_cmn600.pm_cmn600_nodeid, NODE_TYPE_XP, in cmn600_stop_pmc()
550 pmu_cmn600_clr8(desc->pd_rw_arg, in cmn600_stop_pmc()
551 pm->pm_md.pm_cmn600.pm_cmn600_nodeid, NODE_TYPE_XP, in cmn600_stop_pmc()
561 cmn600_describe(int cpu, int ri, struct pmc_info *pi, struct pmc **ppmc) in cmn600_describe() argument
566 KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), in cmn600_describe()
567 ("[cmn600,%d] illegal CPU %d", __LINE__, cpu)); in cmn600_describe()
568 KASSERT(ri >= 0, ("[cmn600,%d] row-index %d out of range", __LINE__, in cmn600_describe()
571 phw = cmn600desc(ri)->pd_phw; in cmn600_describe()
572 pd = &cmn600desc(ri)->pd_descr; in cmn600_describe()
574 strlcpy(pi->pm_name, pd->pd_name, sizeof(pi->pm_name)); in cmn600_describe()
575 pi->pm_class = pd->pd_class; in cmn600_describe()
577 if (phw->phw_state & PMC_PHW_FLAG_IS_ENABLED) { in cmn600_describe()
578 pi->pm_enabled = TRUE; in cmn600_describe()
579 *ppmc = phw->phw_pmc; in cmn600_describe()
581 pi->pm_enabled = FALSE; in cmn600_describe()
593 cmn600_pcpu_init(struct pmc_mdep *md, int cpu) in cmn600_pcpu_init() argument
601 KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), in cmn600_pcpu_init()
602 ("[cmn600,%d] insane cpu number %d", __LINE__, cpu)); in cmn600_pcpu_init()
604 PMCDBG1(MDP, INI, 1, "cmn600-init cpu=%d", cpu); in cmn600_pcpu_init()
608 * state and initialize pointers in the MI per-cpu descriptor. in cmn600_pcpu_init()
611 pc = pmc_pcpu[cpu]; in cmn600_pcpu_init()
612 first_ri = md->pmd_classdep[mdep_class].pcd_ri; in cmn600_pcpu_init()
613 npmc = md->pmd_classdep[mdep_class].pcd_num; in cmn600_pcpu_init()
616 phw = cmn600desc(n)->pd_phw; in cmn600_pcpu_init()
617 phw->phw_state = PMC_PHW_CPU_TO_STATE(cpu) | in cmn600_pcpu_init()
621 phw->phw_state |= PMC_PHW_FLAG_IS_ENABLED; in cmn600_pcpu_init()
622 phw->phw_pmc = NULL; in cmn600_pcpu_init()
623 pc->pc_hwpmcs[n + first_ri] = phw; in cmn600_pcpu_init()
634 cmn600_pcpu_fini(struct pmc_mdep *md, int cpu) in cmn600_pcpu_fini() argument
646 int error, cpu, ri; in cmn600_pmu_intr() local
649 cpu = curcpu; in cmn600_pmu_intr()
650 KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), in cmn600_pmu_intr()
651 ("[cmn600,%d] CPU %d out of range", __LINE__, cpu)); in cmn600_pmu_intr()
652 pc = pmc_pcpu[cpu]; in cmn600_pmu_intr()
655 phw = cmn600desc(ri)->pd_phw; in cmn600_pmu_intr()
657 pm = phw->phw_pmc; in cmn600_pmu_intr()
663 pm->pm_pcpu_state[0].pps_overflowcnt += 1; in cmn600_pmu_intr()
667 if (pm->pm_state != PMC_STATE_RUNNING) in cmn600_pmu_intr()
672 cmn600_stop_pmc(cpu, ri, pm); in cmn600_pmu_intr()
675 cmn600_write_pmc(cpu, ri, pm, pm->pm_sc.pm_reloadcount); in cmn600_pmu_intr()
724 PMCDBG0(MDP,INI,1, "cmn600-initialize"); in pmc_cmn600_initialize()
727 pcd = &md->pmd_classdep[PMC_MDEP_CLASS_INDEX_CMN600]; in pmc_cmn600_initialize()
729 pcd->pcd_caps = PMC_CAP_SYSTEM | PMC_CAP_READ | in pmc_cmn600_initialize()
732 pcd->pcd_class = PMC_CLASS_CMN600_PMU; in pmc_cmn600_initialize()
733 pcd->pcd_num = npmc; in pmc_cmn600_initialize()
734 pcd->pcd_ri = md->pmd_npmc; in pmc_cmn600_initialize()
735 pcd->pcd_width = 48; in pmc_cmn600_initialize()
737 pcd->pcd_allocate_pmc = cmn600_allocate_pmc; in pmc_cmn600_initialize()
738 pcd->pcd_config_pmc = cmn600_config_pmc; in pmc_cmn600_initialize()
739 pcd->pcd_describe = cmn600_describe; in pmc_cmn600_initialize()
740 pcd->pcd_get_config = cmn600_get_config; in pmc_cmn600_initialize()
741 pcd->pcd_get_msr = NULL; in pmc_cmn600_initialize()
742 pcd->pcd_pcpu_fini = cmn600_pcpu_fini; in pmc_cmn600_initialize()
743 pcd->pcd_pcpu_init = cmn600_pcpu_init; in pmc_cmn600_initialize()
744 pcd->pcd_read_pmc = cmn600_read_pmc; in pmc_cmn600_initialize()
745 pcd->pcd_release_pmc = cmn600_release_pmc; in pmc_cmn600_initialize()
746 pcd->pcd_start_pmc = cmn600_start_pmc; in pmc_cmn600_initialize()
747 pcd->pcd_stop_pmc = cmn600_stop_pmc; in pmc_cmn600_initialize()
748 pcd->pcd_write_pmc = cmn600_write_pmc; in pmc_cmn600_initialize()
750 md->pmd_npmc += npmc; in pmc_cmn600_initialize()
761 cmn600_pmcdesc[i]->pd_rw_arg = cmn600_pmcs[unit].arg; in pmc_cmn600_initialize()
762 cmn600_pmcdesc[i]->pd_descr.pd_class = in pmc_cmn600_initialize()
764 cmn600_pmcdesc[i]->pd_descr.pd_caps = pcd->pcd_caps; in pmc_cmn600_initialize()
765 cmn600_pmcdesc[i]->pd_phw = (struct pmc_hw *)malloc( in pmc_cmn600_initialize()
767 snprintf(cmn600_pmcdesc[i]->pd_descr.pd_name, 63, in pmc_cmn600_initialize()
781 KASSERT(md->pmd_classdep[PMC_MDEP_CLASS_INDEX_CMN600].pcd_class == in pmc_cmn600_finalize()
785 pcd = &md->pmd_classdep[PMC_MDEP_CLASS_INDEX_CMN600]; in pmc_cmn600_finalize()
787 npmc = pcd->pcd_num; in pmc_cmn600_finalize()
789 free(cmn600_pmcdesc[i]->pd_phw, M_PMC); in pmc_cmn600_finalize()