Messages in this thread Patch in this message | | | From | Madhavan Srinivasan <> | Subject | [PATCH v8 5/7] powerpc/perf: Add event attribute and group to nest pmu | Date | Tue, 23 Feb 2016 09:16:36 +0530 |
| |
Device tree nest driver module parses the nest unit and its events. It pass the information to nest pmu code which is placed in perf/ as "nest-pmu.c".
Inthis patch code added to create only event attributes and attribute groups for the nest pmu.
Cc: Michael Ellerman <mpe@ellerman.id.au> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Anton Blanchard <anton@samba.org> Cc: Daniel Axtens <dja@axtens.net> Cc: Stephane Eranian <eranian@google.com> Cc: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com> Signed-off-by: Madhavan Srinivasan <maddy@linux.vnet.ibm.com> --- arch/powerpc/perf/Makefile | 2 +- arch/powerpc/perf/nest-pmu.c | 69 ++++++++++++++++++++++++++++++ arch/powerpc/platforms/powernv/opal-nest.c | 8 ++++ 3 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 arch/powerpc/perf/nest-pmu.c
diff --git a/arch/powerpc/perf/Makefile b/arch/powerpc/perf/Makefile index f9c083a5652a..6da656b50e3c 100644 --- a/arch/powerpc/perf/Makefile +++ b/arch/powerpc/perf/Makefile @@ -5,7 +5,7 @@ obj-$(CONFIG_PERF_EVENTS) += callchain.o obj-$(CONFIG_PPC_PERF_CTRS) += core-book3s.o bhrb.o obj64-$(CONFIG_PPC_PERF_CTRS) += power4-pmu.o ppc970-pmu.o power5-pmu.o \ power5+-pmu.o power6-pmu.o power7-pmu.o \ - power8-pmu.o + power8-pmu.o nest-pmu.o obj32-$(CONFIG_PPC_PERF_CTRS) += mpc7450-pmu.o obj-$(CONFIG_FSL_EMB_PERF_EVENT) += core-fsl-emb.o diff --git a/arch/powerpc/perf/nest-pmu.c b/arch/powerpc/perf/nest-pmu.c new file mode 100644 index 000000000000..b9b44147c9b8 --- /dev/null +++ b/arch/powerpc/perf/nest-pmu.c @@ -0,0 +1,69 @@ +/* + * Nest Performance Monitor counter support. + * + * Copyright (C) 2016 Madhavan Srinivasan, IBM Corporation. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published + * by the Free Software Foundation. + */ + +#include <asm/nest-pmu.h> + +struct perchip_nest_info nest_perchip_info[NEST_MAX_CHIPS]; +struct nest_pmu *per_nest_pmu_arr[NEST_MAX_PMUS]; + +/* + * Populate event name and string in attribute + */ +static struct attribute *dev_str_attr(const char *name, const char *str) +{ + struct perf_pmu_events_attr *attr; + + attr = kzalloc(sizeof(*attr), GFP_KERNEL); + + sysfs_attr_init(&attr->attr.attr); + + attr->event_str = str; + attr->attr.attr.name = name; + attr->attr.attr.mode = 0444; + attr->attr.show = perf_event_sysfs_show; + + return &attr->attr.attr; +} + +static int update_events_in_group( + struct nest_ima_events *nest_events, int idx, struct nest_pmu *pmu) +{ + struct attribute_group *attr_group; + struct attribute **attrs; + int i; + + /* Allocate memory for attribute group */ + attr_group = kzalloc(sizeof(*attr_group), GFP_KERNEL); + if (!attr_group) + return -ENOMEM; + + /* Allocate memory for attributes */ + attrs = kzalloc((sizeof(struct attribute *) * (idx + 1)), GFP_KERNEL); + if (!attrs) + return -ENOMEM; + + attr_group->name = "events"; + attr_group->attrs = attrs; + for (i = 0; i < idx; i++, nest_events++) + attrs[i] = dev_str_attr((char *)nest_events->ev_name, + (char *)nest_events->ev_value); + + pmu->attr_groups[0] = attr_group; + return 0; +} + +int init_nest_pmu(struct nest_ima_events *nest_events, + int idx, struct nest_pmu *pmu_ptr) +{ + + update_events_in_group(nest_events, idx, pmu_ptr); + return 0; +} + diff --git a/arch/powerpc/platforms/powernv/opal-nest.c b/arch/powerpc/platforms/powernv/opal-nest.c index 548a8c0236e4..6ad260353d04 100644 --- a/arch/powerpc/platforms/powernv/opal-nest.c +++ b/arch/powerpc/platforms/powernv/opal-nest.c @@ -32,6 +32,8 @@ extern struct perchip_nest_info nest_perchip_info[NEST_MAX_CHIPS]; extern struct nest_pmu *per_nest_pmu_arr[NEST_MAX_PMUS]; +extern int init_nest_pmu(struct nest_ima_events *nest_events, + int idx, struct nest_pmu *pmu_ptr); static int nest_event_info(char *name, struct nest_ima_events *nest_events) { @@ -210,6 +212,12 @@ static int nest_pmu_create(struct device_node *parent, int pmu_index) idx += ret; } + ret = init_nest_pmu(nest_events, idx, pmu_ptr); + if (ret) { + pr_err("Nest PMU %s Register failed\n", pmu_ptr->pmu.name); + return ret; + } + return 0; } -- 1.9.1
| |