Received: by 10.223.185.116 with SMTP id b49csp787252wrg; Wed, 21 Feb 2018 06:58:07 -0800 (PST) X-Google-Smtp-Source: AH8x227NHIyKxOdkU8xkV/kwfEsmVbeRyeW97FIeI799TIWf0brxekBEuszU4Ohbn/jDxMIHsv1W X-Received: by 2002:a17:902:6b89:: with SMTP id p9-v6mr3433772plk.377.1519225087613; Wed, 21 Feb 2018 06:58:07 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1519225087; cv=none; d=google.com; s=arc-20160816; b=KpW84H2oZ8fktVl1Z9kvATprjkNJvJbACoBZ4x1jkS79jnWL4+JPZmKuP7bvAJpTNY xYJgVt76KHAwzgOCNAbyOFWrreYRXds5O9uoTndRACOttaq68jgcZCiqXcSVkYTH+slZ 5dq8xbZpY/6He29w25YUXy6cRfJ4YjDzTnVfuXI3PEU8gykygsjPsjh9hMGprDin278x W8IPqZBlGeg2a0fiit8zg+KURC4dhsfs0okbEr8qG0mxA55xLSjGVRESiZFyaeejqsfB rs2nrmY03cizWFyoAwxWtIrJOi1OueipgYF45+FtBlCgOiUcURK6Ki1xhhht+3LSAg5p tBnA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :arc-authentication-results; bh=evjuBauOekG+MdunxoDsR48H2aq9FeHwxyUW6XfbD5w=; b=upmx4y0H0DmkurK8qS79JAHLf1EbUAjiE2uMwWR56jEKVdF8vxV9BAmqdMv9ObcztD fabZzhGH8I2y9RpGogo8yaJeVjsLY/qeaWS3nADiyH2ComEaK9K8ke+anX+xtVSZhFgB L7R+o4kROMcqibYL7/aRUIGNzxRaxUjUDdvt8flXDeHm31CQJ7Jmv0UG5rJ5V2wTF6t0 +arqZLoDIAthREILXh/LhEFHpmVcs+uPE89Jj73PnGWAnAoQo9JVvvLCiMcXWwvMlnUY o+xCpV9GK7CRf7ZEmqZuE6WCBgDqg9GXiMglSaWgm9dKyAoUhjdJwOZYykjCXBzuwiZx ykgA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=ibm.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id z23-v6si1801989pll.4.2018.02.21.06.57.52; Wed, 21 Feb 2018 06:58:07 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=ibm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S937127AbeBUOzq (ORCPT + 99 others); Wed, 21 Feb 2018 09:55:46 -0500 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:60796 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S936922AbeBUOzo (ORCPT ); Wed, 21 Feb 2018 09:55:44 -0500 Received: from pps.filterd (m0098410.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id w1LEtGHD075621 for ; Wed, 21 Feb 2018 09:55:43 -0500 Received: from e06smtp11.uk.ibm.com (e06smtp11.uk.ibm.com [195.75.94.107]) by mx0a-001b2d01.pphosted.com with ESMTP id 2g95y5d89u-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Wed, 21 Feb 2018 09:55:42 -0500 Received: from localhost by e06smtp11.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 21 Feb 2018 14:55:40 -0000 Received: from b06cxnps4076.portsmouth.uk.ibm.com (9.149.109.198) by e06smtp11.uk.ibm.com (192.168.101.141) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Wed, 21 Feb 2018 14:55:37 -0000 Received: from d06av22.portsmouth.uk.ibm.com (d06av22.portsmouth.uk.ibm.com [9.149.105.58]) by b06cxnps4076.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id w1LEtb2d46465174; Wed, 21 Feb 2018 14:55:37 GMT Received: from d06av22.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id CD9FD4C04E; Wed, 21 Feb 2018 14:49:13 +0000 (GMT) Received: from d06av22.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 6AB3A4C040; Wed, 21 Feb 2018 14:49:12 +0000 (GMT) Received: from oc4502181600.in.ibm.com (unknown [9.124.217.140]) by d06av22.portsmouth.uk.ibm.com (Postfix) with ESMTP; Wed, 21 Feb 2018 14:49:12 +0000 (GMT) From: Shilpasri G Bhat To: mpe@ellerman.id.au Cc: linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org, benh@kernel.crashing.org, Shilpasri G Bhat Subject: [PATCH V2] powerpc/powernv : Add support to enable sensor groups Date: Wed, 21 Feb 2018 20:25:14 +0530 X-Mailer: git-send-email 1.8.3.1 X-TM-AS-GCONF: 00 x-cbid: 18022114-0040-0000-0000-00000436191F X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 18022114-0041-0000-0000-000020D82E46 Message-Id: <1519224914-24596-1-git-send-email-shilpa.bhat@linux.vnet.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2018-02-21_05:,, signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=1 malwarescore=0 lowpriorityscore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1709140000 definitions=main-1802210181 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Adds support to enable/disable a sensor group. This can be used to select the sensor groups that needs to be copied to main memory by OCC. Sensor groups like power, temperature, current, voltage, frequency, utilization can be enabled/disabled at runtime. Signed-off-by: Shilpasri G Bhat --- Changes from V1: - Rebase on master - Add documentation .../ABI/testing/sysfs-firmware-opal-sensor-groups | 34 ++++++ arch/powerpc/include/asm/opal-api.h | 4 +- arch/powerpc/include/asm/opal.h | 1 + .../powerpc/platforms/powernv/opal-sensor-groups.c | 123 ++++++++++++++++----- arch/powerpc/platforms/powernv/opal-wrappers.S | 1 + 5 files changed, 132 insertions(+), 31 deletions(-) create mode 100644 Documentation/ABI/testing/sysfs-firmware-opal-sensor-groups diff --git a/Documentation/ABI/testing/sysfs-firmware-opal-sensor-groups b/Documentation/ABI/testing/sysfs-firmware-opal-sensor-groups new file mode 100644 index 0000000..81081de --- /dev/null +++ b/Documentation/ABI/testing/sysfs-firmware-opal-sensor-groups @@ -0,0 +1,34 @@ +What: /sys/firmware/opal/sensor_groups +Date: January 2018 +Contact: Linux for PowerPC mailing list +Description: Sensor groups directory for POWER9 powernv servers + + Each folder in this directory contains a sensor group + which are classified based on type of the sensor + like power, temperature, frequency, current, etc. They + can also indicate the group of sensors belonging to + different owners like CSM, Profiler, Job-Scheduler + +What: /sys/firmware/opal/sensor_groups//clear +Date: Januaury 2018 +Contact: Linux for PowerPC mailing list +Description: Sysfs file to clear the min-max of all the sensors + belonging to the group. + + Writing 1 to this file will clear the minimum and + maximum values of all the sensors in the group. The + min-max of a sensor is the historical minimum and + maximum value of the sensor cached by OCC. + +What: /sys/firmware/opal/sensor_groups//enable +Date: Januaury 2018 +Contact: Linux for PowerPC mailing list +Description: Sysfs file to enable/disable the sensor-group + + Writing 0 value to this file will disable the copying + of the sensor-group to main memory by OCC. And writing + 1 to this file will enable the sensor-group copying. + By default all the sensor-groups are enabled and will + be copied to main memory. This file can be used to + increase the update frequency of selective + sensor-groups. diff --git a/arch/powerpc/include/asm/opal-api.h b/arch/powerpc/include/asm/opal-api.h index 94bd1bf..b6bbbd8 100644 --- a/arch/powerpc/include/asm/opal-api.h +++ b/arch/powerpc/include/asm/opal-api.h @@ -204,7 +204,9 @@ #define OPAL_NPU_SPA_SETUP 159 #define OPAL_NPU_SPA_CLEAR_CACHE 160 #define OPAL_NPU_TL_SET 161 -#define OPAL_LAST 161 +#define OPAL_SENSOR_READ_U64 162 +#define OPAL_SENSOR_GROUP_ENABLE 163 +#define OPAL_LAST 163 /* Device tree flags */ diff --git a/arch/powerpc/include/asm/opal.h b/arch/powerpc/include/asm/opal.h index 12e70fb..e708c41 100644 --- a/arch/powerpc/include/asm/opal.h +++ b/arch/powerpc/include/asm/opal.h @@ -286,6 +286,7 @@ int64_t opal_imc_counters_init(uint32_t type, uint64_t address, int opal_get_power_shift_ratio(u32 handle, int token, u32 *psr); int opal_set_power_shift_ratio(u32 handle, int token, u32 psr); int opal_sensor_group_clear(u32 group_hndl, int token); +int opal_sensor_group_enable(u32 group_hndl, int token, bool enable); s64 opal_signal_system_reset(s32 cpu); diff --git a/arch/powerpc/platforms/powernv/opal-sensor-groups.c b/arch/powerpc/platforms/powernv/opal-sensor-groups.c index 7e5a235..1a3359d 100644 --- a/arch/powerpc/platforms/powernv/opal-sensor-groups.c +++ b/arch/powerpc/platforms/powernv/opal-sensor-groups.c @@ -24,6 +24,8 @@ struct sg_attr { u32 handle; struct kobj_attribute attr; + u32 opal_no; + int enable; }; static struct sensor_group { @@ -32,34 +34,44 @@ struct sg_attr { struct sg_attr *sgattrs; } *sgs; -static ssize_t sg_store(struct kobject *kobj, struct kobj_attribute *attr, - const char *buf, size_t count) +static int sensor_group_clear(u32 handle) { - struct sg_attr *sattr = container_of(attr, struct sg_attr, attr); struct opal_msg msg; - u32 data; - int ret, token; - - ret = kstrtoint(buf, 0, &data); - if (ret) - return ret; - - if (data != 1) - return -EINVAL; + int token, ret; token = opal_async_get_token_interruptible(); - if (token < 0) { - pr_devel("Failed to get token\n"); + if (token < 0) return token; + + ret = opal_sensor_group_clear(handle, token); + if (ret == OPAL_ASYNC_COMPLETION) { + ret = opal_async_wait_response(token, &msg); + if (ret) { + pr_devel("Failed to wait for the async response\n"); + ret = -EIO; + goto out; + } + ret = opal_error_code(opal_get_async_rc(msg)); + } else { + ret = opal_error_code(ret); } - ret = mutex_lock_interruptible(&sg_mutex); - if (ret) - goto out_token; +out: + opal_async_release_token(token); + return ret; +} + +static int sensor_group_enable(u32 handle, int enable) +{ + struct opal_msg msg; + int token, ret; + + token = opal_async_get_token_interruptible(); + if (token < 0) + return token; - ret = opal_sensor_group_clear(sattr->handle, token); - switch (ret) { - case OPAL_ASYNC_COMPLETION: + ret = opal_sensor_group_enable(handle, token, enable); + if (ret == OPAL_ASYNC_COMPLETION) { ret = opal_async_wait_response(token, &msg); if (ret) { pr_devel("Failed to wait for the async response\n"); @@ -67,39 +79,90 @@ static ssize_t sg_store(struct kobject *kobj, struct kobj_attribute *attr, goto out; } ret = opal_error_code(opal_get_async_rc(msg)); - if (!ret) - ret = count; + } else { + ret = opal_error_code(ret); + } + +out: + opal_async_release_token(token); + return ret; +} + +static ssize_t sg_store(struct kobject *kobj, struct kobj_attribute *attr, + const char *buf, size_t count) +{ + struct sg_attr *sattr = container_of(attr, struct sg_attr, attr); + u32 data; + int ret; + + ret = kstrtoint(buf, 0, &data); + if (ret) + return ret; + + ret = mutex_lock_interruptible(&sg_mutex); + if (ret) + return ret; + + ret = -EINVAL; + switch (sattr->opal_no) { + case OPAL_SENSOR_GROUP_CLEAR: + if (data == 1) + ret = sensor_group_clear(sattr->handle); break; - case OPAL_SUCCESS: - ret = count; + case OPAL_SENSOR_GROUP_ENABLE: + if (data == 0 || data == 1) { + if (data != sattr->enable) { + ret = sensor_group_enable(sattr->handle, data); + if (!ret) + sattr->enable = data; + } else { + ret = 0; + } + } break; default: - ret = opal_error_code(ret); + break; } -out: + if (!ret) + ret = count; + mutex_unlock(&sg_mutex); -out_token: - opal_async_release_token(token); return ret; } +static ssize_t sg_show(struct kobject *kobj, struct kobj_attribute *attr, + char *buf) +{ + struct sg_attr *sattr = container_of(attr, struct sg_attr, attr); + + return sprintf(buf, "%d\n", sattr->enable); +} + static struct sg_ops_info { int opal_no; const char *attr_name; ssize_t (*store)(struct kobject *kobj, struct kobj_attribute *attr, const char *buf, size_t count); + ssize_t (*show)(struct kobject *kobj, struct kobj_attribute *attr, + char *buf); + umode_t mode; } ops_info[] = { - { OPAL_SENSOR_GROUP_CLEAR, "clear", sg_store }, + { OPAL_SENSOR_GROUP_CLEAR, "clear", sg_store, NULL, 0220 }, + { OPAL_SENSOR_GROUP_ENABLE, "enable", sg_store, sg_show, 0660 }, }; static void add_attr(int handle, struct sg_attr *attr, int index) { attr->handle = handle; + attr->opal_no = ops_info[index].opal_no; sysfs_attr_init(&attr->attr.attr); attr->attr.attr.name = ops_info[index].attr_name; - attr->attr.attr.mode = 0220; + attr->attr.attr.mode = ops_info[index].mode; attr->attr.store = ops_info[index].store; + attr->attr.show = ops_info[index].show; + if (attr->opal_no == OPAL_SENSOR_GROUP_ENABLE) + attr->enable = 1; } static int add_attr_group(const __be32 *ops, int len, struct sensor_group *sg, diff --git a/arch/powerpc/platforms/powernv/opal-wrappers.S b/arch/powerpc/platforms/powernv/opal-wrappers.S index 1b2936b..90c2b40 100644 --- a/arch/powerpc/platforms/powernv/opal-wrappers.S +++ b/arch/powerpc/platforms/powernv/opal-wrappers.S @@ -323,3 +323,4 @@ OPAL_CALL(opal_sensor_group_clear, OPAL_SENSOR_GROUP_CLEAR); OPAL_CALL(opal_npu_spa_setup, OPAL_NPU_SPA_SETUP); OPAL_CALL(opal_npu_spa_clear_cache, OPAL_NPU_SPA_CLEAR_CACHE); OPAL_CALL(opal_npu_tl_set, OPAL_NPU_TL_SET); +OPAL_CALL(opal_sensor_group_enable, OPAL_SENSOR_GROUP_ENABLE); -- 1.8.3.1