• Anju T Sudhakar's avatar
    powerpc/powernv: Add debugfs interface for imc-mode and imc-command · 684d9840
    Anju T Sudhakar authored
    In memory Collection (IMC) counter pmu driver controls the ucode's
    execution state. At the system boot, IMC perf driver pause the ucode.
    Ucode state is changed to "running" only when any of the nest units
    are monitored or profiled using perf tool.
    
    Nest units support only limited set of hardware counters and ucode is
    always programmed in the "production mode" ("accumulation") mode. This
    mode is configured to provide key performance metric data for most of
    the nest units.
    
    But ucode also supports other modes which would be used for "debug" to
    drill down specific nest units. That is, ucode when switched to
    "powerbus" debug mode (for example), will dynamically reconfigure the
    nest counters to target only "powerbus" related events in the hardware
    counters. This allows the IMC nest unit to focus on powerbus related
    transactions in the system in more detail. At this point, production
    mode events may or may not be counted.
    
    IMC nest counters has both in-band (ucode access) and out of band
    access to it. Since not all nest counter configurations are supported
    by ucode, out of band tools are used to characterize other nest
    counter configurations.
    
    Patch provides an interface via "debugfs" to enable the switching of
    ucode modes in the system. To switch ucode mode, one has to first
    pause the microcode (imc_cmd), and then write the target mode value to
    the "imc_mode" file.
    
    Proposed Approach:
    
    In the proposed approach, the function (export_imc_mode_and_cmd) which
    creates the debugfs interface for imc mode and command is implemented
    in opal-imc.c. Thus we can use imc_get_mem_addr() to get the homer
    base address for each chip.
    
    The interface to expose imc mode and command is required only if we
    have nest pmu units registered. Employing the existing data structures
    to track whether we have any nest units registered will require to
    extend data from perf side to opal-imc.c. Instead an integer is
    introduced to hold that information by counting successful nest unit
    registration. Debugfs interface is removed based on the integer count.
    
    Example for the interface:
    
      $ ls /sys/kernel/debug/imc
      imc_cmd_0  imc_cmd_8  imc_mode_0  imc_mode_8
    Signed-off-by: default avatarAnju T Sudhakar <anju@linux.vnet.ibm.com>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    684d9840
opal-imc.c 7.5 KB