Received: by 2002:a25:1506:0:0:0:0:0 with SMTP id 6csp430343ybv; Fri, 7 Feb 2020 02:01:51 -0800 (PST) X-Google-Smtp-Source: APXvYqzpqoLFmTNg09NOptz0Hc/Cu/oMIXyue6a9kznbWs6n8iz4WSa+kiIDdEkoLBsakOBSZ86V X-Received: by 2002:aca:dc8b:: with SMTP id t133mr1564793oig.98.1581069711046; Fri, 07 Feb 2020 02:01:51 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1581069711; cv=none; d=google.com; s=arc-20160816; b=a+a/qEy6Gxy/vC6PNVCRI/F8KX3xOypwt/Jp5vMvRIC1X1jukzEojQap3B7vGJI6JO buUxPcB5oWmilCKqFJgs2tEOnFHoPnWbJP6O0fEjQnQRhVcr+GReHBjZZsbKHBJ1yZ9N UoVmaPM8/cP7oN4UdmgLWq5T8Qw/Nty690ktQ7xRINurzLstYwqz4Sq5+uWI+WtiB57Y uaXhbstwHoLSd2Mze2QEDs5BI6SVrMzG5pmIYPoNZKs/uRMmFhiq5fWHL6WOYuWzOlIA uDKHoVWzm/+Fzm4Mxq101ZlaHgJxMW4nWxCos9svOOTOOPtG5kcgjUaobeSGjAqEQt47 QoCQ== 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; bh=650mx+IA+TgRPkIXS+O5HOnKbImq8yfa8K9Z1UvvbYo=; b=dtMfsyJtNzlZD0uPLQ9Tq4q7Q30RPq6k4IH1DpocyHu1ZrkAWcBilz23JzUpmqUrSg C6Q1jLqJ8IWSywZCR8sJfVCrShsA/BDQN/qWXZNJ2yRBjXNvWfksPQp7OJdi5zuNspgW yiQmRE0yLSwjSAlqU8g2ohwagMs0biplGxlMGYLLVj0VW7pB0dCKjTSJue6/A/EGcdsh mDmWRRGat0KgViZUfRoofagidubNzUpPnIAhdJ/kpiTUOx6eyUNLhilBx3Z5K2nKl9zn gCJulLY6s+3n/AQkuVTzTHtmpjyU85qvvhj8q/P4GgBJUIx7TUNanz6EElApQT6GZBOX +yIg== 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=canonical.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id p1si1544496otk.42.2020.02.07.02.01.27; Fri, 07 Feb 2020 02:01:51 -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=canonical.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726819AbgBGKA0 (ORCPT + 99 others); Fri, 7 Feb 2020 05:00:26 -0500 Received: from youngberry.canonical.com ([91.189.89.112]:41877 "EHLO youngberry.canonical.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726587AbgBGKAZ (ORCPT ); Fri, 7 Feb 2020 05:00:25 -0500 Received: from 61-220-137-37.hinet-ip.hinet.net ([61.220.137.37] helo=localhost) by youngberry.canonical.com with esmtpsa (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1j00Qx-0006gM-4C; Fri, 07 Feb 2020 10:00:23 +0000 From: Kai-Heng Feng To: axboe@kernel.dk Cc: anthony.wong@canonical.com, Kai-Heng Feng , linux-ide@vger.kernel.org (open list:LIBATA SUBSYSTEM (Serial and Parallel ATA drivers)), linux-kernel@vger.kernel.org (open list) Subject: [PATCH] ata: ahci: Add sysfs attribute to show remapped NVMe device count Date: Fri, 7 Feb 2020 18:00:16 +0800 Message-Id: <20200207100016.32605-1-kai.heng.feng@canonical.com> X-Mailer: git-send-email 2.17.1 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add a new sysfs attribute to show how many NVMe devices are remapped. Userspace like distro installer can use this info to ask user to change the BIOS setting. Signed-off-by: Kai-Heng Feng --- drivers/ata/ahci.c | 28 ++++++++++++++++++++++++---- drivers/ata/ahci.h | 1 + 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index 11ea1aff40db..cdbd995a7a6b 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c @@ -1488,7 +1488,7 @@ static irqreturn_t ahci_thunderx_irq_handler(int irq, void *dev_instance) static void ahci_remap_check(struct pci_dev *pdev, int bar, struct ahci_host_priv *hpriv) { - int i, count = 0; + int i; u32 cap; /* @@ -1509,13 +1509,14 @@ static void ahci_remap_check(struct pci_dev *pdev, int bar, continue; /* We've found a remapped device */ - count++; + hpriv->remapped_nvme++; } - if (!count) + if (!hpriv->remapped_nvme) return; - dev_warn(&pdev->dev, "Found %d remapped NVMe devices.\n", count); + dev_warn(&pdev->dev, "Found %u remapped NVMe devices.\n", + hpriv->remapped_nvme); dev_warn(&pdev->dev, "Switch your BIOS from RAID to AHCI mode to use them.\n"); @@ -1635,6 +1636,18 @@ static void ahci_intel_pcs_quirk(struct pci_dev *pdev, struct ahci_host_priv *hp } } +static ssize_t remapped_nvme_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct ata_host *host = dev_get_drvdata(dev); + struct ahci_host_priv *hpriv = host->private_data; + + return sprintf(buf, "%u\n", hpriv->remapped_nvme); +} + +static DEVICE_ATTR_RO(remapped_nvme); + static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) { unsigned int board_id = ent->driver_data; @@ -1735,6 +1748,10 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) /* detect remapped nvme devices */ ahci_remap_check(pdev, ahci_pci_bar, hpriv); + sysfs_add_file_to_group(&pdev->dev.kobj, + &dev_attr_remapped_nvme.attr, + NULL); + /* must set flag prior to save config in order to take effect */ if (ahci_broken_devslp(pdev)) hpriv->flags |= AHCI_HFLAG_NO_DEVSLP; @@ -1886,6 +1903,9 @@ static void ahci_shutdown_one(struct pci_dev *pdev) static void ahci_remove_one(struct pci_dev *pdev) { + sysfs_remove_file_from_group(&pdev->dev.kobj, + &dev_attr_remapped_nvme.attr, + NULL); pm_runtime_get_noresume(&pdev->dev); ata_pci_remove_one(pdev); } diff --git a/drivers/ata/ahci.h b/drivers/ata/ahci.h index 3dbf398c92ea..d991dd46e89c 100644 --- a/drivers/ata/ahci.h +++ b/drivers/ata/ahci.h @@ -336,6 +336,7 @@ struct ahci_host_priv { u32 em_loc; /* enclosure management location */ u32 em_buf_sz; /* EM buffer size in byte */ u32 em_msg_type; /* EM message type */ + u32 remapped_nvme; /* NVMe remapped device count */ bool got_runtime_pm; /* Did we do pm_runtime_get? */ struct clk *clks[AHCI_MAX_CLKS]; /* Optional */ struct reset_control *rsts; /* Optional */ -- 2.17.1