Support of optional PMC classes.

Reviewed by:		mhorne
Differential Revision:	https://reviews.freebsd.org/D32316
This commit is contained in:
Aleksandr Rybalko
2022-02-16 00:18:04 +00:00
committed by Toomas Soome
parent b6e28991bf
commit fdfeaa66b5
2 changed files with 36 additions and 5 deletions
+18 -3
View File
@@ -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);
}
+18 -2
View File
@@ -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);
}