summaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
Diffstat (limited to 'arch')
-rw-r--r--arch/x86/machine/pmu_amd.c29
-rw-r--r--arch/x86/machine/pmu_intel.c46
2 files changed, 31 insertions, 44 deletions
diff --git a/arch/x86/machine/pmu_amd.c b/arch/x86/machine/pmu_amd.c
index 105ba50..34df620 100644
--- a/arch/x86/machine/pmu_amd.c
+++ b/arch/x86/machine/pmu_amd.c
@@ -237,18 +237,12 @@ pmu_amd_handle_of_intr_v1(void)
}
}
-static uint8_t
-pmu_amd_get_pmc_width(void)
-{
- return PMU_AMD_PMC_WIDTH;
-}
-
static int __init
pmu_amd_setup(void)
{
const struct cpu *cpu;
struct pmu_amd *pmu;
- struct perfmon_pmu_ops pmu_driver;
+ struct perfmon_pmu_driver pmu_driver;
cpu = cpu_current();
@@ -264,16 +258,17 @@ pmu_amd_setup(void)
pmu = pmu_amd_get();
pmu->pmc_bm = (1U << PMU_AMD_NR_PMCS) - 1;
- pmu_driver.info = pmu_amd_info;
- pmu_driver.translate = pmu_amd_translate;
- pmu_driver.alloc = pmu_amd_alloc;
- pmu_driver.free = pmu_amd_free;
- pmu_driver.start = pmu_amd_start;
- pmu_driver.stop = pmu_amd_stop;
- pmu_driver.read = pmu_amd_read;
- pmu_driver.write = pmu_amd_write;
- pmu_driver.get_pmc_width = pmu_amd_get_pmc_width;
- pmu_driver.handle_of_intr = pmu_amd_handle_of_intr_v1;
+ pmu_driver.pmc_width = PMU_AMD_PMC_WIDTH;
+ pmu_driver.of_max_ticks = 1UL << (pmu_driver.pmc_width - 1);
+
+ pmu_driver.ops.info = pmu_amd_info;
+ pmu_driver.ops.translate = pmu_amd_translate;
+ pmu_driver.ops.alloc = pmu_amd_alloc;
+ pmu_driver.ops.free = pmu_amd_free;
+ pmu_driver.ops.start = pmu_amd_start;
+ pmu_driver.ops.stop = pmu_amd_stop;
+ pmu_driver.ops.read = pmu_amd_read;
+ pmu_driver.ops.write = pmu_amd_write;
return perfmon_pmu_register(&pmu_driver);
}
diff --git a/arch/x86/machine/pmu_intel.c b/arch/x86/machine/pmu_intel.c
index f8168bb..ccc2294 100644
--- a/arch/x86/machine/pmu_intel.c
+++ b/arch/x86/machine/pmu_intel.c
@@ -174,9 +174,10 @@ pmu_intel_info(void)
pmu = pmu_intel_get();
nr_events = pmu_popcount(pmu->events);
- log_info("pmu: driver: intel, architectural v1\n"
+ log_info("pmu: driver: intel, architectural v%d\n"
"pmu: nr_pmcs: %u, pmc_width: %u, events: %#x, nr_events: %u\n",
- pmu->nr_pmcs, pmu->pmc_width, pmu->events, nr_events);
+ pmu->version, pmu->nr_pmcs, pmu->pmc_width, pmu->events,
+ nr_events);
}
static int
@@ -342,22 +343,12 @@ pmu_intel_handle_of_intr_v2(void)
}
}
-static uint8_t
-pmu_intel_get_pmc_width(void)
-{
- struct pmu_intel *pmu;
-
- pmu = pmu_intel_get();
-
- return pmu->pmc_width;
-}
-
static int __init
pmu_intel_setup(void)
{
const struct cpu *cpu;
struct pmu_intel *pmu;
- struct perfmon_pmu_ops pmu_driver;
+ struct perfmon_pmu_driver pmu_driver;
unsigned int eax, ebx, ecx, edx, ev_len;
cpu = cpu_current();
@@ -376,7 +367,7 @@ pmu_intel_setup(void)
pmu->version = eax & PMU_INTEL_ID_VERSION_MASK;
/* TODO Check this */
- if ((pmu->version == 0) || (pmu->version > 3)) {
+ if (pmu->version == 0) {
return ENODEV;
}
@@ -391,20 +382,21 @@ pmu_intel_setup(void)
pmu->events = ~ebx & ((1U << ev_len) - 1);
- pmu_driver.info = pmu_intel_info;
- pmu_driver.translate = pmu_intel_translate;
- pmu_driver.alloc = pmu_intel_alloc;
- pmu_driver.free = pmu_intel_free;
- pmu_driver.start = pmu_intel_start;
- pmu_driver.stop = pmu_intel_stop;
- pmu_driver.read = pmu_intel_read;
- pmu_driver.write = pmu_intel_write;
- pmu_driver.get_pmc_width = pmu_intel_get_pmc_width;
-
- if (pmu->version > 2) {
- pmu_driver.handle_of_intr = pmu_intel_handle_of_intr_v1;
+ pmu_driver.pmc_width = pmu->pmc_width;
+ pmu_driver.ops.info = pmu_intel_info;
+ pmu_driver.ops.translate = pmu_intel_translate;
+ pmu_driver.ops.alloc = pmu_intel_alloc;
+ pmu_driver.ops.free = pmu_intel_free;
+ pmu_driver.ops.start = pmu_intel_start;
+ pmu_driver.ops.stop = pmu_intel_stop;
+ pmu_driver.ops.read = pmu_intel_read;
+ pmu_driver.ops.write = pmu_intel_write;
+
+ if (pmu->version >= 2) {
+ pmu_driver.ops.handle_of_intr = pmu_intel_handle_of_intr_v2;
+ pmu_driver.of_max_ticks = 0;
} else {
- pmu_driver.handle_of_intr = pmu_intel_handle_of_intr_v2;
+ pmu_driver.of_max_ticks = 1UL << (pmu_driver.pmc_width - 1);
}
return perfmon_pmu_register(&pmu_driver);