• Sandipan Das's avatar
    perf/x86/amd/core: Add PerfMonV2 counter control · 9622e67e
    Sandipan Das authored
    If AMD Performance Monitoring Version 2 (PerfMonV2) is
    supported, use a new scheme to manage the Core PMCs using
    the new global control and status registers. This will be
    bypassed on unsupported hardware (x86_pmu.version < 2).
    
    Currently, all PMCs have dedicated control (PERF_CTL) and
    counter (PERF_CTR) registers. For a given PMC, the enable
    (En) bit of its PERF_CTL register is used to start or stop
    counting.
    
    The Performance Counter Global Control (PerfCntrGlobalCtl)
    register has enable (PerfCntrEn) bits for each PMC. For a
    PMC to start counting, both PERF_CTL and PerfCntrGlobalCtl
    enable bits must be set. If either of those are cleared,
    the PMC stops counting.
    
    In x86_pmu_{en,dis}able_all(), the PERF_CTL registers of
    all active PMCs are written to in a loop. Ideally, PMCs
    counting the same event that were started and stopped at
    the same time should record the same counts. Due to delays
    in between writes to the PERF_CTL registers across loop
    iterations, the PMCs cannot be enabled or disabled at the
    same instant and hence, record slightly different counts.
    This is fixed by enabling or disabling all active PMCs at
    the same time with a single write to the PerfCntrGlobalCtl
    register.
    Signed-off-by: default avatarSandipan Das <sandipan.das@amd.com>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lkml.kernel.org/r/dfe8e934074aaabc6ba748dfaccd0a77c974bb82.1650515382.git.sandipan.das@amd.com
    9622e67e
core.c 35.1 KB