Page MenuHomeFreeBSD

D32316.id97479.diff
No OneTemporary

D32316.id97479.diff

Index: sys/dev/hwpmc/hwpmc_arm64.c
===================================================================
--- sys/dev/hwpmc/hwpmc_arm64.c
+++ sys/dev/hwpmc/hwpmc_arm64.c
@@ -508,7 +508,7 @@
{
struct pmc_mdep *pmc_mdep;
struct pmc_classdep *pcd;
- int idcode, impcode;
+ int classes, idcode, impcode;
int reg;
uint64_t midr;
@@ -538,8 +538,16 @@
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:
@@ -588,6 +596,13 @@
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);
}
Index: sys/dev/hwpmc/hwpmc_mod.c
===================================================================
--- sys/dev/hwpmc/hwpmc_mod.c
+++ sys/dev/hwpmc/hwpmc_mod.c
@@ -5587,6 +5587,16 @@
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__));
@@ -5629,7 +5639,9 @@
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);
@@ -5742,6 +5754,8 @@
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),
@@ -5864,7 +5878,9 @@
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);
}

File Metadata

Mime Type
text/plain
Expires
Tue, Nov 11, 11:47 PM (22 h, 38 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
25184886
Default Alt Text
D32316.id97479.diff (2 KB)

Event Timeline