diff options
author | Remy Noel <mocramis@gmail.com> | 2018-04-30 20:30:08 +0200 |
---|---|---|
committer | Remy Noel <mocramis@gmail.com> | 2018-05-03 13:08:30 +0200 |
commit | c4ba76cc4f84a25b259e9089b5e49a6edc015f1d (patch) | |
tree | 2e8548cd533672cf517b0ae5df76bf2e449f3890 /arch/x86/machine | |
parent | 70794059bfae7a538ee6b1ffe6f1604950ef83f2 (diff) |
perfmon: register a pmu_driver in place of pmu_ops.
Replace pmu_get_width with a property.
Prepare the default overfow handling.
Diffstat (limited to 'arch/x86/machine')
-rw-r--r-- | arch/x86/machine/pmu_amd.c | 29 | ||||
-rw-r--r-- | arch/x86/machine/pmu_intel.c | 46 |
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); |