From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757208AbcBWD5y (ORCPT ); Mon, 22 Feb 2016 22:57:54 -0500 Received: from e28smtp04.in.ibm.com ([125.16.236.4]:33669 "EHLO e28smtp04.in.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757166AbcBWD5v (ORCPT ); Mon, 22 Feb 2016 22:57:51 -0500 X-IBM-Helo: d28relay03.in.ibm.com X-IBM-MailFrom: maddy@linux.vnet.ibm.com X-IBM-RcptTo: linux-kernel@vger.kernel.org From: Madhavan Srinivasan To: linux-kernel@vger.kernel.org Cc: Madhavan Srinivasan , Michael Ellerman , Benjamin Herrenschmidt , Paul Mackerras , Anton Blanchard , Daniel Axtens , Stephane Eranian , Sukadev Bhattiprolu Subject: [PATCH v8 5/7] powerpc/perf: Add event attribute and group to nest pmu Date: Tue, 23 Feb 2016 09:16:36 +0530 Message-Id: <1456199198-11056-6-git-send-email-maddy@linux.vnet.ibm.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1456199198-11056-1-git-send-email-maddy@linux.vnet.ibm.com> References: <1456199198-11056-1-git-send-email-maddy@linux.vnet.ibm.com> X-TM-AS-MML: disable x-cbid: 16022303-0013-0000-0000-00000A4DE1BE Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 Cc: Benjamin Herrenschmidt Cc: Paul Mackerras Cc: Anton Blanchard Cc: Daniel Axtens Cc: Stephane Eranian Cc: Sukadev Bhattiprolu Signed-off-by: Madhavan Srinivasan --- 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 + +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