From patchwork Wed Jan 8 23:54:20 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jolly Shah X-Patchwork-Id: 11324885 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id EC3D7921 for ; Wed, 8 Jan 2020 23:55:20 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id C47D420720 for ; Wed, 8 Jan 2020 23:55:20 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="Euz14z2M"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=xilinx.onmicrosoft.com header.i=@xilinx.onmicrosoft.com header.b="L1HspH3f" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org C47D420720 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=xilinx.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=mHzMB2+ohFAGlp3ftYk6IaSOuUG3IakngJ91pn8cG5s=; b=Euz14z2MTmNJdB NUcGfI5hCcX2FTd1cklRIwC8iyW5LqJPY5IT8RUZ51GWmGo4LyO3hl1nrhsNjwyrrATedCCUoM03B jcoiEmuXx2U6z8aG6TJI+xwUcLFk00VAKUPIf//Bp5NecTWiW3/1U72EYROf4sRubR6vY6LmoZ0SH CKsTUHpS+su4a3XT4FBNq+0MFRDj8V0S14fFHrNpZEabweCNmF0pgvjy/mP7vwW7I7OgZsOY7nOgo rgG+ymsec9xiLAcfLo3ZpyCz9T1gQtC2Pqp9aDKDSYIq/zzuY+JuM7PYG4IG3WGRqCzRmQNbk3hev +avhCo/0HZEZU6rfaaeg==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1ipLAT-0002Uy-B6; Wed, 08 Jan 2020 23:55:17 +0000 Received: from mail-dm6nam11on2069.outbound.protection.outlook.com ([40.107.223.69] helo=NAM11-DM6-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1ipLA4-0000fj-EA for linux-arm-kernel@lists.infradead.org; Wed, 08 Jan 2020 23:54:54 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=g252871i/o5bxfvhGavJ7qatR5ro38BFLVRwc3Vg9LQnflBJRCZiF20NWVzJ24RU6oyNQhRjFmt6b65VA3TA2wMp+7/MuQ7XJk2jFddoL7PYLnlq46+8Dq3I3klU8PBb6DPNO73rCDguJJ2MTFHLhShBvPqivn9t6P29D9WxsqMZlJTyhgOspKJ2+RmnwkSfhS4MR5tU1IV31AFuk2MiJIkwiQqots4VCw+yVc550Sa6K4GK+gM+/r/QofbMQmZwGZIOcBtSULtSFLAG3WcHs3dHKBqIcTR2CZ4Q52drRlhL0gfCiM4eIyuRasnL/QEnn1XwlEGpJFmukEgfkhdJOg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=5TkZ4ipekWNHt0xnvjTqoRCL6UyPvqHoSGbedP4QqeQ=; b=YrakKjtMPf3SHiDQC6F6kcn5KcWO3J4hVc+ScyHN2Yu8Pn47RaPGUueshkhhlcgI6Ehsgr7Uz2tT+NKRSnTzbrkJekAQVXa/qgubxOT0RAZMc2Y9pl2t1j06EcsxZB+FP594LJemp8XcsksaJJdRaq5cREA2ZqbVR8Z8CVw0qXYGboea/wmd5RzexseZSOzAgNHi5lpgpXCq3Uoj57yhphV75IYE6gAlQkkbcEwYWQtUJjMQRbZYwbGmdk0nbkbFBcFKzk8DYb814IX7INu+75stzKDmCOqki5NA4Z+1VYOfDyLIAicP1afhC4jNQU6EYblg1kqZ5rI+4OOUq47P6Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 149.199.60.83) smtp.rcpttodomain=linaro.org smtp.mailfrom=xilinx.com; dmarc=bestguesspass action=none header.from=xilinx.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=xilinx.onmicrosoft.com; s=selector2-xilinx-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=5TkZ4ipekWNHt0xnvjTqoRCL6UyPvqHoSGbedP4QqeQ=; b=L1HspH3frkKgX8TAfBz2k4o+5kFtll+wvz2qDWCdfe+Go1YPNuBvvKEMjHYniR2bLfLci/gu5/Gjf90WNRPNkS++gt4FtHoi1yOeF6SaSuj51K/c0u+IF9GFOBNSJkoCxm1LSNH2ZRt84nomlyQcZpKK1FFuICjXLrPRyLbARaA= Received: from BL0PR02CA0078.namprd02.prod.outlook.com (2603:10b6:208:51::19) by DM6PR02MB4604.namprd02.prod.outlook.com (2603:10b6:5:28::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2623.8; Wed, 8 Jan 2020 23:54:48 +0000 Received: from SN1NAM02FT031.eop-nam02.prod.protection.outlook.com (2a01:111:f400:7e44::206) by BL0PR02CA0078.outlook.office365.com (2603:10b6:208:51::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2623.9 via Frontend Transport; Wed, 8 Jan 2020 23:54:48 +0000 Authentication-Results: spf=pass (sender IP is 149.199.60.83) smtp.mailfrom=xilinx.com; linaro.org; dkim=none (message not signed) header.d=none;linaro.org; dmarc=bestguesspass action=none header.from=xilinx.com; Received-SPF: Pass (protection.outlook.com: domain of xilinx.com designates 149.199.60.83 as permitted sender) receiver=protection.outlook.com; client-ip=149.199.60.83; helo=xsj-pvapsmtpgw01; Received: from xsj-pvapsmtpgw01 (149.199.60.83) by SN1NAM02FT031.mail.protection.outlook.com (10.152.72.116) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.20.2623.9 via Frontend Transport; Wed, 8 Jan 2020 23:54:47 +0000 Received: from unknown-38-66.xilinx.com ([149.199.38.66] helo=xsj-pvapsmtp01) by xsj-pvapsmtpgw01 with esmtp (Exim 4.63) (envelope-from ) id 1ipL9z-0003py-Du; Wed, 08 Jan 2020 15:54:47 -0800 Received: from [127.0.0.1] (helo=localhost) by xsj-pvapsmtp01 with smtp (Exim 4.63) (envelope-from ) id 1ipL9u-0002BN-9e; Wed, 08 Jan 2020 15:54:42 -0800 Received: from [172.19.2.91] (helo=xsjjollys50.xilinx.com) by xsj-pvapsmtp01 with esmtp (Exim 4.63) (envelope-from ) id 1ipL9l-0002A4-IW; Wed, 08 Jan 2020 15:54:33 -0800 From: Jolly Shah To: ard.biesheuvel@linaro.org, mingo@kernel.org, gregkh@linuxfoundation.org, matt@codeblueprint.co.uk, sudeep.holla@arm.com, hkallweit1@gmail.com, keescook@chromium.org, dmitry.torokhov@gmail.com, michal.simek@xilinx.com Subject: [PATCH v2 1/4] firmware: xilinx: Add sysfs interface Date: Wed, 8 Jan 2020 15:54:20 -0800 Message-Id: <1578527663-10243-2-git-send-email-jolly.shah@xilinx.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1578527663-10243-1-git-send-email-jolly.shah@xilinx.com> References: <1578527663-10243-1-git-send-email-jolly.shah@xilinx.com> X-TM-AS-Product-Ver: IMSS-7.1.0.1224-8.2.0.1013-23620.005 X-TM-AS-User-Approved-Sender: Yes;Yes X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:149.199.60.83; IPV:; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(4636009)(376002)(346002)(39860400002)(136003)(396003)(189003)(199004)(336012)(9786002)(5660300002)(36756003)(30864003)(70206006)(70586007)(316002)(54906003)(8936002)(4326008)(356004)(107886003)(81166006)(6636002)(7696005)(426003)(186003)(2906002)(26005)(7416002)(2616005)(6666004)(8676002)(81156014)(478600001)(44832011); DIR:OUT; SFP:1101; SCL:1; SRVR:DM6PR02MB4604; H:xsj-pvapsmtpgw01; FPR:; SPF:Pass; LANG:en; PTR:unknown-60-83.xilinx.com; MX:1; A:1; MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 0e3c87d6-a7b6-473e-5b8a-08d7949624db X-MS-TrafficTypeDiagnostic: DM6PR02MB4604: X-Microsoft-Antispam-PRVS: X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply X-MS-Oob-TLC-OOBClassifiers: OLM:372; X-Forefront-PRVS: 02760F0D1C X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: Q6NEKb2B5xaO3RmbU4lrsOXNrNX0pWfr4jIdz5dLVfirbcJGb0KuaeWXxSntDPlCZAgGETjHSSP4j791I/Nr2gnshKk9snTwkVFyvDDElnZJD59t//uODVk9hetZGbytw368G5Pj2QP6no9d714jQnqXHcFOW4olgEd2AZnUNqtXsUPv0jMlA9b5xw81VG47bSJTKyThs9Ec2CnmBo6FMCFYXDRWcp2iw0nOY4NBKd6Ni6tZo567k4wMH8bZAVafznC87tFrYS4hX8TdNLBQseiFgrXm+Li9KotD6UmgLqXyAXioH0H1sInRE9Q95fjN+3c3kVZ14Ow6qT1/jANtvYhkSyyiOy6USV1r05jhp+BOIVAnwXlixyqc/kvD0oRo7pSFABWxpdtWVtsX1SoNlV+xm/ywFVQ4LYr5aDiqJd2Nq41Y2ktATvisibXaIong X-OriginatorOrg: xilinx.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Jan 2020 23:54:47.8173 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 0e3c87d6-a7b6-473e-5b8a-08d7949624db X-MS-Exchange-CrossTenant-Id: 657af505-d5df-48d0-8300-c31994686c5c X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=657af505-d5df-48d0-8300-c31994686c5c; Ip=[149.199.60.83]; Helo=[xsj-pvapsmtpgw01] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR02MB4604 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200108_155452_547246_5F78A7CC X-CRM114-Status: GOOD ( 19.20 ) X-Spam-Score: -0.0 (/) X-Spam-Report: SpamAssassin version 3.4.2 on bombadil.infradead.org summary: Content analysis details: (-0.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [40.107.223.69 listed in list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record -0.0 SPF_HELO_PASS SPF: HELO matches SPF record 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Rajan Vaja , rajanv@xilinx.com, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Jolly Shah Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org From: Rajan Vaja Add Firmware-ggs sysfs interface which provides read/write interface to global storage registers. Signed-off-by: Rajan Vaja Signed-off-by: Michal Simek Signed-off-by: Jolly Shah --- Changes in v2: - Updated Linux kernel version in documentation. - Used DEVICE_ATTR_* and ATTRIBUTE_GROUPS macros. - Free Kobject structure in case of error. - Resolved smatch errors. - Updated Signed-off-by sequence. --- Documentation/ABI/stable/sysfs-firmware-zynqmp | 50 +++++ drivers/firmware/xilinx/Makefile | 2 +- drivers/firmware/xilinx/zynqmp-ggs.c | 284 +++++++++++++++++++++++++ drivers/firmware/xilinx/zynqmp.c | 32 +++ include/linux/firmware/xlnx-zynqmp.h | 10 + 5 files changed, 377 insertions(+), 1 deletion(-) create mode 100644 Documentation/ABI/stable/sysfs-firmware-zynqmp create mode 100644 drivers/firmware/xilinx/zynqmp-ggs.c diff --git a/Documentation/ABI/stable/sysfs-firmware-zynqmp b/Documentation/ABI/stable/sysfs-firmware-zynqmp new file mode 100644 index 0000000..cffa2fc --- /dev/null +++ b/Documentation/ABI/stable/sysfs-firmware-zynqmp @@ -0,0 +1,50 @@ +What: /sys/firmware/zynqmp/ggs* +Date: January 2018 +KernelVersion: 5.5 +Contact: "Jolly Shah" +Description: + Read/Write PMU global general storage register value, + GLOBAL_GEN_STORAGE{0:3}. + Global general storage register that can be used + by system to pass information between masters. + + The register is reset during system or power-on + resets. Three registers are used by the FSBL and + other Xilinx software products: GLOBAL_GEN_STORAGE{4:6}. + + Usage: + # cat /sys/firmware/zynqmp/ggs0 + # echo > /sys/firmware/zynqmp/ggs0 + + Example: + # cat /sys/firmware/zynqmp/ggs0 + # echo 0xFFFFFFFF 0x1234ABCD > /sys/firmware/zynqmp/ggs0 + +Users: Xilinx + +What: /sys/firmware/zynqmp/pggs* +Date: January 2018 +KernelVersion: 5.5 +Contact: "Jolly Shah" +Description: + Read/Write PMU persistent global general storage register + value, PERS_GLOB_GEN_STORAGE{0:3}. + Persistent global general storage register that + can be used by system to pass information between + masters. + + This register is only reset by the power-on reset + and maintains its value through a system reset. + Four registers are used by the FSBL and other Xilinx + software products: PERS_GLOB_GEN_STORAGE{4:7}. + Register is reset only by a POR reset. + + Usage: + # cat /sys/firmware/zynqmp/pggs0 + # echo > /sys/firmware/zynqmp/pggs0 + + Example: + # cat /sys/firmware/zynqmp/pggs0 + # echo 0xFFFFFFFF 0x1234ABCD > /sys/firmware/zynqmp/pggs0 + +Users: Xilinx diff --git a/drivers/firmware/xilinx/Makefile b/drivers/firmware/xilinx/Makefile index 875a537..1e8643c 100644 --- a/drivers/firmware/xilinx/Makefile +++ b/drivers/firmware/xilinx/Makefile @@ -1,5 +1,5 @@ # SPDX-License-Identifier: GPL-2.0 # Makefile for Xilinx firmwares -obj-$(CONFIG_ZYNQMP_FIRMWARE) += zynqmp.o +obj-$(CONFIG_ZYNQMP_FIRMWARE) += zynqmp.o zynqmp-ggs.o obj-$(CONFIG_ZYNQMP_FIRMWARE_DEBUG) += zynqmp-debug.o diff --git a/drivers/firmware/xilinx/zynqmp-ggs.c b/drivers/firmware/xilinx/zynqmp-ggs.c new file mode 100644 index 0000000..e2a6700 --- /dev/null +++ b/drivers/firmware/xilinx/zynqmp-ggs.c @@ -0,0 +1,284 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Xilinx Zynq MPSoC Firmware layer + * + * Copyright (C) 2014-2018 Xilinx, Inc. + * + * Jolly Shah + * Rajan Vaja + */ + +#include +#include +#include +#include +#include +#include +#include + +static ssize_t read_register(char *buf, u32 ioctl_id, u32 reg) +{ + int ret; + u32 ret_payload[PAYLOAD_ARG_CNT]; + const struct zynqmp_eemi_ops *eemi_ops = zynqmp_pm_get_eemi_ops(); + + if (IS_ERR(eemi_ops) || !eemi_ops->ioctl) + return -EFAULT; + + ret = eemi_ops->ioctl(0, ioctl_id, reg, 0, ret_payload); + if (ret) + return ret; + + return sprintf(buf, "0x%x\n", ret_payload[1]); +} + +static ssize_t write_register(const char *buf, size_t count, u32 read_ioctl, + u32 write_ioctl, u32 reg) +{ + char *kern_buff, *inbuf, *tok; + long mask, value; + int ret; + u32 ret_payload[PAYLOAD_ARG_CNT]; + const struct zynqmp_eemi_ops *eemi_ops = zynqmp_pm_get_eemi_ops(); + + if (IS_ERR(eemi_ops) || !eemi_ops->ioctl) + return -EFAULT; + + kern_buff = kzalloc(count, GFP_KERNEL); + if (!kern_buff) + return -ENOMEM; + + ret = strlcpy(kern_buff, buf, count); + if (ret < 0) { + ret = -EFAULT; + goto err; + } + + inbuf = kern_buff; + + /* Read the write mask */ + tok = strsep(&inbuf, " "); + if (!tok) { + ret = -EFAULT; + goto err; + } + + ret = kstrtol(tok, 16, &mask); + if (ret) { + ret = -EFAULT; + goto err; + } + + /* Read the write value */ + tok = strsep(&inbuf, " "); + if (!tok) { + ret = -EFAULT; + goto err; + } + + ret = kstrtol(tok, 16, &value); + if (ret) { + ret = -EFAULT; + goto err; + } + + ret = eemi_ops->ioctl(0, read_ioctl, reg, 0, ret_payload); + if (ret) { + ret = -EFAULT; + goto err; + } + ret_payload[1] &= ~mask; + value &= mask; + value |= ret_payload[1]; + + ret = eemi_ops->ioctl(0, write_ioctl, reg, value, NULL); + if (ret) + ret = -EFAULT; + +err: + kfree(kern_buff); + if (ret) + return ret; + + return count; +} + +/** + * ggs_show - Show global general storage (ggs) sysfs attribute + * @device: Device structure + * @attr: Device attribute structure + * @buf: Requested available shutdown_scope attributes string + * @reg: Register number + * + * Return:Number of bytes printed into the buffer. + * + * Helper function for viewing a ggs register value. + * + * User-space interface for viewing the content of the ggs0 register. + * cat /sys/firmware/zynqmp/ggs0 + */ +static ssize_t ggs_show(struct device *device, + struct device_attribute *attr, + char *buf, + u32 reg) +{ + return read_register(buf, IOCTL_READ_GGS, reg); +} + +/** + * ggs_store - Store global general storage (ggs) sysfs attribute + * @device: Device structure + * @attr: Device attribute structure + * @buf: User entered shutdown_scope attribute string + * @count: Size of buf + * @reg: Register number + * + * Return: count argument if request succeeds, the corresponding + * error code otherwise + * + * Helper function for storing a ggs register value. + * + * For example, the user-space interface for storing a value to the + * ggs0 register: + * echo 0xFFFFFFFF 0x1234ABCD > /sys/firmware/zynqmp/ggs0 + */ +static ssize_t ggs_store(struct device *device, + struct device_attribute *attr, + const char *buf, size_t count, + u32 reg) +{ + if (!device || !attr || !buf || !count || reg >= GSS_NUM_REGS) + return -EINVAL; + + return write_register(buf, count, IOCTL_READ_GGS, IOCTL_WRITE_GGS, reg); +} + +/* GGS register show functions */ +#define GGS0_SHOW(N) \ + ssize_t ggs##N##_show(struct device *device, \ + struct device_attribute *attr, \ + char *buf) \ + { \ + return ggs_show(device, attr, buf, N); \ + } + +static GGS0_SHOW(0); +static GGS0_SHOW(1); +static GGS0_SHOW(2); +static GGS0_SHOW(3); + +/* GGS register store function */ +#define GGS0_STORE(N) \ + ssize_t ggs##N##_store(struct device *device, \ + struct device_attribute *attr, \ + const char *buf, \ + size_t count) \ + { \ + return ggs_store(device, attr, buf, count, N); \ + } + +static GGS0_STORE(0); +static GGS0_STORE(1); +static GGS0_STORE(2); +static GGS0_STORE(3); + +/** + * pggs_show - Show persistent global general storage (pggs) sysfs attribute + * @device: Device structure + * @attr: Device attribute structure + * @buf: Requested available shutdown_scope attributes string + * @reg: Register number + * + * Return:Number of bytes printed into the buffer. + * + * Helper function for viewing a pggs register value. + */ +static ssize_t pggs_show(struct device *device, + struct device_attribute *attr, + char *buf, + u32 reg) +{ + return read_register(buf, IOCTL_READ_PGGS, reg); +} + +/** + * pggs_store - Store persistent global general storage (pggs) sysfs attribute + * @device: Device structure + * @attr: Device attribute structure + * @buf: User entered shutdown_scope attribute string + * @count: Size of buf + * @reg: Register number + * + * Return: count argument if request succeeds, the corresponding + * error code otherwise + * + * Helper function for storing a pggs register value. + */ +static ssize_t pggs_store(struct device *device, + struct device_attribute *attr, + const char *buf, size_t count, + u32 reg) +{ + return write_register(buf, count, IOCTL_READ_PGGS, + IOCTL_WRITE_PGGS, reg); +} + +#define PGGS0_SHOW(N) \ + ssize_t pggs##N##_show(struct device *device, \ + struct device_attribute *attr, \ + char *buf) \ + { \ + return pggs_show(device, attr, buf, N); \ + } + +#define PGGS0_STORE(N) \ + ssize_t pggs##N##_store(struct device *device, \ + struct device_attribute *attr, \ + const char *buf, \ + size_t count) \ + { \ + return pggs_store(device, attr, buf, count, N); \ + } + +/* PGGS register show functions */ +static PGGS0_SHOW(0); +static PGGS0_SHOW(1); +static PGGS0_SHOW(2); +static PGGS0_SHOW(3); + +/* PGGS register store functions */ +static PGGS0_STORE(0); +static PGGS0_STORE(1); +static PGGS0_STORE(2); +static PGGS0_STORE(3); + +/* GGS register attributes */ +static DEVICE_ATTR_RW(ggs0); +static DEVICE_ATTR_RW(ggs1); +static DEVICE_ATTR_RW(ggs2); +static DEVICE_ATTR_RW(ggs3); + +/* PGGS register attributes */ +static DEVICE_ATTR_RW(pggs0); +static DEVICE_ATTR_RW(pggs1); +static DEVICE_ATTR_RW(pggs2); +static DEVICE_ATTR_RW(pggs3); + +static struct attribute *zynqmp_ggs_attrs[] = { + &dev_attr_ggs0.attr, + &dev_attr_ggs1.attr, + &dev_attr_ggs2.attr, + &dev_attr_ggs3.attr, + &dev_attr_pggs0.attr, + &dev_attr_pggs1.attr, + &dev_attr_pggs2.attr, + &dev_attr_pggs3.attr, + NULL, +}; + +ATTRIBUTE_GROUPS(zynqmp_ggs); + +int zynqmp_pm_ggs_init(struct kobject *parent_kobj) +{ + return sysfs_create_group(parent_kobj, zynqmp_ggs_groups[0]); +} diff --git a/drivers/firmware/xilinx/zynqmp.c b/drivers/firmware/xilinx/zynqmp.c index 75bdfaa..4c1117d 100644 --- a/drivers/firmware/xilinx/zynqmp.c +++ b/drivers/firmware/xilinx/zynqmp.c @@ -473,6 +473,10 @@ static inline int zynqmp_is_valid_ioctl(u32 ioctl_id) case IOCTL_GET_PLL_FRAC_MODE: case IOCTL_SET_PLL_FRAC_DATA: case IOCTL_GET_PLL_FRAC_DATA: + case IOCTL_WRITE_GGS: + case IOCTL_READ_GGS: + case IOCTL_WRITE_PGGS: + case IOCTL_READ_PGGS: return 1; default: return 0; @@ -704,6 +708,28 @@ const struct zynqmp_eemi_ops *zynqmp_pm_get_eemi_ops(void) } EXPORT_SYMBOL_GPL(zynqmp_pm_get_eemi_ops); +static int zynqmp_pm_sysfs_init(void) +{ + struct kobject *zynqmp_kobj; + int ret; + + zynqmp_kobj = kobject_create_and_add("zynqmp", firmware_kobj); + if (!zynqmp_kobj) { + pr_err("zynqmp: Firmware kobj add failed.\n"); + return -ENOMEM; + } + + ret = zynqmp_pm_ggs_init(zynqmp_kobj); + if (ret) { + kobject_put(zynqmp_kobj); + pr_err("%s() GGS init fail with error %d\n", + __func__, ret); + goto err; + } +err: + return ret; +} + static int zynqmp_firmware_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; @@ -751,6 +777,12 @@ static int zynqmp_firmware_probe(struct platform_device *pdev) /* Assign eemi_ops_table */ eemi_ops_tbl = &eemi_ops; + ret = zynqmp_pm_sysfs_init(); + if (ret) { + pr_err("%s() sysfs init fail with error %d\n", __func__, ret); + return ret; + } + zynqmp_pm_api_debugfs_init(); ret = mfd_add_devices(&pdev->dev, PLATFORM_DEVID_NONE, firmware_devs, diff --git a/include/linux/firmware/xlnx-zynqmp.h b/include/linux/firmware/xlnx-zynqmp.h index e41ad9e..534814e 100644 --- a/include/linux/firmware/xlnx-zynqmp.h +++ b/include/linux/firmware/xlnx-zynqmp.h @@ -13,6 +13,8 @@ #ifndef __FIRMWARE_ZYNQMP_H__ #define __FIRMWARE_ZYNQMP_H__ +#include + #define ZYNQMP_PM_VERSION_MAJOR 1 #define ZYNQMP_PM_VERSION_MINOR 0 @@ -42,6 +44,8 @@ #define ZYNQMP_PM_MAX_QOS 100U +#define GSS_NUM_REGS (4) + /* Node capabilities */ #define ZYNQMP_PM_CAPABILITY_ACCESS 0x1U #define ZYNQMP_PM_CAPABILITY_CONTEXT 0x2U @@ -97,6 +101,10 @@ enum pm_ioctl_id { IOCTL_GET_PLL_FRAC_MODE, IOCTL_SET_PLL_FRAC_DATA, IOCTL_GET_PLL_FRAC_DATA, + IOCTL_WRITE_GGS, + IOCTL_READ_GGS, + IOCTL_WRITE_PGGS, + IOCTL_READ_PGGS, }; enum pm_query_id { @@ -311,6 +319,8 @@ struct zynqmp_eemi_ops { int zynqmp_pm_invoke_fn(u32 pm_api_id, u32 arg0, u32 arg1, u32 arg2, u32 arg3, u32 *ret_payload); +int zynqmp_pm_ggs_init(struct kobject *parent_kobj); + #if IS_REACHABLE(CONFIG_ARCH_ZYNQMP) const struct zynqmp_eemi_ops *zynqmp_pm_get_eemi_ops(void); #else From patchwork Wed Jan 8 23:54:21 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jolly Shah X-Patchwork-Id: 11324883 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 5CB1A921 for ; Wed, 8 Jan 2020 23:54:57 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 3681E206DB for ; Wed, 8 Jan 2020 23:54:57 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="hYGeXuCN"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=xilinx.onmicrosoft.com header.i=@xilinx.onmicrosoft.com header.b="LN/AKvLg" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 3681E206DB Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=xilinx.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=Nx8Y8BvZ3YdZUd6Bk50ws/JUt+JmqaUjDVqcvEjZAQ8=; b=hYGeXuCNl4INrG SJTJqI4Cz3+8tUIVfhi6cKS/m5hSD6C3KH/DwZmnEWapHC8vxT6/oL9Rk41zRbiqjr7h+r9cuNqFC /dcNu60jTuOlPNH5gamB6JCfb0gvsO+XZ513yxBCpaACaLEg+bWGmWrU3Yypg0a5NDbZtHKGKRR1m WS1KP1vUGseo+kHb+zAB+vojUIN5uGndMWxHuxD2rxXXAw9KTmC2Ock2zLZJ/PN4beGWlgQZ5ybwS onNPDAGQHCAnk5ZUGVA2e0FCAiRiyFn0NjmuBWl9R2y4YyaleBdgq4lZ7Gjt7GSAZ0dfzQiWHlfTe k3Uc880Ri2SnsChb8YwA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1ipLA7-0000zl-NP; Wed, 08 Jan 2020 23:54:55 +0000 Received: from mail-eopbgr760080.outbound.protection.outlook.com ([40.107.76.80] helo=NAM02-CY1-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1ipLA4-0000cp-Hr for linux-arm-kernel@lists.infradead.org; Wed, 08 Jan 2020 23:54:53 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=IyzF0As19f+5T0qlXfcUZwxYrNE2FG78eoZDQt+gDloinV9efBoyUMEx1a+iKGVjxig2/LXk1aKTJIdCIArJPRxDe43bGE3gtO9+BZD1fe1SCNbJlT5rxqJtIC6bKz1jJl2kreEpUL4hx71C/PwD/CisJPvezg3OqPD9uENwRyDYZL61LLe2p2aNBxEdu2pv0Yhzrbx9vJfN3lgPwBxV2+Qp1rLPB3gEdlnN/9DXLnahW3Fg6M5EYAj7HIOUDCtNhWmdGrhjOlFFWqwJvwGXkMwmMmGEUVCrlWzCDL3pD3kSoiAc/y22mjqW7act7OCsDaIfHzGJFu4MTXcNP1VKKw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=DJ1oMz9Yd1FhsQB2SzC6dQsxsGM6koBg2IizX+ZpOJI=; b=Q/l9qgX7dHuxvnPhQQaRbMct0pMMkNGczUIdr1bIZ49UZkUUqZ5iThd53y0e6d2B1lvnnnGONXX7EHC/Raksa6qpeTQ2kh286el7qLi2mPz16hLlP9V1JrDRRrgvL2FbdDFMyJNTOGhgJT75gWgPMdYfceS7IAuUwIkz52xm59Lpp30Dt7SQAuVM6T+tcC2j6M6Z20lLhHy0EDVO6yaF3Z2PAwlgSPP0LtbE5DBlG1x7sd8F+do+3qXEt/kAe6CStY+Omd1mVxkoIT7kKJaeIzJbkRH+MeH07BYHtWAvljCJJsAv8+VFUA/ikeVBLgjb+OZpVGVbCG4tbcj5jEIEBA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 149.199.60.83) smtp.rcpttodomain=linaro.org smtp.mailfrom=xilinx.com; dmarc=bestguesspass action=none header.from=xilinx.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=xilinx.onmicrosoft.com; s=selector2-xilinx-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=DJ1oMz9Yd1FhsQB2SzC6dQsxsGM6koBg2IizX+ZpOJI=; b=LN/AKvLgtBtIp/BfVLSha29l9mYlghXowSJawhi0CUD3AriuTGOPmxXcNuOl+DnINKSnnPZrzvyPE+JTB4psjU95BI3sluMOFIl6ZCW1aNzN81HGowL1Dpu4r/Ka4wV3hrku4bsj+Px3Wq1qzqcJd5eg3pb8MMZjAwWao3EAj38= Received: from BN7PR02CA0020.namprd02.prod.outlook.com (2603:10b6:408:20::33) by DM5PR02MB2489.namprd02.prod.outlook.com (2603:10b6:3:47::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2623.9; Wed, 8 Jan 2020 23:54:47 +0000 Received: from SN1NAM02FT011.eop-nam02.prod.protection.outlook.com (2a01:111:f400:7e44::205) by BN7PR02CA0020.outlook.office365.com (2603:10b6:408:20::33) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2602.12 via Frontend Transport; Wed, 8 Jan 2020 23:54:47 +0000 Authentication-Results: spf=pass (sender IP is 149.199.60.83) smtp.mailfrom=xilinx.com; linaro.org; dkim=none (message not signed) header.d=none;linaro.org; dmarc=bestguesspass action=none header.from=xilinx.com; Received-SPF: Pass (protection.outlook.com: domain of xilinx.com designates 149.199.60.83 as permitted sender) receiver=protection.outlook.com; client-ip=149.199.60.83; helo=xsj-pvapsmtpgw01; Received: from xsj-pvapsmtpgw01 (149.199.60.83) by SN1NAM02FT011.mail.protection.outlook.com (10.152.72.82) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.20.2623.9 via Frontend Transport; Wed, 8 Jan 2020 23:54:47 +0000 Received: from unknown-38-66.xilinx.com ([149.199.38.66] helo=xsj-pvapsmtp01) by xsj-pvapsmtpgw01 with esmtp (Exim 4.63) (envelope-from ) id 1ipL9z-0003pu-03; Wed, 08 Jan 2020 15:54:47 -0800 Received: from [127.0.0.1] (helo=localhost) by xsj-pvapsmtp01 with smtp (Exim 4.63) (envelope-from ) id 1ipL9t-0002BN-SE; Wed, 08 Jan 2020 15:54:41 -0800 Received: from [172.19.2.91] (helo=xsjjollys50.xilinx.com) by xsj-pvapsmtp01 with esmtp (Exim 4.63) (envelope-from ) id 1ipL9l-0002A4-L4; Wed, 08 Jan 2020 15:54:33 -0800 From: Jolly Shah To: ard.biesheuvel@linaro.org, mingo@kernel.org, gregkh@linuxfoundation.org, matt@codeblueprint.co.uk, sudeep.holla@arm.com, hkallweit1@gmail.com, keescook@chromium.org, dmitry.torokhov@gmail.com, michal.simek@xilinx.com Subject: [PATCH v2 2/4] firmware: xilinx: Add system shutdown API interface Date: Wed, 8 Jan 2020 15:54:21 -0800 Message-Id: <1578527663-10243-3-git-send-email-jolly.shah@xilinx.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1578527663-10243-1-git-send-email-jolly.shah@xilinx.com> References: <1578527663-10243-1-git-send-email-jolly.shah@xilinx.com> X-TM-AS-Product-Ver: IMSS-7.1.0.1224-8.2.0.1013-23620.005 X-TM-AS-User-Approved-Sender: Yes;Yes X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:149.199.60.83; IPV:; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(4636009)(396003)(376002)(136003)(346002)(39860400002)(189003)(199004)(426003)(356004)(336012)(44832011)(36756003)(186003)(81156014)(26005)(7416002)(6666004)(54906003)(7696005)(2616005)(316002)(5660300002)(107886003)(8936002)(8676002)(4326008)(6636002)(81166006)(9786002)(70586007)(70206006)(2906002)(478600001); DIR:OUT; SFP:1101; SCL:1; SRVR:DM5PR02MB2489; H:xsj-pvapsmtpgw01; FPR:; SPF:Pass; LANG:en; PTR:unknown-60-83.xilinx.com; MX:1; A:1; MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: f5035743-d7a5-4d62-be93-08d794962485 X-MS-TrafficTypeDiagnostic: DM5PR02MB2489: X-Microsoft-Antispam-PRVS: X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply X-MS-Oob-TLC-OOBClassifiers: OLM:556; X-Forefront-PRVS: 02760F0D1C X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: av4E1OozbFgyZmkWgzmzLNkhknZbzNgCJn3K7bLrWT4hDMrFiAy3Ax+M3DiTxkHAkk5zfaSjaEIqD1rahND6WJBSFlKH+ZyFipkJY/3iNS4ccseZ1KL3gOcxOikSlL6L8XMiN0KoadVCGhIuqjwDJ+7uo1xPt6dHRw1kyKnsfD3z+dg/7q624av7cibFkMGOYIYtsmFyWHf96Y7lV1hlMNVNDR34Yn8Uh0qH3L4Ywn08NvsLzHiz103k7jxfGQZoapOoA0w7ir0IOyqWla92GM8NySgezl/RKExDwkoz7lvJ+UeDE9YMjo4qdyHuUjU1+6VTThCb7qQobhByelmgMDv/bovG+t2fSICPiDpgkmzeEUiNdemR+yoT7OrarNwAFsgaMOrT0hHa1ksen8NOi64/rcsCcPRdzCWJrBnmmuyIuNWZGx8k46sWwpt0WERX X-OriginatorOrg: xilinx.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Jan 2020 23:54:47.3833 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: f5035743-d7a5-4d62-be93-08d794962485 X-MS-Exchange-CrossTenant-Id: 657af505-d5df-48d0-8300-c31994686c5c X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=657af505-d5df-48d0-8300-c31994686c5c; Ip=[149.199.60.83]; Helo=[xsj-pvapsmtpgw01] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR02MB2489 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200108_155452_591319_F0C01C8A X-CRM114-Status: GOOD ( 12.61 ) X-Spam-Score: -0.0 (/) X-Spam-Report: SpamAssassin version 3.4.2 on bombadil.infradead.org summary: Content analysis details: (-0.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [40.107.76.80 listed in list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record -0.0 SPF_HELO_PASS SPF: HELO matches SPF record 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Rajan Vaja , rajanv@xilinx.com, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Jolly Shah Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org From: Rajan Vaja Add system shutdown API interface which asks firmware to perform system shutdown/restart. Signed-off-by: Rajan Vaja Signed-off-by: Michal Simek Signed-off-by: Jolly Shah --- Changes in v2: - Updated Signed-off-by sequence. --- drivers/firmware/xilinx/zynqmp.c | 14 ++++++++++++++ include/linux/firmware/xlnx-zynqmp.h | 4 +++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/drivers/firmware/xilinx/zynqmp.c b/drivers/firmware/xilinx/zynqmp.c index 4c1117d..0f90793 100644 --- a/drivers/firmware/xilinx/zynqmp.c +++ b/drivers/firmware/xilinx/zynqmp.c @@ -668,6 +668,19 @@ static int zynqmp_pm_set_requirement(const u32 node, const u32 capabilities, qos, ack, NULL); } +/** + * zynqmp_pm_system_shutdown - PM call to request a system shutdown or restart + * @type: Shutdown or restart? 0 for shutdown, 1 for restart + * @subtype: Specifies which system should be restarted or shut down + * + * Return: Returns status, either success or error+reason + */ +static int zynqmp_pm_system_shutdown(const u32 type, const u32 subtype) +{ + return zynqmp_pm_invoke_fn(PM_SYSTEM_SHUTDOWN, type, subtype, + 0, 0, NULL); +} + static const struct zynqmp_eemi_ops eemi_ops = { .get_api_version = zynqmp_pm_get_api_version, .get_chipid = zynqmp_pm_get_chipid, @@ -691,6 +704,7 @@ static const struct zynqmp_eemi_ops eemi_ops = { .set_requirement = zynqmp_pm_set_requirement, .fpga_load = zynqmp_pm_fpga_load, .fpga_get_status = zynqmp_pm_fpga_get_status, + .system_shutdown = zynqmp_pm_system_shutdown, }; /** diff --git a/include/linux/firmware/xlnx-zynqmp.h b/include/linux/firmware/xlnx-zynqmp.h index 534814e..1fd246c 100644 --- a/include/linux/firmware/xlnx-zynqmp.h +++ b/include/linux/firmware/xlnx-zynqmp.h @@ -62,7 +62,8 @@ enum pm_api_id { PM_GET_API_VERSION = 1, - PM_REQUEST_NODE = 13, + PM_SYSTEM_SHUTDOWN = 12, + PM_REQUEST_NODE, PM_RELEASE_NODE, PM_SET_REQUIREMENT, PM_RESET_ASSERT = 17, @@ -314,6 +315,7 @@ struct zynqmp_eemi_ops { const u32 capabilities, const u32 qos, const enum zynqmp_pm_request_ack ack); + int (*system_shutdown)(const u32 type, const u32 subtype); }; int zynqmp_pm_invoke_fn(u32 pm_api_id, u32 arg0, u32 arg1, From patchwork Wed Jan 8 23:54:22 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jolly Shah X-Patchwork-Id: 11324893 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 5669B92A for ; Wed, 8 Jan 2020 23:56:20 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 3176F206DB for ; Wed, 8 Jan 2020 23:56:20 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="EXTqdkED"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=xilinx.onmicrosoft.com header.i=@xilinx.onmicrosoft.com header.b="puLfYWiq" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 3176F206DB Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=xilinx.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=Apmdzyx0RHVWlJIHjAptb9hjCZHGt5hHx8glApqhcKE=; b=EXTqdkEDlbwcor PdDr1WXn6XOvHLPxqS8+sI6uUA46abzWos+HKMZhuKy9/NvH4PkJKftBLOdTovDb0ofrkWJ14dqDf SJOxtOK5fbvKEtEwQlUCmt0G2Phr+snNLK6c3/Vk3B+L7cXtas9dIeVJC27H3MMv1lFe1UxcN5pyJ 95E32J+63E2Yh9azqpxyHJuVtA8mCAud1loWba1EFH5esvnwyY31L/FZJHcIYOAcEsf8DIKu8FZ1W HUbj1FpQGfAkfxqyIZh2lugFRlzgkE5+vvIR88Zi0OaX0d3jMWOBo/d+kbBUdwtVaGJhpSVQgq8Et n9XaXPE8z2kcO+5r9r2A==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1ipLBT-0003af-Me; Wed, 08 Jan 2020 23:56:19 +0000 Received: from mail-dm6nam10on2067.outbound.protection.outlook.com ([40.107.93.67] helo=NAM10-DM6-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1ipLA4-0000i9-Mr for linux-arm-kernel@lists.infradead.org; Wed, 08 Jan 2020 23:54:56 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ZRBAhUo1qhVj9M6tHEG4A8f3ROgQLLhVaQOSntlkkPXC6cwYtJ4Q0cneHY1Gp7L9DrAOSfkFhpnXN4EJwIrPPqUhZytSAWnJ7kU6OYZOHwOvnnF/wR8ZKoJPP4QMrejAAdVmkYj+HtNOm+NQXV+344TKMjg+IypNYls7H69VWBUGg0wJms0U+tY7KJK4eNDHyTyJlMuTSuXPfVJm7XzGxDG0cAqC++3zbpHqw22f2B2XmOE4d17buaqrPaHGgdUkIeIkdTWtFMcdFnRdjOHi1oC5O6S2dA8OygUUqG6YD9Su5otgDI7IBctH9JDpYk6Ml4LXPHoV4xwjeL9KAOrQzg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=T/PG+T5WqACzDdqllt1aXAxjkPapkb+Y9Hcb0eTfFgM=; b=UbIvsN/8hSOEuTrIdbGci6t8xtpz6e/Te4r2zJPUuVPYgOF6pIXxmXo5zsnLsvwb/x6Mh7KmxudZdjkbGw1PPczpnydD030h6yw+qBdpeiTxDl2nws7F7bfyEsLFPrO/Wt3ZDFYmFYvFVzzSjfW0H43pFKcrYdE5Q/74Vco1JAIeMDNd/0Emw4T5WDFzJN/kVjLsDXJS4Tn2NRdZbcekP5aeoqI4QmwKpGz636es33GouP7y+O+wFqZUs19rIYZ50jC+ysmqkeaOoyWSSeFZXauFmpdWymlsRPv3VmADfpbeLAjOiJwpdH+7dB8x4TZfMk9iCY1iQSflznLYLVdtbQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 149.199.60.83) smtp.rcpttodomain=linaro.org smtp.mailfrom=xilinx.com; dmarc=bestguesspass action=none header.from=xilinx.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=xilinx.onmicrosoft.com; s=selector2-xilinx-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=T/PG+T5WqACzDdqllt1aXAxjkPapkb+Y9Hcb0eTfFgM=; b=puLfYWiq/YcPY0ItFUC3Kio2IQHYdxLv4JdM2mkBMAGr+kogigNwuG3eJH8PQ45uLzA8XxCfXfmCjcbNX1sd/9qkyBuTBSw/eIEvK5zIcY8+8YaXs2+UkQAWNhzdRvTPUw4m3vTnwUF8d5O5qco1yXzoX31PO62JF2496tUGLPI= Received: from SN4PR0201CA0019.namprd02.prod.outlook.com (2603:10b6:803:2b::29) by MN2PR02MB6704.namprd02.prod.outlook.com (2603:10b6:208:1d6::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2623.9; Wed, 8 Jan 2020 23:54:48 +0000 Received: from SN1NAM02FT030.eop-nam02.prod.protection.outlook.com (2a01:111:f400:7e44::208) by SN4PR0201CA0019.outlook.office365.com (2603:10b6:803:2b::29) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2602.12 via Frontend Transport; Wed, 8 Jan 2020 23:54:48 +0000 Authentication-Results: spf=pass (sender IP is 149.199.60.83) smtp.mailfrom=xilinx.com; linaro.org; dkim=none (message not signed) header.d=none;linaro.org; dmarc=bestguesspass action=none header.from=xilinx.com; Received-SPF: Pass (protection.outlook.com: domain of xilinx.com designates 149.199.60.83 as permitted sender) receiver=protection.outlook.com; client-ip=149.199.60.83; helo=xsj-pvapsmtpgw01; Received: from xsj-pvapsmtpgw01 (149.199.60.83) by SN1NAM02FT030.mail.protection.outlook.com (10.152.72.114) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.20.2623.9 via Frontend Transport; Wed, 8 Jan 2020 23:54:47 +0000 Received: from unknown-38-66.xilinx.com ([149.199.38.66] helo=xsj-pvapsmtp01) by xsj-pvapsmtpgw01 with esmtp (Exim 4.63) (envelope-from ) id 1ipL9z-0003px-Aa; Wed, 08 Jan 2020 15:54:47 -0800 Received: from [127.0.0.1] (helo=localhost) by xsj-pvapsmtp01 with smtp (Exim 4.63) (envelope-from ) id 1ipL9u-0002BN-6f; Wed, 08 Jan 2020 15:54:42 -0800 Received: from [172.19.2.91] (helo=xsjjollys50.xilinx.com) by xsj-pvapsmtp01 with esmtp (Exim 4.63) (envelope-from ) id 1ipL9l-0002A4-NM; Wed, 08 Jan 2020 15:54:33 -0800 From: Jolly Shah To: ard.biesheuvel@linaro.org, mingo@kernel.org, gregkh@linuxfoundation.org, matt@codeblueprint.co.uk, sudeep.holla@arm.com, hkallweit1@gmail.com, keescook@chromium.org, dmitry.torokhov@gmail.com, michal.simek@xilinx.com Subject: [PATCH v2 3/4] firmware: xilinx: Add sysfs to set shutdown scope Date: Wed, 8 Jan 2020 15:54:22 -0800 Message-Id: <1578527663-10243-4-git-send-email-jolly.shah@xilinx.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1578527663-10243-1-git-send-email-jolly.shah@xilinx.com> References: <1578527663-10243-1-git-send-email-jolly.shah@xilinx.com> X-TM-AS-Product-Ver: IMSS-7.1.0.1224-8.2.0.1013-23620.005 X-TM-AS-User-Approved-Sender: Yes;Yes X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:149.199.60.83; IPV:; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(4636009)(199004)(189003)(107886003)(356004)(70206006)(2906002)(70586007)(6636002)(6666004)(426003)(336012)(36756003)(4326008)(54906003)(2616005)(26005)(186003)(498600001)(44832011)(7696005)(81156014)(8676002)(81166006)(8936002)(7416002)(9786002)(5660300002); DIR:OUT; SFP:1101; SCL:1; SRVR:MN2PR02MB6704; H:xsj-pvapsmtpgw01; FPR:; SPF:Pass; LANG:en; PTR:unknown-60-83.xilinx.com; A:1; MX:1; MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 2e10b9da-a270-4d2f-ca1e-08d7949624c5 X-MS-TrafficTypeDiagnostic: MN2PR02MB6704: X-Microsoft-Antispam-PRVS: X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply X-MS-Oob-TLC-OOBClassifiers: OLM:949; X-Forefront-PRVS: 02760F0D1C X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: Sb+vyukIlH3HVXlycQsk//e0UxTBMqnffbxiJ/wY94BR9h0xYn6hmC+/qqnTjPVGug2kJ1BeVqedmlGd2Okg9e/idgO1OJOvajRMS7lETw/0TggElYirA5b85TpA0HNXIXWnpdzJQ0QfpCbjdGWVFOe1wjr+DRhp80ULE+kyQ4W89K3sfe6VcUbmzUhuSjjF1XLN+APl90HcL7Kw6nHbn4KZYfolIJJCniYCRlSyympJaEJnDpkQlUXtGi9I5zw2qIW5owQ32gsqT5tdEBNskAHGG1JpyMPqvOQa+Rr+0D67XGU+P14ONkPqzn/VNIyDyoGl1iyr7/b/Uo5pTuuHnZvLqplIJZFG7QiL/p9h50Hebc45bgxRtCr9fbXs+5h4ohlahtqW9a6j8Kg3/emJ3MDWNSdspeDGNHZZVx4WJ+FIzVk/48GEQNc9zUNQ8lOj X-OriginatorOrg: xilinx.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Jan 2020 23:54:47.7140 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 2e10b9da-a270-4d2f-ca1e-08d7949624c5 X-MS-Exchange-CrossTenant-Id: 657af505-d5df-48d0-8300-c31994686c5c X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=657af505-d5df-48d0-8300-c31994686c5c; Ip=[149.199.60.83]; Helo=[xsj-pvapsmtpgw01] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: MN2PR02MB6704 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200108_155452_802762_CF12B2AC X-CRM114-Status: GOOD ( 21.05 ) X-Spam-Score: -0.0 (/) X-Spam-Report: SpamAssassin version 3.4.2 on bombadil.infradead.org summary: Content analysis details: (-0.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [40.107.93.67 listed in list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record -0.0 SPF_HELO_PASS SPF: HELO matches SPF record 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Stefan Krsmanovic , Rajan Vaja , linux-kernel@vger.kernel.org, Jolly Shah , rajanv@xilinx.com, linux-arm-kernel@lists.infradead.org Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org From: Rajan Vaja The Linux shutdown functionality implemented via PSCI system_off does not include an option to set a scope, i.e. which parts of the system to shut down. This patch creates sysfs that allows to set the shutdown scope for the next shutdown request. When the next shutdown is performed, the platform specific portion of PSCI-system_off can use the chosen shutdown scope. Signed-off-by: Rajan Vaja Signed-off-by: Stefan Krsmanovic Signed-off-by: Michal Simek Signed-off-by: Jolly Shah --- Changes in v2: - Updated Linux kernel version in documentation. - Used DEVICE_ATTR_* and ATTRIBUTE_GROUPS macros. - Free Kobject structure in case of error. - Updated Signed-off-by sequence. --- Documentation/ABI/stable/sysfs-firmware-zynqmp | 32 +++++ drivers/firmware/xilinx/zynqmp.c | 155 +++++++++++++++++++++++++ include/linux/firmware/xlnx-zynqmp.h | 12 ++ 3 files changed, 199 insertions(+) diff --git a/Documentation/ABI/stable/sysfs-firmware-zynqmp b/Documentation/ABI/stable/sysfs-firmware-zynqmp index cffa2fc..f41e9c5 100644 --- a/Documentation/ABI/stable/sysfs-firmware-zynqmp +++ b/Documentation/ABI/stable/sysfs-firmware-zynqmp @@ -48,3 +48,35 @@ Description: # echo 0xFFFFFFFF 0x1234ABCD > /sys/firmware/zynqmp/pggs0 Users: Xilinx + +What: /sys/firmware/zynqmp/shutdown_scope +Date: February 2018 +KernelVersion: 5.5 +Contact: "Jolly Shah" +Description: + This sysfs interface allows to set the shutdown scope for the + next shutdown request. When the next shutdown is performed, the + platform specific portion of PSCI-system_off can use the chosen + shutdown scope. + + Following are available shutdown scopes(subtypes): + + subsystem: Only the APU along with all of its peripherals + not used by other processing units will be + shut down. This may result in the FPD power + domain being shut down provided that no other + processing unit uses FPD peripherals or DRAM. + ps_only: The complete PS will be shut down, including the + RPU, PMU, etc. Only the PL domain (FPGA) + remains untouched. + system: The complete system/device is shut down. + + Usage: + # cat /sys/firmware/zynqmp/shutdown_scope + # echo > /sys/firmware/zynqmp/shutdown_scope + + Example: + # cat /sys/firmware/zynqmp/shutdown_scope + # echo "subsystem" > /sys/firmware/zynqmp/shutdown_scope + +Users: Xilinx diff --git a/drivers/firmware/xilinx/zynqmp.c b/drivers/firmware/xilinx/zynqmp.c index 0f90793..ef7d107 100644 --- a/drivers/firmware/xilinx/zynqmp.c +++ b/drivers/firmware/xilinx/zynqmp.c @@ -722,6 +722,152 @@ const struct zynqmp_eemi_ops *zynqmp_pm_get_eemi_ops(void) } EXPORT_SYMBOL_GPL(zynqmp_pm_get_eemi_ops); +/** + * struct zynqmp_pm_shutdown_scope - Struct for shutdown scope + * @subtype: Shutdown subtype + * @name: Matching string for scope argument + * + * This struct encapsulates mapping between shutdown scope ID and string. + */ +struct zynqmp_pm_shutdown_scope { + const enum zynqmp_pm_shutdown_subtype subtype; + const char *name; +}; + +static struct zynqmp_pm_shutdown_scope shutdown_scopes[] = { + [ZYNQMP_PM_SHUTDOWN_SUBTYPE_SUBSYSTEM] = { + .subtype = ZYNQMP_PM_SHUTDOWN_SUBTYPE_SUBSYSTEM, + .name = "subsystem", + }, + [ZYNQMP_PM_SHUTDOWN_SUBTYPE_PS_ONLY] = { + .subtype = ZYNQMP_PM_SHUTDOWN_SUBTYPE_PS_ONLY, + .name = "ps_only", + }, + [ZYNQMP_PM_SHUTDOWN_SUBTYPE_SYSTEM] = { + .subtype = ZYNQMP_PM_SHUTDOWN_SUBTYPE_SYSTEM, + .name = "system", + }, +}; + +static struct zynqmp_pm_shutdown_scope *selected_scope = + &shutdown_scopes[ZYNQMP_PM_SHUTDOWN_SUBTYPE_SYSTEM]; + +/** + * zynqmp_pm_is_shutdown_scope_valid - Check if shutdown scope string is valid + * @scope_string: Shutdown scope string + * + * Return: Return pointer to matching shutdown scope struct from + * array of available options in system if string is valid, + * otherwise returns NULL. + */ +static struct zynqmp_pm_shutdown_scope* + zynqmp_pm_is_shutdown_scope_valid(const char *scope_string) +{ + int count; + + for (count = 0; count < ARRAY_SIZE(shutdown_scopes); count++) + if (sysfs_streq(scope_string, shutdown_scopes[count].name)) + return &shutdown_scopes[count]; + + return NULL; +} + +/** + * shutdown_scope_show - Show shutdown_scope sysfs attribute + * @device: Device structure + * @attr: Device attribute structure + * @buf: Requested available shutdown_scope attributes string + * + * User-space interface for viewing the available scope options for system + * shutdown. Scope option for next shutdown call is marked with []. + * + * Usage: cat /sys/firmware/zynqmp/shutdown_scope + * + * Return: Number of bytes printed into the buffer. + */ +static ssize_t shutdown_scope_show(struct device *device, + struct device_attribute *attr, + char *buf) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(shutdown_scopes); i++) { + if (&shutdown_scopes[i] == selected_scope) { + strcat(buf, "["); + strcat(buf, shutdown_scopes[i].name); + strcat(buf, "]"); + } else { + strcat(buf, shutdown_scopes[i].name); + } + strcat(buf, " "); + } + strcat(buf, "\n"); + + return strlen(buf); +} + +/** + * shutdown_scope_store - Store shutdown_scope sysfs attribute + * @device: Device structure + * @attr: Device attribute structure + * @buf: User entered shutdown_scope attribute string + * @count: Buffer size + * + * User-space interface for setting the scope for the next system shutdown. + * Usage: echo > /sys/firmware/zynqmp/shutdown_scope + * + * The Linux shutdown functionality implemented via PSCI system_off does not + * include an option to set a scope, i.e. which parts of the system to shut + * down. + * + * This API function allows to set the shutdown scope for the next shutdown + * request by passing it to the ATF running in EL3. When the next shutdown + * is performed, the platform specific portion of PSCI-system_off can use + * the chosen shutdown scope. + * + * subsystem: Only the APU along with all of its peripherals not used by other + * processing units will be shut down. This may result in the FPD + * power domain being shut down provided that no other processing + * unit uses FPD peripherals or DRAM. + * ps_only: The complete PS will be shut down, including the RPU, PMU, etc. + * Only the PL domain (FPGA) remains untouched. + * system: The complete system/device is shut down. + * + * Return: count argument if request succeeds, the corresponding error + * code otherwise + */ +static ssize_t shutdown_scope_store(struct device *device, + struct device_attribute *attr, + const char *buf, size_t count) +{ + int ret; + struct zynqmp_pm_shutdown_scope *scope; + + scope = zynqmp_pm_is_shutdown_scope_valid(buf); + if (!scope) + return -EINVAL; + + ret = zynqmp_pm_system_shutdown(ZYNQMP_PM_SHUTDOWN_TYPE_SETSCOPE_ONLY, + scope->subtype); + if (ret) { + pr_err("unable to set shutdown scope %s\n", buf); + return ret; + } + + selected_scope = scope; + + return count; +} + +static DEVICE_ATTR_RW(shutdown_scope); + +static struct attribute *zynqmp_attrs[] = { + &dev_attr_shutdown_scope.attr, + NULL, +}; + +ATTRIBUTE_GROUPS(zynqmp); + static int zynqmp_pm_sysfs_init(void) { struct kobject *zynqmp_kobj; @@ -733,6 +879,14 @@ static int zynqmp_pm_sysfs_init(void) return -ENOMEM; } + ret = sysfs_create_group(zynqmp_kobj, zynqmp_groups[0]); + if (ret) { + kobject_put(zynqmp_kobj); + pr_err("%s() sysfs creation fail with error %d\n", + __func__, ret); + goto err; + } + ret = zynqmp_pm_ggs_init(zynqmp_kobj); if (ret) { kobject_put(zynqmp_kobj); @@ -740,6 +894,7 @@ static int zynqmp_pm_sysfs_init(void) __func__, ret); goto err; } + err: return ret; } diff --git a/include/linux/firmware/xlnx-zynqmp.h b/include/linux/firmware/xlnx-zynqmp.h index 1fd246c..e4f83c6 100644 --- a/include/linux/firmware/xlnx-zynqmp.h +++ b/include/linux/firmware/xlnx-zynqmp.h @@ -271,6 +271,18 @@ enum tap_delay_type { PM_TAPDELAY_OUTPUT, }; +enum zynqmp_pm_shutdown_type { + ZYNQMP_PM_SHUTDOWN_TYPE_SHUTDOWN, + ZYNQMP_PM_SHUTDOWN_TYPE_RESET, + ZYNQMP_PM_SHUTDOWN_TYPE_SETSCOPE_ONLY, +}; + +enum zynqmp_pm_shutdown_subtype { + ZYNQMP_PM_SHUTDOWN_SUBTYPE_SUBSYSTEM, + ZYNQMP_PM_SHUTDOWN_SUBTYPE_PS_ONLY, + ZYNQMP_PM_SHUTDOWN_SUBTYPE_SYSTEM, +}; + /** * struct zynqmp_pm_query_data - PM query data * @qid: query ID From patchwork Wed Jan 8 23:54:23 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jolly Shah X-Patchwork-Id: 11324889 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 4274B921 for ; Wed, 8 Jan 2020 23:55:59 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 19393206DB for ; Wed, 8 Jan 2020 23:55:59 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="Bw1wBcQ1"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=xilinx.onmicrosoft.com header.i=@xilinx.onmicrosoft.com header.b="LDM7vwp3" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 19393206DB Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=xilinx.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=V1UdQR/meUj6K42nfHeJEinOr2OVzMemo9NTUkNBmVw=; b=Bw1wBcQ1LT5f8C +KsrwFqCsve8S8gEdkn9MJYn7Zvmf7B48hKupVjPCK8Ey5c++lyr6GAThNABYWJRaI3mJpQDF9nv4 rT9BMwHhK39ulfnNfQtrZmF6lntJUGTdNo7x0W73qRvzji3T1SdzEQVrODxiLRVoj42kKhTmeRn8b DfQCEYmKwiZe1r/vIVA0wSBst8VB2kzAwIO1pn//2sAHMjm6iXOchnD6iUWDeGv8RSOWPgMiB++FN p4a0Mvy677vlw7jduDKmYVKLA/jKrG0mYC8dGys85PYZ1fv+3GRe84vxtM8v65k11OMh2BSfOvLr+ da2KFsRY7HP7wKAoi8pg==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1ipLB5-0003FU-Qt; Wed, 08 Jan 2020 23:55:55 +0000 Received: from mail-dm6nam11on2062d.outbound.protection.outlook.com ([2a01:111:f400:7eaa::62d] helo=NAM11-DM6-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1ipLA4-0000eg-TQ for linux-arm-kernel@lists.infradead.org; Wed, 08 Jan 2020 23:54:55 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=OHiLoU0qtsJmjW3PlDE3SgGbnE9+OBqR7EdGOgHM9Wd3uuOH6IpgOKK31pJSxoYpVVzcAbz5IK8bDQFGk7f2U7ea9cf4EH0FYueMQnHd7ZNv/4oQvxS6ulZa4XXPkyfCHInxJSGhPr6W4CNsKIiTtbqkxIlzg51g0i+nVxgdp32DIaBYQXdDFW/mPVtWYyylFXCDhHmBtQKV8RVl1NQsm5Boazg25UkSAZxaf3FNJq/WH+EB6hhFCeCb3YV8QH06JPSjz6i0O5lfF0Vy/yC3OAyCvRdO9DTqgGJwteo5gVXOUYCf2KoAOaXsowNLM50PW/qJWfYtmYtXgBv335+dCg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=5q7nHJuL7rNZP14poX4fUSh8K5hU0KIYUscM0OPdCe8=; b=awrwMQiHnDOy8oPJfLcT9/ISLw0vLPiJl2F1XepjgLwDR+L3cCF44fzXAFZJXFj9swX1PyMHVH+fibhOu3Sw3qJGLqJA4EnSj86Up0P5LNTLo/zCwhhUX+QvEV//IhZBWs6t588g1opJC1Z4oXs8sCmXaM0TpwifTBQg9S+O+wR5DZGbeD657aVx1bKyFIYXPSLNQYyklvZ5yIgnITn8ASHlkVeLz/2RO5lwWx82iAyuZiWhspmU3O164rWvX6iO0rZMzbnQ9WbDtJJdzwFWiid4B0Pl+ZwCEQRc+DxBsf5fHyo6xCKOy3iU0Ab6lPGFPrkW7fYCG/8oCE65xCRvqw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 149.199.60.83) smtp.rcpttodomain=linaro.org smtp.mailfrom=xilinx.com; dmarc=bestguesspass action=none header.from=xilinx.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=xilinx.onmicrosoft.com; s=selector2-xilinx-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=5q7nHJuL7rNZP14poX4fUSh8K5hU0KIYUscM0OPdCe8=; b=LDM7vwp3wz4QllBJMBFT8e8pAOKRvGAZdaxyGfeymXqfjQpiy6CFEK3pY7MMqU9Hl3sfd5zNPgC7RjDQAUfOt0t0P/sRXpEFE4S/hfqD4y6OI0XcqjHI1jlPr3E/K47Mf+aLVte1Oy6Dx87rqD4gJL8vuumNfEf89h/89V9r5uc= Received: from SN4PR0201CA0033.namprd02.prod.outlook.com (2603:10b6:803:2e::19) by CY4PR02MB2230.namprd02.prod.outlook.com (2603:10b6:903:f::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2602.10; Wed, 8 Jan 2020 23:54:47 +0000 Received: from SN1NAM02FT020.eop-nam02.prod.protection.outlook.com (2a01:111:f400:7e44::205) by SN4PR0201CA0033.outlook.office365.com (2603:10b6:803:2e::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2623.8 via Frontend Transport; Wed, 8 Jan 2020 23:54:47 +0000 Authentication-Results: spf=pass (sender IP is 149.199.60.83) smtp.mailfrom=xilinx.com; linaro.org; dkim=none (message not signed) header.d=none;linaro.org; dmarc=bestguesspass action=none header.from=xilinx.com; Received-SPF: Pass (protection.outlook.com: domain of xilinx.com designates 149.199.60.83 as permitted sender) receiver=protection.outlook.com; client-ip=149.199.60.83; helo=xsj-pvapsmtpgw01; Received: from xsj-pvapsmtpgw01 (149.199.60.83) by SN1NAM02FT020.mail.protection.outlook.com (10.152.72.139) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.20.2623.9 via Frontend Transport; Wed, 8 Jan 2020 23:54:47 +0000 Received: from unknown-38-66.xilinx.com ([149.199.38.66] helo=xsj-pvapsmtp01) by xsj-pvapsmtpgw01 with esmtp (Exim 4.63) (envelope-from ) id 1ipL9z-0003pv-3Q; Wed, 08 Jan 2020 15:54:47 -0800 Received: from [127.0.0.1] (helo=localhost) by xsj-pvapsmtp01 with smtp (Exim 4.63) (envelope-from ) id 1ipL9t-0002BN-VM; Wed, 08 Jan 2020 15:54:42 -0800 Received: from [172.19.2.91] (helo=xsjjollys50.xilinx.com) by xsj-pvapsmtp01 with esmtp (Exim 4.63) (envelope-from ) id 1ipL9l-0002A4-Pp; Wed, 08 Jan 2020 15:54:33 -0800 From: Jolly Shah To: ard.biesheuvel@linaro.org, mingo@kernel.org, gregkh@linuxfoundation.org, matt@codeblueprint.co.uk, sudeep.holla@arm.com, hkallweit1@gmail.com, keescook@chromium.org, dmitry.torokhov@gmail.com, michal.simek@xilinx.com Subject: [PATCH v2 4/4] firmware: xilinx: Add sysfs and IOCTL to set boot health status Date: Wed, 8 Jan 2020 15:54:23 -0800 Message-Id: <1578527663-10243-5-git-send-email-jolly.shah@xilinx.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1578527663-10243-1-git-send-email-jolly.shah@xilinx.com> References: <1578527663-10243-1-git-send-email-jolly.shah@xilinx.com> X-TM-AS-Product-Ver: IMSS-7.1.0.1224-8.2.0.1013-23620.005 X-TM-AS-User-Approved-Sender: Yes;Yes X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:149.199.60.83; IPV:; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(4636009)(396003)(376002)(136003)(39860400002)(346002)(189003)(199004)(7696005)(4326008)(186003)(26005)(2616005)(2906002)(478600001)(6636002)(44832011)(426003)(5660300002)(356004)(81166006)(6666004)(81156014)(8676002)(54906003)(8936002)(70586007)(336012)(36756003)(7416002)(9786002)(70206006)(316002)(107886003); DIR:OUT; SFP:1101; SCL:1; SRVR:CY4PR02MB2230; H:xsj-pvapsmtpgw01; FPR:; SPF:Pass; LANG:en; PTR:unknown-60-83.xilinx.com; MX:1; A:1; MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 106cecc2-cc34-41ff-f299-08d794962499 X-MS-TrafficTypeDiagnostic: CY4PR02MB2230: X-Microsoft-Antispam-PRVS: X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply X-MS-Oob-TLC-OOBClassifiers: OLM:5236; X-Forefront-PRVS: 02760F0D1C X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 5WB9jo9cuXkMgNf/BR/KFLXlbFv4TgIdUTMEb+OhcRbvwZWIusLzKyo5cbkWx8KOPL31PHGyHu4r7hpybM+IYT3D7P4t/xZL+P4Q0kVTDylPK5fMUtTssVBwJJvFSH6XsnCiXa7qRi+FIF6vfQz/sHwiEM5mCPt0PHMeji72Z92hwvmo927eLrZKjbicRzQjKO6jmKOY2e52Lli9roYA0E8lIAtkCFVwKTq1w285tZ76G4pwHgzaSU9QpAWSC1akOglh9zzGWmdotTaGdgMlYTW81KSHeNir0rASLUaTtBdQeOm74QTV5+hINvPDTUBqDuw3vQuQTs917CHKv8nURD0ds3v6MqMCDHaL8J65XaaakF9vFXc2ntEsmR3rAf7Qq9jKXHOcSA6ZHaJnBFimRzwQEipZqswjbEZY9925JTi5DkSEEsSl5AEYIDNwTLDW X-OriginatorOrg: xilinx.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Jan 2020 23:54:47.4807 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 106cecc2-cc34-41ff-f299-08d794962499 X-MS-Exchange-CrossTenant-Id: 657af505-d5df-48d0-8300-c31994686c5c X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=657af505-d5df-48d0-8300-c31994686c5c; Ip=[149.199.60.83]; Helo=[xsj-pvapsmtpgw01] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY4PR02MB2230 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200108_155452_962773_94250168 X-CRM114-Status: GOOD ( 16.46 ) X-Spam-Score: -0.0 (/) X-Spam-Report: SpamAssassin version 3.4.2 on bombadil.infradead.org summary: Content analysis details: (-0.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 SPF_PASS SPF: sender matches SPF record -0.0 SPF_HELO_PASS SPF: HELO matches SPF record 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Rajan Vaja , rajanv@xilinx.com, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Jolly Shah Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org From: Rajan Vaja Add sysfs interface to set boot health status from user space. Add IOCTL ID used by this interface to communicate with firmware. If PMUFW is compiled with CHECK_HEALTHY_BOOT, it will check the healthy bit on FPD WDT expiration. If healthy bit is set by a user application running in Linux, PMUFW will do APU only restart. If healthy bit is not set during FPD WDT expiration, PMUFW will do system restart. Signed-off-by: Rajan Vaja Signed-off-by: Michal Simek Signed-off-by: Jolly Shah --- Changes in v2: - Updated Linux kernel version in documentation. - Used DEVICE_ATTR_* and ATTRIBUTE_GROUPS macros. - Updated Signed-off-by sequence. --- Documentation/ABI/stable/sysfs-firmware-zynqmp | 21 +++++++++++++ drivers/firmware/xilinx/zynqmp.c | 41 ++++++++++++++++++++++++++ include/linux/firmware/xlnx-zynqmp.h | 2 ++ 3 files changed, 64 insertions(+) diff --git a/Documentation/ABI/stable/sysfs-firmware-zynqmp b/Documentation/ABI/stable/sysfs-firmware-zynqmp index f41e9c5..3f44a3c 100644 --- a/Documentation/ABI/stable/sysfs-firmware-zynqmp +++ b/Documentation/ABI/stable/sysfs-firmware-zynqmp @@ -80,3 +80,24 @@ Description: # echo "subsystem" > /sys/firmware/zynqmp/shutdown_scope Users: Xilinx + +What: /sys/firmware/zynqmp/health_status +Date: April 2018 +KernelVersion: 5.5 +Contact: "Rajan Vaja" +Description: + This sysfs interface allows to set the health status. If PMUFW + is compiled with CHECK_HEALTHY_BOOT, it will check the healthy + bit on FPD WDT expiration. If healthy bit is set by a user + application running in Linux, PMUFW will do APU only restart. If + healthy bit is not set during FPD WDT expiration, PMUFW will do + system restart. + + Usage: + Set healthy bit + # echo 1 > /sys/firmware/zynqmp/health_status + + Unset healthy bit + # echo 0 > /sys/firmware/zynqmp/health_status + +Users: Xilinx diff --git a/drivers/firmware/xilinx/zynqmp.c b/drivers/firmware/xilinx/zynqmp.c index ef7d107..2a77c90 100644 --- a/drivers/firmware/xilinx/zynqmp.c +++ b/drivers/firmware/xilinx/zynqmp.c @@ -477,6 +477,7 @@ static inline int zynqmp_is_valid_ioctl(u32 ioctl_id) case IOCTL_READ_GGS: case IOCTL_WRITE_PGGS: case IOCTL_READ_PGGS: + case IOCTL_SET_BOOT_HEALTH_STATUS: return 1; default: return 0; @@ -861,8 +862,48 @@ static ssize_t shutdown_scope_store(struct device *device, static DEVICE_ATTR_RW(shutdown_scope); +/** + * health_status_store - Store health_status sysfs attribute + * @device: Device structure + * @attr: Device attribute structure + * @buf: User entered health_status attribute string + * @count: Buffer size + * + * User-space interface for setting the boot health status. + * Usage: echo > /sys/firmware/zynqmp/health_status + * + * Value: + * 1 - Set healthy bit to 1 + * 0 - Unset healthy bit + * + * Return: count argument if request succeeds, the corresponding error + * code otherwise + */ +static ssize_t health_status_store(struct device *device, + struct device_attribute *attr, + const char *buf, size_t count) +{ + int ret; + unsigned int value; + + ret = kstrtouint(buf, 10, &value); + if (ret) + return ret; + + ret = zynqmp_pm_ioctl(0, IOCTL_SET_BOOT_HEALTH_STATUS, value, 0, NULL); + if (ret) { + pr_err("unable to set healthy bit value to %u\n", value); + return ret; + } + + return count; +} + +static DEVICE_ATTR_WO(health_status); + static struct attribute *zynqmp_attrs[] = { &dev_attr_shutdown_scope.attr, + &dev_attr_health_status.attr, NULL, }; diff --git a/include/linux/firmware/xlnx-zynqmp.h b/include/linux/firmware/xlnx-zynqmp.h index e4f83c6..0554054 100644 --- a/include/linux/firmware/xlnx-zynqmp.h +++ b/include/linux/firmware/xlnx-zynqmp.h @@ -106,6 +106,8 @@ enum pm_ioctl_id { IOCTL_READ_GGS, IOCTL_WRITE_PGGS, IOCTL_READ_PGGS, + /* Set healthy bit value */ + IOCTL_SET_BOOT_HEALTH_STATUS = 17, }; enum pm_query_id {