From: David Bauer Date: Mon, 10 May 2021 14:02:45 +0000 (+0200) Subject: sfdp X-Git-Url: http://git.openwrt.org/?a=commitdiff_plain;h=f1824e66fc8e3a5740e45ac5841906e8dafe469e;p=openwrt%2Fstaging%2Fblocktrron.git sfdp --- diff --git a/target/linux/ramips/patches-5.10/998-sfdp.patch b/target/linux/ramips/patches-5.10/998-sfdp.patch new file mode 100644 index 0000000000..2b3c9536d6 --- /dev/null +++ b/target/linux/ramips/patches-5.10/998-sfdp.patch @@ -0,0 +1,245 @@ +From mboxrd@z Thu Jan 1 00:00:00 1970 +Return-Path: +X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on + aws-us-west-2-korg-lkml-1.web.codeaurora.org +X-Spam-Level: +X-Spam-Status: No, score=-17.4 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, + DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, + INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, + USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 +Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) + by smtp.lore.kernel.org (Postfix) with ESMTP id 4FB46C433B4 + for ; Mon, 3 May 2021 15:59:34 +0000 (UTC) +Received: from desiato.infradead.org (desiato.infradead.org [90.155.92.199]) + (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 956A9610C8 + for ; Mon, 3 May 2021 15:59:33 +0000 (UTC) +DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 956A9610C8 +Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=walle.cc +Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-mtd-bounces+linux-mtd=archiver.kernel.org@lists.infradead.org +DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; + d=lists.infradead.org; s=desiato.20200630; h=Sender:Content-Transfer-Encoding + :Content-Type:List-Subscribe:List-Help:List-Post:List-Archive: + List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:Message-Id:Date: + Subject:Cc:To:From:Reply-To:Content-ID:Content-Description:Resent-Date: + Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; + bh=Tsm8zk5O4/p6H/evnxcz4svhPdB4+k0nNcpqH6kpWwo=; b=J6xBZdtArQdVIH+rm37f6662P + rmTsKLI5cz7znngfIGOriLYKKm3Hv5MtzgCuwQDIb5X0aB5lQKowCOwkgurKMCXaZhfxH3k8Nblj+ + 6R2n5g+LMHYBDBrncHAgy4T+qL7qfwyG/FgBzEe0TEUSV3Q1/D7QRMWHIL+nU4DKVb+Os+E2+JQ9Q + mF0sA+1nOde/6E8kwt2aKo659o872NbKVMfR99cOiKDx2wvIAvVULGtva4gNarZTLugdCuSAHe8Ek + F7VOX8XsAgwBsShPYOs6jMiq8vORjkWkQig2g6xukoL5kfFcb/WcWlSpNUp37VgO8QH5j+l+dck7T + bguQD/xAQ==; +Received: from localhost ([::1] helo=desiato.infradead.org) + by desiato.infradead.org with esmtp (Exim 4.94 #2 (Red Hat Linux)) + id 1lday5-00EJlC-GV; Mon, 03 May 2021 15:58:45 +0000 +Received: from bombadil.infradead.org ([2607:7c80:54:e::133]) + by desiato.infradead.org with esmtps (Exim 4.94 #2 (Red Hat Linux)) + id 1ldawY-00EJai-3o + for linux-mtd@desiato.infradead.org; Mon, 03 May 2021 15:57:10 +0000 +DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; + d=infradead.org; s=bombadil.20210309; h=Content-Transfer-Encoding: + MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender + :Reply-To:Content-Type:Content-ID:Content-Description; + bh=V2X21HuGTUdM2Io/0bU9GiSkqESjo7sAPKicVUL4PXc=; b=OvTkuLc300260435HEpym9jc2C + q+d/PRUe7UxaSOsEe7cXiXwBbWPXWySwAqzC/VAzPqQkHZO4NB8kQ0ySkCxuygykJ0MAqnhpJBZje + fPz2yOsPrcTUPZJU1AnSYWrS4OpEpBA5f8Xpna9rPJMJsN7hqQ8ruDbVY+sRdyiyLRtP9sJrJ95hk + fPmwDFVfCuKmd0uRF78JGjazN9dg2BvW03aGkicjrveU7RJ18Zm/FUhlEProZFgTl49WblZTHTBsS + MyzlfpR4GPE4TXK5qFu5GhoqpEgU+bGe5I6dNTRe+R2Xl5ozFarWR+qTeVosl0Y/sx3F++e+tJBmL + jB6zTN0w==; +Received: from ssl.serverraum.org ([176.9.125.105]) + by bombadil.infradead.org with esmtps (Exim 4.94 #2 (Red Hat Linux)) + id 1ldawU-003Cuy-BG + for linux-mtd@lists.infradead.org; Mon, 03 May 2021 15:57:08 +0000 +Received: from mwalle01.fritz.box (unknown + [IPv6:2a02:810c:c200:2e91:fa59:71ff:fe9b:b851]) + (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) + key-exchange ECDHE (P-384) server-signature RSA-PSS (2048 bits) server-digest + SHA256) (No client certificate requested) + by ssl.serverraum.org (Postfix) with ESMTPSA id 33E16221E6; + Mon, 3 May 2021 17:56:59 +0200 (CEST) +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=walle.cc; + s=mail2016061301; t=1620057419; + h=from:from:reply-to:subject:subject:date:date:message-id:message-id: + to:to:cc:cc:mime-version:mime-version: + content-transfer-encoding:content-transfer-encoding: + in-reply-to:in-reply-to:references:references; + bh=V2X21HuGTUdM2Io/0bU9GiSkqESjo7sAPKicVUL4PXc=; + b=bq33QFnbekGV8cbAyHbkgR8b2AZd952JhX1U9lAcJVnn17gQfF3XOnQCnOaCVNe04XTGe6 + HewsvSoTAlMvJNZg9VVtcJqm+g3K0uvJ6z2o/Q8fh5Cc9iBxeBXlWIj3h3nj8yTkMOPMNh + dB66J9Lh+Dvs66ntEyz7jrXIK+79wV0= +From: Michael Walle +To: linux-kernel@vger.kernel.org, + linux-mtd@lists.infradead.org +Cc: Tudor Ambarus , + Pratyush Yadav , Miquel Raynal , + Richard Weinberger , Vignesh Raghavendra , + Alexander Williams , + Yicong Yang , + Heiko Thiery , Michael Walle +Subject: [PATCH v4 1/2] mtd: spi-nor: sfdp: save a copy of the SFDP data +Date: Mon, 3 May 2021 17:56:50 +0200 +Message-Id: <20210503155651.30889-2-michael@walle.cc> +X-Mailer: git-send-email 2.20.1 +In-Reply-To: <20210503155651.30889-1-michael@walle.cc> +References: <20210503155651.30889-1-michael@walle.cc> +MIME-Version: 1.0 +X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 +X-CRM114-CacheID: sfid-20210503_085706_715579_131AA3EB +X-CRM114-Status: GOOD ( 22.72 ) +X-BeenThere: linux-mtd@lists.infradead.org +X-Mailman-Version: 2.1.34 +Precedence: list +List-Id: Linux MTD discussion mailing list +List-Unsubscribe: , + +List-Archive: +List-Post: +List-Help: +List-Subscribe: , + +Content-Type: text/plain; charset="us-ascii" +Content-Transfer-Encoding: 7bit +Sender: "linux-mtd" +Errors-To: linux-mtd-bounces+linux-mtd=archiver.kernel.org@lists.infradead.org +Archived-At: +List-Archive: + +Due to possible mode switching to 8D-8D-8D, it might not be possible to +read the SFDP after the initial probe. To be able to dump the SFDP via +sysfs afterwards, make a complete copy of it. + +Signed-off-by: Michael Walle +Reviewed-by: Pratyush Yadav +Tested-by: Heiko Thiery +--- + drivers/mtd/spi-nor/core.h | 10 +++++++ + drivers/mtd/spi-nor/sfdp.c | 58 +++++++++++++++++++++++++++++++++++++ + include/linux/mtd/spi-nor.h | 2 ++ + 3 files changed, 70 insertions(+) + +--- a/drivers/mtd/spi-nor/core.h ++++ b/drivers/mtd/spi-nor/core.h +@@ -380,6 +380,16 @@ struct spi_nor_manufacturer { + const struct spi_nor_fixups *fixups; + }; + ++/** ++ * struct sfdp - SFDP data ++ * @num_dwords: number of entries in the dwords array ++ * @dwords: array of double words of the SFDP data ++ */ ++struct sfdp { ++ size_t num_dwords; ++ u32 *dwords; ++}; ++ + /* Manufacturer drivers. */ + extern const struct spi_nor_manufacturer spi_nor_atmel; + extern const struct spi_nor_manufacturer spi_nor_bohong; +--- a/drivers/mtd/spi-nor/sfdp.c ++++ b/drivers/mtd/spi-nor/sfdp.c +@@ -15,6 +15,7 @@ + (((p)->parameter_table_pointer[2] << 16) | \ + ((p)->parameter_table_pointer[1] << 8) | \ + ((p)->parameter_table_pointer[0] << 0)) ++#define SFDP_PARAM_HEADER_PARAM_LEN(p) ((p)->length * 4) + + #define SFDP_BFPT_ID 0xff00 /* Basic Flash Parameter Table */ + #define SFDP_SECTOR_MAP_ID 0xff81 /* Sector Map Table */ +@@ -1103,6 +1104,8 @@ int spi_nor_parse_sfdp(struct spi_nor *n + struct sfdp_parameter_header *param_headers = NULL; + struct sfdp_header header; + struct device *dev = nor->dev; ++ struct sfdp *sfdp; ++ size_t sfdp_size; + size_t psize; + int i, err; + +@@ -1125,6 +1128,9 @@ int spi_nor_parse_sfdp(struct spi_nor *n + bfpt_header->major != SFDP_JESD216_MAJOR) + return -EINVAL; + ++ sfdp_size = SFDP_PARAM_HEADER_PTP(bfpt_header) + ++ SFDP_PARAM_HEADER_PARAM_LEN(bfpt_header); ++ + /* + * Allocate memory then read all parameter headers with a single + * Read SFDP command. These parameter headers will actually be parsed +@@ -1152,6 +1158,58 @@ int spi_nor_parse_sfdp(struct spi_nor *n + } + + /* ++ * Cache the complete SFDP data. It is not (easily) possible to fetch ++ * SFDP after probe time and we need it for the sysfs access. ++ */ ++ for (i = 0; i < header.nph; i++) { ++ param_header = ¶m_headers[i]; ++ sfdp_size = max_t(size_t, sfdp_size, ++ SFDP_PARAM_HEADER_PTP(param_header) + ++ SFDP_PARAM_HEADER_PARAM_LEN(param_header)); ++ } ++ ++ /* ++ * Limit the total size to a reasonable value to avoid allocating too ++ * much memory just of because the flash returned some insane values. ++ */ ++ if (sfdp_size > PAGE_SIZE) { ++ dev_dbg(dev, "SFDP data (%zu) too big, truncating\n", ++ sfdp_size); ++ sfdp_size = PAGE_SIZE; ++ } ++ ++ sfdp = devm_kzalloc(dev, sizeof(*sfdp), GFP_KERNEL); ++ if (!sfdp) { ++ err = -ENOMEM; ++ goto exit; ++ } ++ ++ /* ++ * The SFDP is organized in chunks of DWORDs. Thus, in theory, the ++ * sfdp_size should be a multiple of DWORDs. But in case a flash ++ * is not spec compliant, make sure that we have enough space to store ++ * the complete SFDP data. ++ */ ++ sfdp->num_dwords = DIV_ROUND_UP(sfdp_size, sizeof(*sfdp->dwords)); ++ sfdp->dwords = devm_kcalloc(dev, sfdp->num_dwords, ++ sizeof(*sfdp->dwords), GFP_KERNEL); ++ if (!sfdp->dwords) { ++ err = -ENOMEM; ++ devm_kfree(dev, sfdp); ++ goto exit; ++ } ++ ++ err = spi_nor_read_sfdp(nor, 0, sfdp_size, sfdp->dwords); ++ if (err < 0) { ++ dev_dbg(dev, "failed to read SFDP data\n"); ++ devm_kfree(dev, sfdp->dwords); ++ devm_kfree(dev, sfdp); ++ goto exit; ++ } ++ ++ nor->sfdp = sfdp; ++ ++ /* + * Check other parameter headers to get the latest revision of + * the basic flash parameter table. + */ +--- a/include/linux/mtd/spi-nor.h ++++ b/include/linux/mtd/spi-nor.h +@@ -348,6 +348,7 @@ struct spi_nor_flash_parameter; + * @read_proto: the SPI protocol for read operations + * @write_proto: the SPI protocol for write operations + * @reg_proto: the SPI protocol for read_reg/write_reg/erase operations ++ * @sfdp: the SFDP data of the flash + * @controller_ops: SPI NOR controller driver specific operations. + * @params: [FLASH-SPECIFIC] SPI NOR flash parameters and settings. + * The structure includes legacy flash parameters and +@@ -386,6 +387,7 @@ struct spi_nor { + struct spi_mem_dirmap_desc *wdesc; + } dirmap; + ++ struct sfdp *sfdp; + void *priv; + }; + diff --git a/target/linux/ramips/patches-5.10/999-sfdp.patch b/target/linux/ramips/patches-5.10/999-sfdp.patch new file mode 100644 index 0000000000..f1a61c941c --- /dev/null +++ b/target/linux/ramips/patches-5.10/999-sfdp.patch @@ -0,0 +1,287 @@ +From mboxrd@z Thu Jan 1 00:00:00 1970 +Return-Path: +X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on + aws-us-west-2-korg-lkml-1.web.codeaurora.org +X-Spam-Level: +X-Spam-Status: No, score=-17.4 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, + DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, + INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, + USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 +Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) + by smtp.lore.kernel.org (Postfix) with ESMTP id 4FB0FC433ED + for ; Mon, 3 May 2021 15:59:34 +0000 (UTC) +Received: from desiato.infradead.org (desiato.infradead.org [90.155.92.199]) + (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 958CC61183 + for ; Mon, 3 May 2021 15:59:33 +0000 (UTC) +DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 958CC61183 +Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=walle.cc +Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-mtd-bounces+linux-mtd=archiver.kernel.org@lists.infradead.org +DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; + d=lists.infradead.org; s=desiato.20200630; h=Sender:Content-Transfer-Encoding + :Content-Type:List-Subscribe:List-Help:List-Post:List-Archive: + List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:Message-Id:Date: + Subject:Cc:To:From:Reply-To:Content-ID:Content-Description:Resent-Date: + Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; + bh=EGV+dxocFXsqSl08a2XaxTWEYpMGKZeDtMOwEQIf5D0=; b=IGjfqGMmX1BJjO+gclAFmwJLF + EiH32A1fkU2OfFJoSa5tgH+TWXNI6UWp8amvd1BZ6ZF7M+opfOsF8UAqebigpJlhDgEVb7NpOpJUT + BjaMZmtNXTwgPehLXgJvrCZgABmQKELX0lGj+F7mfaDtXBpSraEoXsFJOHjiCPWV6YSAjrcCMad6l + 2JBSTll0cvqsRh1sPHoEldYVXnEN9lpVrCTe3ldsD2bDuxjeXs5U3hW00QiyRAWzAF/HIQ42BkWGW + K6OXqrpjlP/dAIkiimwKDABnwuuSsBZp+snq9dVm5JjWgiz3L1VOtRbOp+rfRntGj2Lbda2UjCGo/ + qaz3xgeww==; +Received: from localhost ([::1] helo=desiato.infradead.org) + by desiato.infradead.org with esmtp (Exim 4.94 #2 (Red Hat Linux)) + id 1ldaxb-00EJho-IQ; Mon, 03 May 2021 15:58:16 +0000 +Received: from bombadil.infradead.org ([2607:7c80:54:e::133]) + by desiato.infradead.org with esmtps (Exim 4.94 #2 (Red Hat Linux)) + id 1ldawY-00EJaj-9z + for linux-mtd@desiato.infradead.org; Mon, 03 May 2021 15:57:10 +0000 +DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; + d=infradead.org; s=bombadil.20210309; h=Content-Transfer-Encoding: + MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender + :Reply-To:Content-Type:Content-ID:Content-Description; + bh=rn6h3XU4qpU2xLKnq1zA5PvaNO0j68Bcov48KV6nNm4=; b=4i+ZnSYKvAJ4Zo/UKEmlZ24zUo + 3I6nZXg47q7WE2HIbN4GY+jRB4TfOx7WX7lnwcCMQ0hvYVY1pk8ZZRvzWXQCHTnvhSGxdOg39yc5F + avaAXBlMedOiyeA9tVMiYCPrUQxaBIhAc1YNCAeB/QchfnG4IP4B6DAvOaH9z9I7isW5CC023Wqc5 + 29aFMCOj8vmk1lPI2iRdaY1Iwhltaf94HyPvHs+luR8K+qwk02Yg/owVpM9wB2g4PWk/pOOr6HGJ9 + kFZZV8lMXtFLJBXDMvY6bezD50d0IoUq1s9jflxFqQddaYvVHE2z1V+LbAlkQSFggMe0lbTHZczJO + uHiGW+tA==; +Received: from ssl.serverraum.org ([176.9.125.105]) + by bombadil.infradead.org with esmtps (Exim 4.94 #2 (Red Hat Linux)) + id 1ldawU-003Cuz-CN + for linux-mtd@lists.infradead.org; Mon, 03 May 2021 15:57:09 +0000 +Received: from mwalle01.fritz.box (unknown + [IPv6:2a02:810c:c200:2e91:fa59:71ff:fe9b:b851]) + (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) + key-exchange ECDHE (P-384) server-signature RSA-PSS (2048 bits) server-digest + SHA256) (No client certificate requested) + by ssl.serverraum.org (Postfix) with ESMTPSA id 2BF5D22235; + Mon, 3 May 2021 17:57:00 +0200 (CEST) +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=walle.cc; + s=mail2016061301; t=1620057420; + h=from:from:reply-to:subject:subject:date:date:message-id:message-id: + to:to:cc:cc:mime-version:mime-version: + content-transfer-encoding:content-transfer-encoding: + in-reply-to:in-reply-to:references:references; + bh=rn6h3XU4qpU2xLKnq1zA5PvaNO0j68Bcov48KV6nNm4=; + b=KU3eDts2m6XWnJHOhUs7szr9IGo2SCU0WIFLKGLfvF4PLAhBx1d3AXP0myCwFPnyFq9Upb + LwLbMQhZi3XRGAIm1kjqeQo/ZBLYjWHwKN5CRd9Lr8UpDtz++4QeE8Ax70MISv+kfd+Sfc + rlUZ9hCVchECzoHlZM+14sDXl3HJaag= +From: Michael Walle +To: linux-kernel@vger.kernel.org, + linux-mtd@lists.infradead.org +Cc: Tudor Ambarus , + Pratyush Yadav , Miquel Raynal , + Richard Weinberger , Vignesh Raghavendra , + Alexander Williams , + Yicong Yang , + Heiko Thiery , Michael Walle +Subject: [PATCH v4 2/2] mtd: spi-nor: add initial sysfs support +Date: Mon, 3 May 2021 17:56:51 +0200 +Message-Id: <20210503155651.30889-3-michael@walle.cc> +X-Mailer: git-send-email 2.20.1 +In-Reply-To: <20210503155651.30889-1-michael@walle.cc> +References: <20210503155651.30889-1-michael@walle.cc> +MIME-Version: 1.0 +X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 +X-CRM114-CacheID: sfid-20210503_085706_748059_9DBF1E89 +X-CRM114-Status: GOOD ( 21.31 ) +X-BeenThere: linux-mtd@lists.infradead.org +X-Mailman-Version: 2.1.34 +Precedence: list +List-Id: Linux MTD discussion mailing list +List-Unsubscribe: , + +List-Archive: +List-Post: +List-Help: +List-Subscribe: , + +Content-Type: text/plain; charset="us-ascii" +Content-Transfer-Encoding: 7bit +Sender: "linux-mtd" +Errors-To: linux-mtd-bounces+linux-mtd=archiver.kernel.org@lists.infradead.org +Archived-At: +List-Archive: + +Add support to show the manufacturer, the partname and JEDEC identifier +as well as to dump the SFDP table. Not all flashes list their SFDP table +contents in their datasheet. So having that is useful. It might also be +helpful in bug reports from users. + +Signed-off-by: Michael Walle +--- +Pratyush, Heiko, I've dropped your Acked and Tested-by because there +were some changes. + + .../ABI/testing/sysfs-bus-spi-devices-spi-nor | 31 +++++++ + drivers/mtd/spi-nor/Makefile | 2 +- + drivers/mtd/spi-nor/core.c | 1 + + drivers/mtd/spi-nor/core.h | 2 + + drivers/mtd/spi-nor/sysfs.c | 93 +++++++++++++++++++ + 5 files changed, 128 insertions(+), 1 deletion(-) + create mode 100644 Documentation/ABI/testing/sysfs-bus-spi-devices-spi-nor + create mode 100644 drivers/mtd/spi-nor/sysfs.c + +--- /dev/null ++++ b/Documentation/ABI/testing/sysfs-bus-spi-devices-spi-nor +@@ -0,0 +1,31 @@ ++What: /sys/bus/spi/devices/.../spi-nor/jedec_id ++Date: April 2021 ++KernelVersion: 5.14 ++Contact: linux-mtd@lists.infradead.org ++Description: (RO) The JEDEC ID of the SPI NOR flash as reported by the ++ flash device. ++ ++ ++What: /sys/bus/spi/devices/.../spi-nor/manufacturer ++Date: April 2021 ++KernelVersion: 5.14 ++Contact: linux-mtd@lists.infradead.org ++Description: (RO) Manufacturer of the SPI NOR flash. ++ ++ ++What: /sys/bus/spi/devices/.../spi-nor/partname ++Date: April 2021 ++KernelVersion: 5.14 ++Contact: linux-mtd@lists.infradead.org ++Description: (RO) Part name of the SPI NOR flash. ++ ++ ++What: /sys/bus/spi/devices/.../spi-nor/sfdp ++Date: April 2021 ++KernelVersion: 5.14 ++Contact: linux-mtd@lists.infradead.org ++Description: (RO) This attribute is only present if the SPI NOR flash ++ device supports the "Read SFDP" command (5Ah). ++ ++ If present, it contains the complete SFDP (serial flash ++ discoverable parameters) binary data of the flash. +--- a/drivers/mtd/spi-nor/Makefile ++++ b/drivers/mtd/spi-nor/Makefile +@@ -1,6 +1,6 @@ + # SPDX-License-Identifier: GPL-2.0 + +-spi-nor-objs := core.o sfdp.o ++spi-nor-objs := core.o sfdp.o sysfs.o + spi-nor-objs += atmel.o + spi-nor-objs += bohong.o + spi-nor-objs += catalyst.o +--- a/drivers/mtd/spi-nor/core.c ++++ b/drivers/mtd/spi-nor/core.c +@@ -3517,6 +3517,7 @@ static struct spi_mem_driver spi_nor_dri + .driver = { + .name = "spi-nor", + .of_match_table = spi_nor_of_table, ++ .dev_groups = spi_nor_sysfs_groups, + }, + .id_table = spi_nor_dev_ids, + }, +--- /dev/null ++++ b/drivers/mtd/spi-nor/sysfs.c +@@ -0,0 +1,93 @@ ++// SPDX-License-Identifier: GPL-2.0 ++ ++#include ++#include ++#include ++#include ++ ++#include "core.h" ++ ++static ssize_t manufacturer_show(struct device *dev, ++ struct device_attribute *attr, char *buf) ++{ ++ struct spi_device *spi = to_spi_device(dev); ++ struct spi_mem *spimem = spi_get_drvdata(spi); ++ struct spi_nor *nor = spi_mem_get_drvdata(spimem); ++ ++ return sysfs_emit(buf, "%s\n", nor->manufacturer->name); ++} ++static DEVICE_ATTR_RO(manufacturer); ++ ++static ssize_t partname_show(struct device *dev, ++ struct device_attribute *attr, char *buf) ++{ ++ struct spi_device *spi = to_spi_device(dev); ++ struct spi_mem *spimem = spi_get_drvdata(spi); ++ struct spi_nor *nor = spi_mem_get_drvdata(spimem); ++ ++ return sysfs_emit(buf, "%s\n", nor->info->name); ++} ++static DEVICE_ATTR_RO(partname); ++ ++static ssize_t jedec_id_show(struct device *dev, ++ struct device_attribute *attr, char *buf) ++{ ++ struct spi_device *spi = to_spi_device(dev); ++ struct spi_mem *spimem = spi_get_drvdata(spi); ++ struct spi_nor *nor = spi_mem_get_drvdata(spimem); ++ ++ return sysfs_emit(buf, "%*phN\n", nor->info->id_len, nor->info->id); ++} ++static DEVICE_ATTR_RO(jedec_id); ++ ++static struct attribute *spi_nor_sysfs_entries[] = { ++ &dev_attr_manufacturer.attr, ++ &dev_attr_partname.attr, ++ &dev_attr_jedec_id.attr, ++ NULL ++}; ++ ++static ssize_t sfdp_read(struct file *filp, struct kobject *kobj, ++ struct bin_attribute *bin_attr, char *buf, ++ loff_t off, size_t count) ++{ ++ struct spi_device *spi = to_spi_device(kobj_to_dev(kobj)); ++ struct spi_mem *spimem = spi_get_drvdata(spi); ++ struct spi_nor *nor = spi_mem_get_drvdata(spimem); ++ struct sfdp *sfdp = nor->sfdp; ++ size_t sfdp_size = sfdp->num_dwords * sizeof(*sfdp->dwords); ++ ++ return memory_read_from_buffer(buf, count, &off, nor->sfdp->dwords, ++ sfdp_size); ++} ++static BIN_ATTR_RO(sfdp, 0); ++ ++static struct bin_attribute *spi_nor_sysfs_bin_entries[] = { ++ &bin_attr_sfdp, ++ NULL ++}; ++ ++static umode_t spi_nor_sysfs_is_bin_visible(struct kobject *kobj, ++ struct bin_attribute *attr, int n) ++{ ++ struct spi_device *spi = to_spi_device(kobj_to_dev(kobj)); ++ struct spi_mem *spimem = spi_get_drvdata(spi); ++ struct spi_nor *nor = spi_mem_get_drvdata(spimem); ++ ++ if (attr == &bin_attr_sfdp && nor->sfdp) ++ return 0444; ++ ++ return 0; ++} ++ ++static const struct attribute_group spi_nor_sysfs_group = { ++ .name = "spi-nor", ++ .is_bin_visible = spi_nor_sysfs_is_bin_visible, ++ .attrs = spi_nor_sysfs_entries, ++ .bin_attrs = spi_nor_sysfs_bin_entries, ++}; ++ ++const struct attribute_group *spi_nor_sysfs_groups[] = { ++ &spi_nor_sysfs_group, ++ NULL ++}; +--- a/drivers/mtd/spi-nor/core.h ++++ b/drivers/mtd/spi-nor/core.h +@@ -411,6 +411,8 @@ extern const struct spi_nor_manufacturer + extern const struct spi_nor_manufacturer spi_nor_xmc; + extern const struct spi_nor_manufacturer spi_nor_xtx; + ++extern const struct attribute_group *spi_nor_sysfs_groups[]; ++ + int spi_nor_check_set_addr_width(struct spi_nor *nor, loff_t addr); + int spi_nor_write_enable(struct spi_nor *nor); + int spi_nor_write_disable(struct spi_nor *nor);