Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/2216516/?format=api
{ "id": 2216516, "url": "http://patchwork.ozlabs.org/api/patches/2216516/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linux-mtd/patch/20260326-winbond-v6-18-rc1-cont-read-v2-6-643de97a68a3@bootlin.com/", "project": { "id": 3, "url": "http://patchwork.ozlabs.org/api/projects/3/?format=api", "name": "Linux MTD development", "link_name": "linux-mtd", "list_id": "linux-mtd.lists.infradead.org", "list_email": "linux-mtd@lists.infradead.org", "web_url": null, "scm_url": null, "webscm_url": null, "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20260326-winbond-v6-18-rc1-cont-read-v2-6-643de97a68a3@bootlin.com>", "list_archive_url": null, "date": "2026-03-26T16:25:53", "name": "[v2,06/11] mtd: spinand: Use secondary ops for continuous reads", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "adeb3a25293b60fa0d0c29566797c572c3a2382a", "submitter": { "id": 73368, "url": "http://patchwork.ozlabs.org/api/people/73368/?format=api", "name": "Miquel Raynal", "email": "miquel.raynal@bootlin.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/linux-mtd/patch/20260326-winbond-v6-18-rc1-cont-read-v2-6-643de97a68a3@bootlin.com/mbox/", "series": [ { "id": 497619, "url": "http://patchwork.ozlabs.org/api/series/497619/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linux-mtd/list/?series=497619", "date": "2026-03-26T16:25:47", "name": "[v2,01/11] mtd: spinand: Drop a too strong limitation", "version": 2, "mbox": "http://patchwork.ozlabs.org/series/497619/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2216516/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2216516/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "\n <linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org>", "X-Original-To": "incoming@patchwork.ozlabs.org", "Delivered-To": "patchwork-incoming@legolas.ozlabs.org", "Authentication-Results": [ "legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n secure) header.d=lists.infradead.org header.i=@lists.infradead.org\n header.a=rsa-sha256 header.s=bombadil.20210309 header.b=TmkFAgRz;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n unprotected) header.d=bootlin.com header.i=@bootlin.com header.a=rsa-sha256\n header.s=dkim header.b=FX+aXyR+;\n\tdkim-atps=neutral", "legolas.ozlabs.org;\n spf=none (no SPF record) smtp.mailfrom=lists.infradead.org\n (client-ip=2607:7c80:54:3::133; helo=bombadil.infradead.org;\n envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org;\n receiver=patchwork.ozlabs.org)" ], "Received": [ "from bombadil.infradead.org (bombadil.infradead.org\n [IPv6:2607:7c80:54:3::133])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fhTgK0DsQz20LB\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 27 Mar 2026 03:26:34 +1100 (AEDT)", "from localhost ([::1] helo=bombadil.infradead.org)\n\tby bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux))\n\tid 1w5nXK-00000005qdY-03z5;\n\tThu, 26 Mar 2026 16:26:22 +0000", "from smtpout-02.galae.net ([185.246.84.56])\n\tby bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux))\n\tid 1w5nXE-00000005qZz-3Wf0\n\tfor linux-mtd@lists.infradead.org;\n\tThu, 26 Mar 2026 16:26:18 +0000", "from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233])\n\tby smtpout-02.galae.net (Postfix) with ESMTPS id 6769C1A300A;\n\tThu, 26 Mar 2026 16:26:15 +0000 (UTC)", "from mail.galae.net (mail.galae.net [212.83.136.155])\n\tby smtpout-01.galae.net (Postfix) with ESMTPS id 370DB601FA;\n\tThu, 26 Mar 2026 16:26:15 +0000 (UTC)", "from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon)\n with ESMTPSA id A616F10450C95;\n\tThu, 26 Mar 2026 17:26:13 +0100 (CET)" ], "DKIM-Signature": [ "v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed;\n\td=lists.infradead.org; s=bombadil.20210309; h=Sender:\n\tContent-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post:\n\tList-Archive:List-Unsubscribe:List-Id:Cc:To:In-Reply-To:References:Message-Id\n\t:MIME-Version:Subject:Date:From:Reply-To:Content-ID:Content-Description:\n\tResent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:\n\tList-Owner; bh=THAukNZtr5KqhrLtumgtatkqCfSCDRzgC87/Z8npSgs=; b=TmkFAgRzxepH91\n\tlI0vn/DVhc3tKVXW77Ix3VMlCPWQrULHlawV+ERV4j6YJA66ucY7ApvbQTH1K9Nos3/WORbA6nEkZ\n\tZvdyqvLXriGHhBXf3VvlOndiNsP6oq+assbd5zSlYeTVLMBmG3ZCvPSHdNGYr6NfFiOwyEfnetvfY\n\tuGuOXIadctre5Kd5ZYgif/HYx5afeTq7rW24McoiMZldVc6QqLmugMuXNd8Q6DplA2rRidQ5QXM4J\n\tKhD9eD5lJXix8+2wgKUo58/r9esZmDFV6QAWmPebzCc3C7RovoJmUOeqdENKNvP4VZyiCpDjnGCdV\n\tK2rdxlXHG0bJcoUIzU6g==;", "v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim;\n\tt=1774542374; h=from:subject:date:message-id:to:cc:mime-version:content-type:\n\t content-transfer-encoding:in-reply-to:references;\n\tbh=lFv1r9faEQTu1UkMy2vWIxsC6tbdpaaG5r+kI87RNaQ=;\n\tb=FX+aXyR+ZQsx+lELxkC4W095Bv8MkKG/9OTCbji+dUaqS65mJiWgCk0ASLmRNqcL3iwEzS\n\tT2ZkfcTlE5B/JcSuQ3YOvob6hCeUYSlNCe0g9NkIUk9nq1VonjwevpGMQzQ1x13yOg5t0b\n\t1C0uypUPLqEAxwHNkz2Kjh90/pwE14rGCyAOJ2rfhIh6GyUMUbRxBJHXw1UlonDort14bT\n\t6bBpVV5o8lDaRaKJEfZRTFvXZDVLyE4u+WX7Ar5D2mPzXFbM5e0iYnyRlF8ePvjSTGctTm\n\tns/IF97kyBQ1dHiCKbQ2hBKfoCZoBbvw4BWtPWoR0niCRSq1OmLBkth9JDsUjw==" ], "From": "Miquel Raynal <miquel.raynal@bootlin.com>", "Date": "Thu, 26 Mar 2026 17:25:53 +0100", "Subject": "[PATCH v2 06/11] mtd: spinand: Use secondary ops for continuous\n reads", "MIME-Version": "1.0", "Message-Id": "\n <20260326-winbond-v6-18-rc1-cont-read-v2-6-643de97a68a3@bootlin.com>", "References": "\n <20260326-winbond-v6-18-rc1-cont-read-v2-0-643de97a68a3@bootlin.com>", "In-Reply-To": "\n <20260326-winbond-v6-18-rc1-cont-read-v2-0-643de97a68a3@bootlin.com>", "To": "Mark Brown <broonie@kernel.org>, Richard Weinberger <richard@nod.at>,\n Vignesh Raghavendra <vigneshr@ti.com>, Michael Walle <mwalle@kernel.org>,\n Miquel Raynal <miquel.raynal@bootlin.com>", "Cc": "Pratyush Yadav <pratyush@kernel.org>,\n Thomas Petazzoni <thomas.petazzoni@bootlin.com>,\n Steam Lin <STLin2@winbond.com>, Santhosh Kumar K <s-k6@ti.com>,\n linux-spi@vger.kernel.org, linux-kernel@vger.kernel.org,\n linux-mtd@lists.infradead.org", "X-Mailer": "b4 0.14.3", "X-Last-TLS-Session-Version": "TLSv1.3", "X-CRM114-Version": "20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 ", "X-CRM114-CacheID": "sfid-20260326_092617_025731_2DE11D58 ", "X-CRM114-Status": "GOOD ( 22.80 )", "X-Spam-Score": "-2.1 (--)", "X-Spam-Report": "Spam detection software,\n running on the system \"bombadil.infradead.org\",\n has NOT identified this incoming email as spam. The original\n message has been attached to this so you can view it or label\n similar future email. If you have any questions, see\n the administrator of that system for details.\n Content preview: In case a chip supports continuous reads,\n but uses a slightly\n different cache operation for these, it may provide a secondary operation\n template which will be used only during continuous cache read op [...]\n Content analysis details: (-2.1 points, 5.0 required)\n pts rule name description\n ---- ----------------------\n --------------------------------------------------\n 0.0 RCVD_IN_VALIDITY_RPBL_BLOCKED RBL: ADMINISTRATOR NOTICE: The query to\n Validity was blocked. See\n https://knowledge.validity.com/hc/en-us/articles/20961730681243\n for more information.\n [185.246.84.56 listed in\n bl.score.senderscore.com]\n 0.0 RCVD_IN_VALIDITY_CERTIFIED_BLOCKED RBL: ADMINISTRATOR NOTICE: The\n query to Validity was blocked. See\n https://knowledge.validity.com/hc/en-us/articles/20961730681243\n for more information.\n [185.246.84.56 listed in\n sa-trusted.bondedsender.org]\n 0.0 RCVD_IN_VALIDITY_SAFE_BLOCKED RBL: ADMINISTRATOR NOTICE: The query to\n Validity was blocked. See\n https://knowledge.validity.com/hc/en-us/articles/20961730681243\n for more information.\n [185.246.84.56 listed in sa-accredit.habeas.com]\n -0.0 SPF_HELO_PASS SPF: HELO matches SPF record\n -0.0 SPF_PASS SPF: sender matches SPF record\n -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from\n author's\n domain\n -0.1 DKIM_VALID Message has at least one valid DKIM or DK\n signature\n -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from\n envelope-from domain\n 0.1 DKIM_SIGNED Message has a DKIM or DK signature,\n not necessarily valid\n -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1%\n [score: 0.0000]", "X-BeenThere": "linux-mtd@lists.infradead.org", "X-Mailman-Version": "2.1.34", "Precedence": "list", "List-Id": "Linux MTD discussion mailing list <linux-mtd.lists.infradead.org>", "List-Unsubscribe": "<http://lists.infradead.org/mailman/options/linux-mtd>,\n <mailto:linux-mtd-request@lists.infradead.org?subject=unsubscribe>", "List-Archive": "<http://lists.infradead.org/pipermail/linux-mtd/>", "List-Post": "<mailto:linux-mtd@lists.infradead.org>", "List-Help": "<mailto:linux-mtd-request@lists.infradead.org?subject=help>", "List-Subscribe": "<http://lists.infradead.org/mailman/listinfo/linux-mtd>,\n <mailto:linux-mtd-request@lists.infradead.org?subject=subscribe>", "Content-Type": "text/plain; charset=\"us-ascii\"", "Content-Transfer-Encoding": "7bit", "Sender": "\"linux-mtd\" <linux-mtd-bounces@lists.infradead.org>", "Errors-To": "linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org" }, "content": "In case a chip supports continuous reads, but uses a slightly different\ncache operation for these, it may provide a secondary operation template\nwhich will be used only during continuous cache read operations.\n\nFrom a vendor driver point of view, enabling this feature implies\nproviding a new set of templates for these continuous read\noperations. The core will automatically pick the fastest variant,\ndepending on the hardware capabilities.\n\nSigned-off-by: Miquel Raynal <miquel.raynal@bootlin.com>\n---\n drivers/mtd/nand/spi/core.c | 61 ++++++++++++++++++++++++++++++++++++++++++++-\n include/linux/mtd/spinand.h | 12 +++++++++\n 2 files changed, 72 insertions(+), 1 deletion(-)", "diff": "diff --git a/drivers/mtd/nand/spi/core.c b/drivers/mtd/nand/spi/core.c\nindex a66510747b31..45c3afb9cceb 100644\n--- a/drivers/mtd/nand/spi/core.c\n+++ b/drivers/mtd/nand/spi/core.c\n@@ -489,6 +489,11 @@ static int spinand_read_from_cache_op(struct spinand_device *spinand,\n \n \trdesc = spinand->dirmaps[req->pos.plane].rdesc;\n \n+\tif (spinand->op_templates->cont_read_cache && req->continuous)\n+\t\trdesc->info.op_tmpl = &rdesc->info.secondary_op_tmpl;\n+\telse\n+\t\trdesc->info.op_tmpl = &rdesc->info.primary_op_tmpl;\n+\n \tif (nand->ecc.engine->integration == NAND_ECC_ENGINE_INTEGRATION_PIPELINED &&\n \t req->mode != MTD_OPS_RAW)\n \t\trdesc->info.op_tmpl->data.ecc = true;\n@@ -1221,6 +1226,7 @@ static struct spi_mem_dirmap_desc *spinand_create_rdesc(\n \t\t * its spi controller, use regular reading\n \t\t */\n \t\tspinand->cont_read_possible = false;\n+\t\tmemset(&info->secondary_op_tmpl, 0, sizeof(info->secondary_op_tmpl));\n \n \t\tinfo->length = nanddev_page_size(nand) +\n \t\t\t nanddev_per_page_oobsize(nand);\n@@ -1237,11 +1243,24 @@ static int spinand_create_dirmap(struct spinand_device *spinand,\n \tstruct nand_device *nand = spinand_to_nand(spinand);\n \tstruct spi_mem_dirmap_info info = { 0 };\n \tstruct spi_mem_dirmap_desc *desc;\n-\tbool enable_ecc = false;\n+\tbool enable_ecc = false, secondary_op = false;\n \n \tif (nand->ecc.engine->integration == NAND_ECC_ENGINE_INTEGRATION_PIPELINED)\n \t\tenable_ecc = true;\n \n+\tif (spinand->cont_read_possible && spinand->op_templates->cont_read_cache)\n+\t\tsecondary_op = true;\n+\n+\t/*\n+\t * Continuous read implies that only the main data is retrieved, backed\n+\t * by an on-die ECC engine. It is not possible to use a pipelind ECC\n+\t * engine with continuous read.\n+\t */\n+\tif (enable_ecc && secondary_op) {\n+\t\tsecondary_op = false;\n+\t\tspinand->cont_read_possible = false;\n+\t}\n+\n \t/* The plane number is passed in MSB just above the column address */\n \tinfo.offset = plane << fls(nand->memorg.pagesize);\n \n@@ -1259,6 +1278,10 @@ static int spinand_create_dirmap(struct spinand_device *spinand,\n \t/* Read descriptor */\n \tinfo.primary_op_tmpl = *spinand->op_templates->read_cache;\n \tinfo.primary_op_tmpl.data.ecc = enable_ecc;\n+\tif (secondary_op) {\n+\t\tinfo.secondary_op_tmpl = *spinand->op_templates->cont_read_cache;\n+\t\tinfo.secondary_op_tmpl.data.ecc = enable_ecc;\n+\t}\n \tdesc = spinand_create_rdesc(spinand, &info);\n \tif (IS_ERR(desc))\n \t\treturn PTR_ERR(desc);\n@@ -1607,6 +1630,33 @@ int spinand_match_and_init(struct spinand_device *spinand,\n \t\tif (ret)\n \t\t\treturn ret;\n \n+\t\tif (info->op_variants.cont_read_cache) {\n+\t\t\top = spinand_select_op_variant(spinand, SSDR,\n+\t\t\t\t\t\t info->op_variants.cont_read_cache);\n+\t\t\tif (op) {\n+\t\t\t\tconst struct spi_mem_op *read_op;\n+\n+\t\t\t\tread_op = spinand->ssdr_op_templates.read_cache;\n+\n+\t\t\t\t/*\n+\t\t\t\t * Sometimes the fastest continuous read variant may not\n+\t\t\t\t * be supported. In this case, prefer to use the fastest\n+\t\t\t\t * read from cache variant and disable continuous reads.\n+\t\t\t\t */\n+\t\t\t\tif (read_op->cmd.buswidth > op->cmd.buswidth ||\n+\t\t\t\t (read_op->cmd.dtr && !op->cmd.dtr) ||\n+\t\t\t\t read_op->addr.buswidth > op->addr.buswidth ||\n+\t\t\t\t (read_op->addr.dtr && !op->addr.dtr) ||\n+\t\t\t\t read_op->data.buswidth > op->data.buswidth ||\n+\t\t\t\t (read_op->data.dtr && !op->data.dtr))\n+\t\t\t\t\tspinand->cont_read_possible = false;\n+\t\t\t\telse\n+\t\t\t\t\tspinand->ssdr_op_templates.cont_read_cache = op;\n+\t\t\t} else {\n+\t\t\t\tspinand->cont_read_possible = false;\n+\t\t\t}\n+\t\t}\n+\n \t\t/* I/O variants selection with octo-spi DDR commands (optional) */\n \n \t\tret = spinand_init_odtr_instruction_set(spinand);\n@@ -1629,6 +1679,15 @@ int spinand_match_and_init(struct spinand_device *spinand,\n \t\t\t\t\t info->op_variants.update_cache);\n \t\tspinand->odtr_op_templates.update_cache = op;\n \n+\t\tif (info->op_variants.cont_read_cache) {\n+\t\t\top = spinand_select_op_variant(spinand, ODTR,\n+\t\t\t\t\t\t info->op_variants.cont_read_cache);\n+\t\t\tif (op)\n+\t\t\t\tspinand->odtr_op_templates.cont_read_cache = op;\n+\t\t\telse\n+\t\t\t\tspinand->cont_read_possible = false;\n+\t\t}\n+\n \t\treturn 0;\n \t}\n \ndiff --git a/include/linux/mtd/spinand.h b/include/linux/mtd/spinand.h\nindex bbf17c346887..aab17e2c8ac9 100644\n--- a/include/linux/mtd/spinand.h\n+++ b/include/linux/mtd/spinand.h\n@@ -575,6 +575,7 @@ enum spinand_bus_interface {\n * @op_variants.read_cache: variants of the read-cache operation\n * @op_variants.write_cache: variants of the write-cache operation\n * @op_variants.update_cache: variants of the update-cache operation\n+ * @op_variants.cont_read_cache: variants of the continuous read-cache operation\n * @vendor_ops: vendor specific operations\n * @select_target: function used to select a target/die. Required only for\n *\t\t multi-die chips\n@@ -599,6 +600,7 @@ struct spinand_info {\n \t\tconst struct spinand_op_variants *read_cache;\n \t\tconst struct spinand_op_variants *write_cache;\n \t\tconst struct spinand_op_variants *update_cache;\n+\t\tconst struct spinand_op_variants *cont_read_cache;\n \t} op_variants;\n \tconst struct spinand_op_variants *vendor_ops;\n \tint (*select_target)(struct spinand_device *spinand,\n@@ -628,6 +630,14 @@ struct spinand_info {\n \t\t.update_cache = __update,\t\t\t\t\\\n \t}\n \n+#define SPINAND_INFO_OP_VARIANTS_WITH_CONT(__read, __write, __update, __cont_read) \\\n+\t{\t\t\t\t\t\t\t\t\\\n+\t\t.read_cache = __read,\t\t\t\t\t\\\n+\t\t.write_cache = __write,\t\t\t\t\t\\\n+\t\t.update_cache = __update,\t\t\t\t\\\n+\t\t.cont_read_cache = __cont_read,\t\t\t\t\\\n+\t}\n+\n #define SPINAND_INFO_VENDOR_OPS(__ops)\t\t\t\t\t\\\n \t.vendor_ops = __ops\n \n@@ -699,6 +709,7 @@ struct spinand_dirmap {\n * @read_cache: read cache op template\n * @write_cache: write cache op template\n * @update_cache: update cache op template\n+ * @cont_read_cache: continuous read cache op template (optional)\n */\n struct spinand_mem_ops {\n \tstruct spi_mem_op reset;\n@@ -713,6 +724,7 @@ struct spinand_mem_ops {\n \tconst struct spi_mem_op *read_cache;\n \tconst struct spi_mem_op *write_cache;\n \tconst struct spi_mem_op *update_cache;\n+\tconst struct spi_mem_op *cont_read_cache;\n };\n \n /**\n", "prefixes": [ "v2", "06/11" ] }