diff options
Diffstat (limited to 'arch/x86/machine/pmu_amd.c')
-rw-r--r-- | arch/x86/machine/pmu_amd.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/arch/x86/machine/pmu_amd.c b/arch/x86/machine/pmu_amd.c index b8b4c78..49b8d7e 100644 --- a/arch/x86/machine/pmu_amd.c +++ b/arch/x86/machine/pmu_amd.c @@ -109,14 +109,16 @@ static void pmu_amd_info(void) { log_info("pmu: driver: amd, nr_pmcs: %u, pmc_width: %u\n", - PMU_AMD_NR_PMCS, PMU_AMD_PMC_WIDTH); + PMU_AMD_NR_PMCS, PMU_AMD_PMC_WIDTH); } static int pmu_amd_translate(unsigned int *raw_event_idp, unsigned int event_id) { assert(event_id < ARRAY_SIZE(pmu_amd_generic_events)); + *raw_event_idp = pmu_amd_generic_events[event_id]; + return 0; } @@ -131,12 +133,14 @@ pmu_amd_alloc(unsigned int *pmc_idp, unsigned int raw_event_id) pmu = pmu_amd_get(); - if (pmu->pmc_bm == 0) + if (pmu->pmc_bm == 0) { return EAGAIN; + } pmc_id = __builtin_ffs(pmu->pmc_bm) - 1; pmu->pmc_bm &= ~(1U << pmc_id); *pmc_idp = pmc_id; + return 0; } @@ -150,7 +154,9 @@ pmu_amd_free(unsigned int pmc_id) pmu = pmu_amd_get(); mask = (1U << pmc_id); + assert(!(pmu->pmc_bm & mask)); + pmu->pmc_bm |= mask; } @@ -179,6 +185,7 @@ static void pmu_amd_stop(unsigned int pmc_id) { assert(pmc_id < PMU_AMD_NR_PMCS); + cpu_set_msr(PMU_AMD_MSR_PERFEVTSEL0 + pmc_id, 0, 0); } @@ -190,6 +197,7 @@ pmu_amd_read(unsigned int pmc_id) assert(pmc_id < PMU_AMD_NR_PMCS); cpu_get_msr(PMU_AMD_MSR_PERCTR0 + pmc_id, &high, &low); + return (((uint64_t)high << 32) | low); } @@ -207,8 +215,9 @@ pmu_amd_setup(void) } /* Support AMD Family 10h processors and later */ - if (cpu->family < 16) + if (cpu->family < 16) { return ENODEV; + } pmu = pmu_amd_get(); pmu->pmc_bm = (1U << PMU_AMD_NR_PMCS) - 1; |