Support of optional PMC classes.
Reviewed by: mhorne Differential Revision: https://reviews.freebsd.org/D32316
This commit is contained in:
committed by
Toomas Soome
parent
b6e28991bf
commit
fdfeaa66b5
@@ -531,7 +531,7 @@ pmc_arm64_initialize()
|
||||
{
|
||||
struct pmc_mdep *pmc_mdep;
|
||||
struct pmc_classdep *pcd;
|
||||
int idcode, impcode;
|
||||
int classes, idcode, impcode;
|
||||
int reg;
|
||||
uint64_t midr;
|
||||
|
||||
@@ -561,8 +561,16 @@ pmc_arm64_initialize()
|
||||
arm64_pcpu = malloc(sizeof(struct arm64_cpu *) * pmc_cpu_max(),
|
||||
M_PMC, M_WAITOK | M_ZERO);
|
||||
|
||||
/* Just one class */
|
||||
pmc_mdep = pmc_mdep_alloc(1);
|
||||
/* One AArch64 CPU class */
|
||||
classes = 1;
|
||||
|
||||
/* Query presence of optional classes and set max class. */
|
||||
if (pmc_cmn600_nclasses() > 0)
|
||||
classes = MAX(classes, PMC_MDEP_CLASS_INDEX_CMN600);
|
||||
if (pmc_dmc620_nclasses() > 0)
|
||||
classes = MAX(classes, PMC_MDEP_CLASS_INDEX_DMC620_C);
|
||||
|
||||
pmc_mdep = pmc_mdep_alloc(classes);
|
||||
|
||||
switch(impcode) {
|
||||
case PMCR_IMP_ARM:
|
||||
@@ -611,6 +619,13 @@ pmc_arm64_initialize()
|
||||
|
||||
pmc_mdep->pmd_npmc += arm64_npmcs;
|
||||
|
||||
if (pmc_cmn600_nclasses() > 0)
|
||||
pmc_cmn600_initialize(pmc_mdep);
|
||||
if (pmc_dmc620_nclasses() > 0) {
|
||||
pmc_dmc620_initialize_cd2(pmc_mdep);
|
||||
pmc_dmc620_initialize_c(pmc_mdep);
|
||||
}
|
||||
|
||||
return (pmc_mdep);
|
||||
}
|
||||
|
||||
|
||||
@@ -5600,6 +5600,16 @@ pmc_initialize(void)
|
||||
return (ENOSYS);
|
||||
}
|
||||
|
||||
/*
|
||||
* Refresh classes base ri. Optional classes may come in different
|
||||
* order.
|
||||
*/
|
||||
for (ri = c = 0; c < md->pmd_nclass; c++) {
|
||||
pcd = &md->pmd_classdep[c];
|
||||
pcd->pcd_ri = ri;
|
||||
ri += pcd->pcd_num;
|
||||
}
|
||||
|
||||
KASSERT(md->pmd_nclass >= 1 && md->pmd_npmc >= 1,
|
||||
("[pmc,%d] no classes or pmcs", __LINE__));
|
||||
|
||||
@@ -5642,7 +5652,9 @@ pmc_initialize(void)
|
||||
if (md->pmd_pcpu_init)
|
||||
error = md->pmd_pcpu_init(md, cpu);
|
||||
for (n = 0; error == 0 && n < md->pmd_nclass; n++)
|
||||
error = md->pmd_classdep[n].pcd_pcpu_init(md, cpu);
|
||||
if (md->pmd_classdep[n].pcd_num > 0)
|
||||
error = md->pmd_classdep[n].pcd_pcpu_init(md,
|
||||
cpu);
|
||||
}
|
||||
pmc_restore_cpu_binding(&pb);
|
||||
|
||||
@@ -5755,6 +5767,8 @@ pmc_initialize(void)
|
||||
if (error == 0) {
|
||||
printf(PMC_MODULE_NAME ":");
|
||||
for (n = 0; n < (int) md->pmd_nclass; n++) {
|
||||
if (md->pmd_classdep[n].pcd_num == 0)
|
||||
continue;
|
||||
pcd = &md->pmd_classdep[n];
|
||||
printf(" %s/%d/%d/0x%b",
|
||||
pmc_name_of_pmcclass(pcd->pcd_class),
|
||||
@@ -5877,7 +5891,9 @@ pmc_cleanup(void)
|
||||
continue;
|
||||
pmc_select_cpu(cpu);
|
||||
for (c = 0; c < md->pmd_nclass; c++)
|
||||
md->pmd_classdep[c].pcd_pcpu_fini(md, cpu);
|
||||
if (md->pmd_classdep[c].pcd_num > 0)
|
||||
md->pmd_classdep[c].pcd_pcpu_fini(md,
|
||||
cpu);
|
||||
if (md->pmd_pcpu_fini)
|
||||
md->pmd_pcpu_fini(md, cpu);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user