lkml.org 
[lkml]   [2015]   [Jun]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v1 5/9]powerpc/powernv: nest pmu feature detection support
    Date
    Patch adds a device tree function to detect the nest pmu
    support. Function will look for specific dt property "ibm,ima-chip"
    as a detection mechanism for the nest pmu.

    For Nest pmu, device tree will have two set of information.
    1) Per-chip Homer address region for nest pmu counter collection area.
    2) Supported Nest PMUs and events

    Device tree layout for the Nest PMU as follows.

    / -- DT root folder
    |
    -nest-ima -- Nest PMU folder
    |

    -ima-chip@<chip-id> -- Per-chip folder for HOMER region information
    |
    -ibm,chip-id -- Chip id
    -ibm,ima-chip
    -reg -- HOMER PORE Nest Counter collection Address (RA)
    -size -- size to map in kernel space

    -Alink_BW -- Nest PMU folder
    |
    -Alink0 -- Nest PMU Alink Event file
    -scale.Alink0.scale -- Event scale file
    -unit.Alink0.unit -- Event unit file
    -device_type -- "nest-ima-unit" marker
    ....

    Patch save per-chip HOMER offset and maps the same to kernel structure.
    Subsequent patch will parse the next part of the DT to find various
    Nest PMUs and their events.

    Cc: Michael Ellerman <mpe@ellerman.id.au>
    Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
    Cc: Paul Mackerras <paulus@samba.org>
    Cc: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
    Cc: Anshuman Khandual <khandual@linux.vnet.ibm.com>
    Cc: Stephane Eranian <eranian@google.com>
    Signed-off-by: Madhavan Srinivasan <maddy@linux.vnet.ibm.com>
    ---
    arch/powerpc/perf/nest-pmu.c | 37 +++++++++++++++++++++++++++++++++++++
    1 file changed, 37 insertions(+)

    diff --git a/arch/powerpc/perf/nest-pmu.c b/arch/powerpc/perf/nest-pmu.c
    index 345707c..c979e57 100644
    --- a/arch/powerpc/perf/nest-pmu.c
    +++ b/arch/powerpc/perf/nest-pmu.c
    @@ -11,6 +11,7 @@

    #include "nest-pmu.h"

    +static struct perchip_nest_info p8_perchip_nest_info[P8_MAX_CHIP];
    static cpumask_t cpu_mask_nest_pmu;

    static ssize_t cpumask_nest_pmu_get_attr(struct device *dev,
    @@ -242,6 +243,36 @@ static int update_pmu_ops(struct nest_pmu *pmu)
    return 0;
    }

    +static int nest_ima_detect_parse(void)
    +{
    + const __be32 *gcid;
    + const __be64 *chip_ima_reg;
    + const __be64 *chip_ima_size;
    + struct device_node *dev;
    + int rc = -EINVAL, idx;
    +
    + for_each_node_with_property(dev, "ibm,ima-chip") {
    + gcid = of_get_property(dev, "ibm,chip-id", NULL);
    + chip_ima_reg = of_get_property(dev, "reg", NULL);
    + chip_ima_size = of_get_property(dev, "size", NULL);
    + if ((!gcid) || (!chip_ima_reg) || (!chip_ima_size)) {
    + pr_err("%s: device %s missing property \n",
    + __func__, dev->full_name);
    + return rc;
    + }
    +
    + idx = (uint32_t)be32_to_cpup(gcid);
    + p8_perchip_nest_info[idx].pbase = be64_to_cpup(chip_ima_reg);
    + p8_perchip_nest_info[idx].size = be64_to_cpup(chip_ima_size);
    + p8_perchip_nest_info[idx].vbase = (uint64_t)
    + phys_to_virt(p8_perchip_nest_info[idx].pbase);
    +
    + rc = 0;
    + }
    +
    + return rc;
    +}
    +
    static int __init nest_pmu_init(void)
    {
    int ret = 0;
    @@ -256,6 +287,12 @@ static int __init nest_pmu_init(void)

    cpumask_chip();

    + /*
    + * Detect the Nest PMU feature
    + */
    + if (nest_ima_detect_parse())
    + return 0;
    +
    return 0;
    }
    device_initcall(nest_pmu_init);
    --
    1.9.1


    \
     
     \ /
      Last update: 2015-06-02 18:41    [W:5.011 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site