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

1 /*-
6 * Cambridge Computer Laboratory under DARPA/AFRL contract (FA8750-10-C-0237)
12 * 1. Redistributions of source code must retain the above copyright
37 #include <machine/cpu.h>
49 * Per-processor information.
65 reg = (1 << pmc); in armv7_interrupt_enable()
77 reg = (1 << pmc); in armv7_interrupt_disable()
89 reg = (1 << pmc); in armv7_counter_enable()
101 reg = (1 << pmc); in armv7_counter_disable()
135 armv7_allocate_pmc(int cpu, int ri, struct pmc *pm, in armv7_allocate_pmc() argument
141 KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), in armv7_allocate_pmc()
142 ("[armv7,%d] illegal CPU value %d", __LINE__, cpu)); in armv7_allocate_pmc()
146 if (a->pm_class != PMC_CLASS_ARMV7) in armv7_allocate_pmc()
148 pe = a->pm_ev; in armv7_allocate_pmc()
151 pm->pm_md.pm_armv7.pm_armv7_evsel = config; in armv7_allocate_pmc()
153 PMCDBG2(MDP, ALL, 2, "armv7-allocate ri=%d -> config=0x%x", ri, config); in armv7_allocate_pmc()
160 armv7_read_pmc(int cpu, int ri, struct pmc *pm, pmc_value_t *v) in armv7_read_pmc() argument
166 KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), in armv7_read_pmc()
167 ("[armv7,%d] illegal CPU value %d", __LINE__, cpu)); in armv7_read_pmc()
172 tmp = armv7_pmcn_read(ri, pm->pm_md.pm_armv7.pm_armv7_evsel); in armv7_read_pmc()
175 if (pm->pm_md.pm_armv7.pm_armv7_evsel == PMC_EV_CPU_CYCLES) in armv7_read_pmc()
176 reg = (1u << 31); in armv7_read_pmc()
178 reg = (1u << ri); in armv7_read_pmc()
183 pm->pm_pcpu_state[cpu].pps_overflowcnt++; in armv7_read_pmc()
186 tmp = armv7_pmcn_read(ri, pm->pm_md.pm_armv7.pm_armv7_evsel); in armv7_read_pmc()
188 tmp += 0x100000000llu * pm->pm_pcpu_state[cpu].pps_overflowcnt; in armv7_read_pmc()
191 PMCDBG2(MDP, REA, 2, "armv7-read id=%d -> %jd", ri, tmp); in armv7_read_pmc()
198 if ((tmp & (1ull << 63)) == 0) in armv7_read_pmc()
209 armv7_write_pmc(int cpu, int ri, struct pmc *pm, pmc_value_t v) in armv7_write_pmc() argument
212 KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), in armv7_write_pmc()
213 ("[armv7,%d] illegal CPU value %d", __LINE__, cpu)); in armv7_write_pmc()
215 ("[armv7,%d] illegal row-index %d", __LINE__, ri)); in armv7_write_pmc()
220 PMCDBG3(MDP, WRI, 1, "armv7-write cpu=%d ri=%d v=%jx", cpu, ri, v); in armv7_write_pmc()
222 pm->pm_pcpu_state[cpu].pps_overflowcnt = v >> 32; in armv7_write_pmc()
223 if (pm->pm_md.pm_armv7.pm_armv7_evsel == PMC_EV_CPU_CYCLES) in armv7_write_pmc()
232 armv7_config_pmc(int cpu, int ri, struct pmc *pm) in armv7_config_pmc() argument
236 PMCDBG3(MDP, CFG, 1, "cpu=%d ri=%d pm=%p", cpu, ri, pm); in armv7_config_pmc()
238 KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), in armv7_config_pmc()
239 ("[armv7,%d] illegal CPU value %d", __LINE__, cpu)); in armv7_config_pmc()
241 ("[armv7,%d] illegal row-index %d", __LINE__, ri)); in armv7_config_pmc()
243 phw = &armv7_pcpu[cpu]->pc_armv7pmcs[ri]; in armv7_config_pmc()
245 KASSERT(pm == NULL || phw->phw_pmc == NULL, in armv7_config_pmc()
246 ("[armv7,%d] pm=%p phw->pm=%p hwpmc not unconfigured", in armv7_config_pmc()
247 __LINE__, pm, phw->phw_pmc)); in armv7_config_pmc()
249 phw->phw_pmc = pm; in armv7_config_pmc()
255 armv7_start_pmc(int cpu, int ri, struct pmc *pm) in armv7_start_pmc() argument
259 config = pm->pm_md.pm_armv7.pm_armv7_evsel; in armv7_start_pmc()
280 armv7_stop_pmc(int cpu, int ri, struct pmc *pm) in armv7_stop_pmc() argument
284 config = pm->pm_md.pm_armv7.pm_armv7_evsel; in armv7_stop_pmc()
298 armv7_release_pmc(int cpu, int ri, struct pmc *pmc) in armv7_release_pmc() argument
302 KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), in armv7_release_pmc()
303 ("[armv7,%d] illegal CPU value %d", __LINE__, cpu)); in armv7_release_pmc()
305 ("[armv7,%d] illegal row-index %d", __LINE__, ri)); in armv7_release_pmc()
307 phw = &armv7_pcpu[cpu]->pc_armv7pmcs[ri]; in armv7_release_pmc()
308 KASSERT(phw->phw_pmc == NULL, in armv7_release_pmc()
309 ("[armv7,%d] PHW pmc %p non-NULL", __LINE__, phw->phw_pmc)); in armv7_release_pmc()
320 int reg, cpu; in armv7_intr() local
322 cpu = curcpu; in armv7_intr()
323 KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), in armv7_intr()
324 ("[armv7,%d] CPU %d out of range", __LINE__, cpu)); in armv7_intr()
329 pm = armv7_pcpu[cpu]->pc_armv7pmcs[ri].phw_pmc; in armv7_intr()
334 if (pm->pm_md.pm_armv7.pm_armv7_evsel == PMC_EV_CPU_CYCLES) in armv7_intr()
335 reg = (1u << 31); in armv7_intr()
337 reg = (1u << ri); in armv7_intr()
346 retval = 1; /* Found an interrupting PMC. */ in armv7_intr()
348 pm->pm_pcpu_state[cpu].pps_overflowcnt += 1; in armv7_intr()
353 if (pm->pm_state != PMC_STATE_RUNNING) in armv7_intr()
358 armv7_stop_pmc(cpu, ri, pm); in armv7_intr()
361 armv7_write_pmc(cpu, ri, pm, pm->pm_sc.pm_reloadcount); in armv7_intr()
368 armv7_describe(int cpu, int ri, struct pmc_info *pi, struct pmc **ppmc) in armv7_describe() argument
372 KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), in armv7_describe()
373 ("[armv7,%d], illegal CPU %d", __LINE__, cpu)); in armv7_describe()
375 ("[armv7,%d] row-index %d out of range", __LINE__, ri)); in armv7_describe()
377 phw = &armv7_pcpu[cpu]->pc_armv7pmcs[ri]; in armv7_describe()
379 snprintf(pi->pm_name, sizeof(pi->pm_name), "ARMV7-%d", ri); in armv7_describe()
380 pi->pm_class = PMC_CLASS_ARMV7; in armv7_describe()
382 if (phw->phw_state & PMC_PHW_FLAG_IS_ENABLED) { in armv7_describe()
383 pi->pm_enabled = TRUE; in armv7_describe()
384 *ppmc = phw->phw_pmc; in armv7_describe()
386 pi->pm_enabled = FALSE; in armv7_describe()
394 armv7_get_config(int cpu, int ri, struct pmc **ppm) in armv7_get_config() argument
397 *ppm = armv7_pcpu[cpu]->pc_armv7pmcs[ri].phw_pmc; in armv7_get_config()
403 armv7_pcpu_init(struct pmc_mdep *md, int cpu) in armv7_pcpu_init() argument
412 KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), in armv7_pcpu_init()
413 ("[armv7,%d] wrong cpu number %d", __LINE__, cpu)); in armv7_pcpu_init()
414 PMCDBG0(MDP, INI, 1, "armv7-pcpu-init"); in armv7_pcpu_init()
416 armv7_pcpu[cpu] = pac = malloc(sizeof(struct armv7_cpu), M_PMC, in armv7_pcpu_init()
419 pac->pc_armv7pmcs = malloc(sizeof(struct pmc_hw) * armv7_npmcs, in armv7_pcpu_init()
421 pc = pmc_pcpu[cpu]; in armv7_pcpu_init()
422 first_ri = md->pmd_classdep[PMC_MDEP_CLASS_INDEX_ARMV7].pcd_ri; in armv7_pcpu_init()
423 KASSERT(pc != NULL, ("[armv7,%d] NULL per-cpu pointer", __LINE__)); in armv7_pcpu_init()
425 for (i = 0, phw = pac->pc_armv7pmcs; i < armv7_npmcs; i++, phw++) { in armv7_pcpu_init()
426 phw->phw_state = PMC_PHW_FLAG_IS_ENABLED | in armv7_pcpu_init()
427 PMC_PHW_CPU_TO_STATE(cpu) | PMC_PHW_INDEX_TO_STATE(i); in armv7_pcpu_init()
428 phw->phw_pmc = NULL; in armv7_pcpu_init()
429 pc->pc_hwpmcs[i + first_ri] = phw; in armv7_pcpu_init()
446 armv7_pcpu_fini(struct pmc_mdep *md, int cpu) in armv7_pcpu_fini() argument
450 PMCDBG0(MDP, INI, 1, "armv7-pcpu-fini"); in armv7_pcpu_fini()
461 free(armv7_pcpu[cpu]->pc_armv7pmcs, M_PMC); in armv7_pcpu_fini()
462 free(armv7_pcpu[cpu], M_PMC); in armv7_pcpu_fini()
463 armv7_pcpu[cpu] = NULL; in armv7_pcpu_fini()
481 PMCDBG1(MDP, INI, 1, "armv7-init npmcs=%d", armv7_npmcs); in pmc_armv7_initialize()
491 pmc_mdep = pmc_mdep_alloc(1); in pmc_armv7_initialize()
495 pmc_mdep->pmd_cputype = PMC_CPU_ARMV7_CORTEX_A9; in pmc_armv7_initialize()
503 pmc_mdep->pmd_cputype = PMC_CPU_ARMV7_CORTEX_A8; in pmc_armv7_initialize()
507 pcd = &pmc_mdep->pmd_classdep[PMC_MDEP_CLASS_INDEX_ARMV7]; in pmc_armv7_initialize()
508 pcd->pcd_caps = ARMV7_PMC_CAPS; in pmc_armv7_initialize()
509 pcd->pcd_class = PMC_CLASS_ARMV7; in pmc_armv7_initialize()
510 pcd->pcd_num = armv7_npmcs; in pmc_armv7_initialize()
511 pcd->pcd_ri = pmc_mdep->pmd_npmc; in pmc_armv7_initialize()
512 pcd->pcd_width = 32; in pmc_armv7_initialize()
514 pcd->pcd_allocate_pmc = armv7_allocate_pmc; in pmc_armv7_initialize()
515 pcd->pcd_config_pmc = armv7_config_pmc; in pmc_armv7_initialize()
516 pcd->pcd_pcpu_fini = armv7_pcpu_fini; in pmc_armv7_initialize()
517 pcd->pcd_pcpu_init = armv7_pcpu_init; in pmc_armv7_initialize()
518 pcd->pcd_describe = armv7_describe; in pmc_armv7_initialize()
519 pcd->pcd_get_config = armv7_get_config; in pmc_armv7_initialize()
520 pcd->pcd_read_pmc = armv7_read_pmc; in pmc_armv7_initialize()
521 pcd->pcd_release_pmc = armv7_release_pmc; in pmc_armv7_initialize()
522 pcd->pcd_start_pmc = armv7_start_pmc; in pmc_armv7_initialize()
523 pcd->pcd_stop_pmc = armv7_stop_pmc; in pmc_armv7_initialize()
524 pcd->pcd_write_pmc = armv7_write_pmc; in pmc_armv7_initialize()
526 pmc_mdep->pmd_intr = armv7_intr; in pmc_armv7_initialize()
527 pmc_mdep->pmd_npmc += armv7_npmcs; in pmc_armv7_initialize()
535 PMCDBG0(MDP, INI, 1, "armv7-finalize"); in pmc_armv7_finalize()
539 ("[armv7,%d] non-null pcpu cpu %d", __LINE__, i)); in pmc_armv7_finalize()