From patchwork Mon Aug 20 21:34:55 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Evan Green X-Patchwork-Id: 10570811 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 297821390 for ; Mon, 20 Aug 2018 21:35:11 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1808829AE0 for ; Mon, 20 Aug 2018 21:35:11 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 09CEC29B55; Mon, 20 Aug 2018 21:35:11 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6499929AE0 for ; Mon, 20 Aug 2018 21:35:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726682AbeHUAwV (ORCPT ); Mon, 20 Aug 2018 20:52:21 -0400 Received: from mail-pf1-f196.google.com ([209.85.210.196]:38265 "EHLO mail-pf1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726605AbeHUAwV (ORCPT ); Mon, 20 Aug 2018 20:52:21 -0400 Received: by mail-pf1-f196.google.com with SMTP id x17-v6so7412147pfh.5 for ; Mon, 20 Aug 2018 14:35:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id; bh=7mCZOOPy7OmxeEVwiIf6hbaiSaHyxkuwgNP8dwHl4x8=; b=Q6e011VbutdL7HJBk9EvrWsq59Bu6ptTScOI/upBK/rjm4QpFvO8kjeYQ6I6Zo5ao2 IK5Io7FIdrpFsEkoIE4K8hmQZKFpsVg6qUXhd7tJSvOS2qV9t8Rmn67o42j28pYMYswV NGgytzNJhA39Q+AhnhOZNwv/YQfORP6OncPQo= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=7mCZOOPy7OmxeEVwiIf6hbaiSaHyxkuwgNP8dwHl4x8=; b=BZVtrsnImkbpo8oH0PLGLNOto7PNEbURYP1XJwmyO/dHacRliOQGDsdul6zE6raHtp SfD43czhPU/v4T193IkfNuF7pV1cs7p5gTZnehYUxcolYi+Tct5FZvqdKFY/i5Yk/Nax 2arhwbZc4UEhp/b7QznLgC3jsBYwGe/IiYsRvQwpgqLkf6ow/6trZ1K4zOlvh272gTBi INsmrjLG9I1T9DEMs7IBz+MMUUBNwByMu72vL7PzXBQmTbZ8t6L9lJmOB3XX+rNA7Bxr UlECNYPrhch4NwLPtQFOrq9VtWr2CAu7VwHTL25vjS38zEtu/C6sWzQ2JbmFpOCk3R1T racg== X-Gm-Message-State: AOUpUlF1UGKH/REjiezDB5qswWDcM6lpwSlBc2fEO6pY6Y5nU3T0I6mx cRUDdCppjNt7oiEZdZSamXI1JQ== X-Google-Smtp-Source: AA+uWPwFf7RvMowtBSfvn0RpaB0kf+UcAZjRDqAAzOKKGc3qi3Ok9eQXKWuCS8UJQqSYXwGQYv5gpQ== X-Received: by 2002:a63:5b0f:: with SMTP id p15-v6mr6599803pgb.122.1534800904265; Mon, 20 Aug 2018 14:35:04 -0700 (PDT) Received: from evgreen2.mtv.corp.google.com ([2620:15c:202:201:e418:c825:76cf:5f64]) by smtp.gmail.com with ESMTPSA id b76-v6sm21200315pfj.184.2018.08.20.14.35.02 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 20 Aug 2018 14:35:03 -0700 (PDT) From: Evan Green To: Vinayak Holikatti , "James E.J. Bottomley" , "Martin K. Petersen" , Stanislav Nijnikov , Adrian Hunter , linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org Cc: Evan Green Subject: [PATCH] scsi: ufs: Make sysfs flags writable Date: Mon, 20 Aug 2018 14:34:55 -0700 Message-Id: <20180820213455.15092-1-evgreen@chromium.org> X-Mailer: git-send-email 2.16.4 Sender: linux-scsi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-scsi@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This change makes the UFS controller's sysfs flags writable. This will enable users to provision unprovisioned devices, and experiment with device features. Signed-off-by: Evan Green Acked-by: Adrian Hunter --- This is a follow-on patch to another patch [1] that makes the UFS attributes writable. [1] https://lore.kernel.org/patchwork/patch/972959/ Documentation/ABI/testing/sysfs-driver-ufs | 18 +++++++--- drivers/scsi/ufs/ufs-sysfs.c | 54 +++++++++++++++++++++++++----- 2 files changed, 58 insertions(+), 14 deletions(-) diff --git a/Documentation/ABI/testing/sysfs-driver-ufs b/Documentation/ABI/testing/sysfs-driver-ufs index 016724ec26d5..6df8ccbc94f3 100644 --- a/Documentation/ABI/testing/sysfs-driver-ufs +++ b/Documentation/ABI/testing/sysfs-driver-ufs @@ -619,7 +619,6 @@ Date: February 2018 Contact: Stanislav Nijnikov Description: This file shows the device init status. The full information about the flag could be found at UFS specifications 2.1. - The file is read only. What: /sys/bus/platform/drivers/ufshcd/*/flags/permanent_wpe Date: February 2018 @@ -627,7 +626,8 @@ Contact: Stanislav Nijnikov Description: This file shows whether permanent write protection is enabled. The full information about the flag could be found at UFS specifications 2.1. - The file is read only. + Warning: This flag can only be written one time within the + lifetime of the device. Once set, it cannot be unset. What: /sys/bus/platform/drivers/ufshcd/*/flags/power_on_wpe Date: February 2018 @@ -636,7 +636,7 @@ Description: This file shows whether write protection is enabled on all logical units configured as power on write protected. The full information about the flag could be found at UFS specifications 2.1. - The file is read only. + Once set, this flag cannot be cleared without a device reset. What: /sys/bus/platform/drivers/ufshcd/*/flags/bkops_enable Date: February 2018 @@ -644,7 +644,6 @@ Contact: Stanislav Nijnikov Description: This file shows whether the device background operations are enabled. The full information about the flag could be found at UFS specifications 2.1. - The file is read only. What: /sys/bus/platform/drivers/ufshcd/*/flags/life_span_mode_enable Date: February 2018 @@ -654,13 +653,22 @@ Description: This file shows whether the device life span mode is enabled. UFS specifications 2.1. The file is read only. +What: /sys/bus/platform/drivers/ufshcd/*/flags/purge_enable +Date: August 2018 +Contact: Stanislav Nijnikov +Description: This file shall only be set when the command queue of all + logical units are empty and purge status is idle. This flag is + automatically cleared by the UFS device when the operation + completes or an error occurs. This flag is write-only, it + cannot be read. Complete information about the flag can be + found in the UFS specification 2.20A. + What: /sys/bus/platform/drivers/ufshcd/*/flags/phy_resource_removal Date: February 2018 Contact: Stanislav Nijnikov Description: This file shows whether physical resource removal is enable. The full information about the flag could be found at UFS specifications 2.1. - The file is read only. What: /sys/bus/platform/drivers/ufshcd/*/flags/busy_rtc Date: February 2018 diff --git a/drivers/scsi/ufs/ufs-sysfs.c b/drivers/scsi/ufs/ufs-sysfs.c index 8d9332bb7d0c..2da927f4b7ff 100644 --- a/drivers/scsi/ufs/ufs-sysfs.c +++ b/drivers/scsi/ufs/ufs-sysfs.c @@ -616,7 +616,7 @@ static const struct attribute_group ufs_sysfs_string_descriptors_group = { .attrs = ufs_sysfs_string_descriptors, }; -#define UFS_FLAG(_name, _uname) \ +#define UFS_FLAG_SHOW(_name, _uname) \ static ssize_t _name##_show(struct device *dev, \ struct device_attribute *attr, char *buf) \ { \ @@ -626,17 +626,52 @@ static ssize_t _name##_show(struct device *dev, \ QUERY_FLAG_IDN##_uname, &flag)) \ return -EINVAL; \ return sprintf(buf, "%s\n", flag ? "true" : "false"); \ +} + +#define UFS_FLAG_STORE(_name, _uname) \ +static ssize_t _name##_store(struct device *dev, \ + struct device_attribute *attr, const char *buf, \ + size_t count) \ +{ \ + bool flag; \ + struct ufs_hba *hba = dev_get_drvdata(dev); \ + enum query_opcode op; \ + if (kstrtobool(buf, &flag)) \ + return -EINVAL; \ + op = flag ? UPIU_QUERY_OPCODE_SET_FLAG : \ + UPIU_QUERY_OPCODE_CLEAR_FLAG; \ + if (ufshcd_query_flag(hba, op, QUERY_FLAG_IDN##_uname, NULL)) \ + return -EINVAL; \ + return count; \ } \ + +#define UFS_FLAG_RO(_name, _uname) \ +UFS_FLAG_SHOW(_name, _uname) \ static DEVICE_ATTR_RO(_name) -UFS_FLAG(device_init, _FDEVICEINIT); -UFS_FLAG(permanent_wpe, _PERMANENT_WPE); -UFS_FLAG(power_on_wpe, _PWR_ON_WPE); -UFS_FLAG(bkops_enable, _BKOPS_EN); -UFS_FLAG(life_span_mode_enable, _LIFE_SPAN_MODE_ENABLE); -UFS_FLAG(phy_resource_removal, _FPHYRESOURCEREMOVAL); -UFS_FLAG(busy_rtc, _BUSY_RTC); -UFS_FLAG(disable_fw_update, _PERMANENTLY_DISABLE_FW_UPDATE); +#define UFS_FLAG_WO(_name, _uname) \ +UFS_FLAG_STORE(_name, _uname) \ +static ssize_t _name##_show(struct device *dev, \ + struct device_attribute *attr, char *buf) \ +{ \ + return -EOPNOTSUPP; \ +} \ +static DEVICE_ATTR_RW(_name) + +#define UFS_FLAG_RW(_name, _uname) \ +UFS_FLAG_SHOW(_name, _uname) \ +UFS_FLAG_STORE(_name, _uname) \ +static DEVICE_ATTR_RW(_name) + +UFS_FLAG_RW(device_init, _FDEVICEINIT); +UFS_FLAG_RW(permanent_wpe, _PERMANENT_WPE); +UFS_FLAG_RW(power_on_wpe, _PWR_ON_WPE); +UFS_FLAG_RW(bkops_enable, _BKOPS_EN); +UFS_FLAG_RO(life_span_mode_enable, _LIFE_SPAN_MODE_ENABLE); +UFS_FLAG_WO(purge_enable, _PURGE_ENABLE); +UFS_FLAG_RW(phy_resource_removal, _FPHYRESOURCEREMOVAL); +UFS_FLAG_RO(busy_rtc, _BUSY_RTC); +UFS_FLAG_RO(disable_fw_update, _PERMANENTLY_DISABLE_FW_UPDATE); static struct attribute *ufs_sysfs_device_flags[] = { &dev_attr_device_init.attr, @@ -644,6 +679,7 @@ static struct attribute *ufs_sysfs_device_flags[] = { &dev_attr_power_on_wpe.attr, &dev_attr_bkops_enable.attr, &dev_attr_life_span_mode_enable.attr, + &dev_attr_purge_enable.attr, &dev_attr_phy_resource_removal.attr, &dev_attr_busy_rtc.attr, &dev_attr_disable_fw_update.attr,