{"id":2230399,"url":"http://patchwork.ozlabs.org/api/1.1/patches/2230399/?format=json","web_url":"http://patchwork.ozlabs.org/project/linux-aspeed/patch/20260429-winbond-v6-18-rc1-cont-read-v3-5-0f38b3c229ad@bootlin.com/","project":{"id":57,"url":"http://patchwork.ozlabs.org/api/1.1/projects/57/?format=json","name":"Linux ASPEED SoC development","link_name":"linux-aspeed","list_id":"linux-aspeed.lists.ozlabs.org","list_email":"linux-aspeed@lists.ozlabs.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20260429-winbond-v6-18-rc1-cont-read-v3-5-0f38b3c229ad@bootlin.com>","date":"2026-04-29T17:56:42","name":"[v3,05/11] spi: spi-mem: Create a secondary read operation","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"e7cb58836ae88e52bc5787208b0717008528c598","submitter":{"id":73368,"url":"http://patchwork.ozlabs.org/api/1.1/people/73368/?format=json","name":"Miquel Raynal","email":"miquel.raynal@bootlin.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/linux-aspeed/patch/20260429-winbond-v6-18-rc1-cont-read-v3-5-0f38b3c229ad@bootlin.com/mbox/","series":[{"id":502122,"url":"http://patchwork.ozlabs.org/api/1.1/series/502122/?format=json","web_url":"http://patchwork.ozlabs.org/project/linux-aspeed/list/?series=502122","date":"2026-04-29T17:56:39","name":"mtd: spinand: Winbond continuous read support","version":3,"mbox":"http://patchwork.ozlabs.org/series/502122/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2230399/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2230399/checks/","tags":{},"headers":{"Return-Path":"\n <linux-aspeed+bounces-3979-incoming=patchwork.ozlabs.org@lists.ozlabs.org>","X-Original-To":["incoming@patchwork.ozlabs.org","linux-aspeed@lists.ozlabs.org"],"Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=bootlin.com header.i=@bootlin.com header.a=rsa-sha256\n header.s=dkim header.b=K0amzfyc;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=lists.ozlabs.org\n (client-ip=2404:9400:21b9:f100::1; helo=lists.ozlabs.org;\n envelope-from=linux-aspeed+bounces-3979-incoming=patchwork.ozlabs.org@lists.ozlabs.org;\n receiver=patchwork.ozlabs.org)","lists.ozlabs.org;\n arc=none smtp.remote-ip=185.246.84.56","lists.ozlabs.org;\n dmarc=pass (p=reject dis=none) header.from=bootlin.com","lists.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=bootlin.com header.i=@bootlin.com header.a=rsa-sha256\n header.s=dkim header.b=K0amzfyc;\n\tdkim-atps=neutral","lists.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=bootlin.com\n (client-ip=185.246.84.56; helo=smtpout-02.galae.net;\n envelope-from=miquel.raynal@bootlin.com; receiver=lists.ozlabs.org)"],"Received":["from lists.ozlabs.org (lists.ozlabs.org\n [IPv6:2404:9400:21b9:f100::1])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1 raw public key)\n server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g5QCM4rvxz1yHX\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 30 Apr 2026 04:03:27 +1000 (AEST)","from boromir.ozlabs.org (localhost [127.0.0.1])\n\tby lists.ozlabs.org (Postfix) with ESMTP id 4g5QCL4sgWz2ykf;\n\tThu, 30 Apr 2026 04:03:26 +1000 (AEST)","from smtpout-02.galae.net (smtpout-02.galae.net [185.246.84.56])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature RSA-PSS (2048 bits) server-digest\n SHA256)\n\t(No client certificate requested)\n\tby lists.ozlabs.org (Postfix) with ESMTPS id 4g5QCH2stfz2yjp;\n\tThu, 30 Apr 2026 04:03:21 +1000 (AEST)","from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233])\n\tby smtpout-02.galae.net (Postfix) with ESMTPS id 2B37A1A3453;\n\tWed, 29 Apr 2026 17:57:56 +0000 (UTC)","from mail.galae.net (mail.galae.net [212.83.136.155])\n\tby smtpout-01.galae.net (Postfix) with ESMTPS id F35B55FD43;\n\tWed, 29 Apr 2026 17:57:55 +0000 (UTC)","from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon)\n with ESMTPSA id 3FF5A1072B173;\n\tWed, 29 Apr 2026 19:57:50 +0200 (CEST)"],"ARC-Seal":"i=1; a=rsa-sha256; d=lists.ozlabs.org; s=201707; t=1777485806;\n\tcv=none;\n b=KcAK4A+3/qBetfjDNB0hNdi2dfWRXaoUyKcgNjgT3OkRiE+A1F+q7oy3IuBKKM0C7QVncGYV2rbPiKjFopFI/KpKBgIsN9PNvntNigQkGa9ZzFGUL249gqfXiNNfm3TbLG2F7/HNp+iVSBskRSAjJ9BtuOp0j48sr3wA5hO88rSjaNW6kV32RckE3ISnIokWrgU7ufZHM/Xz7cKG9JhgF4/Fp0TzkpAbi1rHPPHWaxO/D3vWl2fnLjBl68kK9FUPMwidiTUUvWbcnMAIKVAhYDMoffvo/FpznBsNuQFezjzyYIQT0rPvdLq9tvQxBveo5c9pae+Verl4v+0sXesulA==","ARC-Message-Signature":"i=1; a=rsa-sha256; d=lists.ozlabs.org; s=201707;\n\tt=1777485806; c=relaxed/relaxed;\n\tbh=ChgtJK72vZUlsiBaKPcyKbWrS3ajSynsgsTRx3iHXAU=;\n\th=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References:\n\t In-Reply-To:To:Cc;\n b=iRbV6QTGw76ZDDOqQkWL7uyXM168Uc5T6TSKAvzMdZtgaQCxLo2E8rQsgZG1glA3JL/M5PNKo27Vf1F/pSruplZLdDg1XF8431nuV4AibtZrGEUWn4+SCEHhCHrclLEfPISL1cpnmMUnb0cabHBXOwTDvMO+BMqonVhMTf+frwVAgrZZvTwIa7LFh5tc8PFUKb9MkFmwjVBBXzwNSULypJkVHk2cXG23N/EBuDh9JGcvHJ76d3MeKySa9HX9Xrk1292VIk1p13piAZhknqM3he4PTYyBMLSva/3qE2+sUSRPDpYle/3deadIkLQbwve7K/i4Py3w0wqPq2Y0KpTACg==","ARC-Authentication-Results":"i=1; lists.ozlabs.org;\n dmarc=pass (p=reject dis=none) header.from=bootlin.com;\n dkim=pass (2048-bit key;\n unprotected) header.d=bootlin.com header.i=@bootlin.com header.a=rsa-sha256\n header.s=dkim header.b=K0amzfyc; dkim-atps=neutral;\n spf=pass (client-ip=185.246.84.56; helo=smtpout-02.galae.net;\n envelope-from=miquel.raynal@bootlin.com;\n receiver=lists.ozlabs.org) smtp.mailfrom=bootlin.com","X-Greylist":"delayed 337 seconds by postgrey-1.37 at boromir;\n Thu, 30 Apr 2026 04:03:23 AEST","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim;\n\tt=1777485474; h=from:subject:date:message-id:to:cc:mime-version:content-type:\n\t content-transfer-encoding:in-reply-to:references;\n\tbh=ChgtJK72vZUlsiBaKPcyKbWrS3ajSynsgsTRx3iHXAU=;\n\tb=K0amzfycc9kXe6uiG4uUt/UiAhIdiGMzKOl7+OtAUig03P9w5Oi4pi71lfOK4VzCWadfpc\n\tnS5TLgH8UeOpLv9oqplFB7SfTVmfJbMNIhuGL5isL94d1zok7pU+S8QA5DWBkSbgh28SJz\n\tDZearlJ5Cu/VO0kJdyM9+tAQscMA0+OXCO9beDN4ZJPGNWzVEq1MJI7sPFDuRqVpC63fLQ\n\tPic34fN8lxySr8+En0zBofRfLA+dt1XFD2tD6zmSWls95oUd8rvbzJXRh5bZmIbqP8kUKa\n\tE5JC9PYLpexMp71IOMLC7TSlwz1RJMfwhawHgZ7crGtjiqwa80VGQE5DnFcuTw==","From":"Miquel Raynal <miquel.raynal@bootlin.com>","Date":"Wed, 29 Apr 2026 19:56:42 +0200","Subject":"[PATCH v3 05/11] spi: spi-mem: Create a secondary read operation","X-Mailing-List":"linux-aspeed@lists.ozlabs.org","List-Id":"<linux-aspeed.lists.ozlabs.org>","List-Help":"<mailto:linux-aspeed+help@lists.ozlabs.org>","List-Owner":"<mailto:linux-aspeed+owner@lists.ozlabs.org>","List-Post":"<mailto:linux-aspeed@lists.ozlabs.org>","List-Archive":"<https://lore.kernel.org/linux-aspeed/>,\n  <https://lists.ozlabs.org/pipermail/linux-aspeed/>","List-Subscribe":"<mailto:linux-aspeed+subscribe@lists.ozlabs.org>,\n  <mailto:linux-aspeed+subscribe-digest@lists.ozlabs.org>,\n  <mailto:linux-aspeed+subscribe-nomail@lists.ozlabs.org>","List-Unsubscribe":"<mailto:linux-aspeed+unsubscribe@lists.ozlabs.org>","Precedence":"list","MIME-Version":"1.0","Content-Type":"text/plain; charset=\"utf-8\"","Content-Transfer-Encoding":"7bit","Message-Id":"\n <20260429-winbond-v6-18-rc1-cont-read-v3-5-0f38b3c229ad@bootlin.com>","References":"\n <20260429-winbond-v6-18-rc1-cont-read-v3-0-0f38b3c229ad@bootlin.com>","In-Reply-To":"\n <20260429-winbond-v6-18-rc1-cont-read-v3-0-0f38b3c229ad@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>,\n  Takahiro Kuwano <takahiro.kuwano@infineon.com>,\n  Lorenzo Bianconi <lorenzo@kernel.org>, Ray Liu <ray.liu@airoha.com>,\n  Chin-Ting Kuo <chin-ting_kuo@aspeedtech.com>, =?utf-8?q?C=C3=A9dric_Le_Goa?=\n\t=?utf-8?q?ter?= <clg@kaod.org>,  Joel Stanley <joel@jms.id.au>,\n Andrew Jeffery <andrew@codeconstruct.com.au>,\n  Avi Fishman <avifishman70@gmail.com>, Tomer Maimon <tmaimon77@gmail.com>,\n  Tali Perry <tali.perry1@gmail.com>, Patrick Venture <venture@google.com>,\n  Nancy Yuen <yuenn@google.com>, Benjamin Fair <benjaminfair@google.com>,\n  Maxime Coquelin <mcoquelin.stm32@gmail.com>,\n  Alexandre Torgue <alexandre.torgue@foss.st.com>, =?utf-8?q?Jonathan_Neusch?=\n\t=?utf-8?q?=C3=A4fer?= <j.neuschaefer@gmx.net>","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, linux-arm-kernel@lists.infradead.org,\n linux-aspeed@lists.ozlabs.org, openbmc@lists.ozlabs.org,\n linux-stm32@st-md-mailman.stormreply.com","X-Mailer":"b4 0.14.3","X-Last-TLS-Session-Version":"TLSv1.3","X-Spam-Status":"No, score=-0.2 required=5.0 tests=DKIM_SIGNED,DKIM_VALID,\n\tDKIM_VALID_AU,DKIM_VALID_EF,SPF_HELO_PASS,SPF_PASS autolearn=disabled\n\tversion=4.0.1","X-Spam-Checker-Version":"SpamAssassin 4.0.1 (2024-03-25) on lists.ozlabs.org"},"content":"In some situations, direct mappings may need to use different\noperation templates.\n\nFor instance, when enabling continuous reads, Winbond SPI NANDs no\nlonger expect address cycles because they would be ignoring them\notherwise. Hence, right after the command opcode, they start counting\ndummy cycles, followed by the data cycles as usual.\n\nThis breaks the assumptions of \"reads from cache\" always being done\nidentically once the best variant has been picked up, across the\nlifetime of the system.\n\nIn order to support this feature, we must give direct mapping more than\na single operation template to use, in order to switch to using\nsecondary operations upon request by the upper layer.\n\nCreate the concept of optional secondary operation template, which may\nor may not be fulfilled by the SPI NAND and SPI NOR cores. If the\nunderlying SPI controller does not leverage any kind of direct mapping\nacceleration, the feature has no impact and can be freely\nused. Otherwise, the controller driver needs to opt-in for using this\nfeature, if supported.\n\nThe condition checked to know whether a secondary operation has been\nprovided or not is to look for a non zero opcode to limit the creation\nof extra variables. In practice, the opcode 0x00 exist, but is not\nrelated to any cache related operation.\n\nAcked-by: Mark Brown <broonie@kernel.org>\nSigned-off-by: Miquel Raynal <miquel.raynal@bootlin.com>\n---\nThe choice of defining two variables named primary and secondary instead\nof using an array of templates is on purpose, to simplify the reading. I\nfind less obvious the use of an array here but this is personal taste.\n---\n drivers/spi/spi-mem.c       | 17 +++++++++++++++++\n include/linux/spi/spi-mem.h |  5 +++++\n 2 files changed, 22 insertions(+)","diff":"diff --git a/drivers/spi/spi-mem.c b/drivers/spi/spi-mem.c\nindex e2eaa1ba4ff6..f64eda9bbd9f 100644\n--- a/drivers/spi/spi-mem.c\n+++ b/drivers/spi/spi-mem.c\n@@ -713,6 +713,23 @@ spi_mem_dirmap_create(struct spi_mem *mem,\n \tif (info->primary_op_tmpl.data.dir == SPI_MEM_NO_DATA)\n \t\treturn ERR_PTR(-EINVAL);\n \n+\t/* Apply similar constraints to the secondary template */\n+\tif (info->secondary_op_tmpl.cmd.opcode) {\n+\t\tif (!info->secondary_op_tmpl.addr.nbytes ||\n+\t\t    info->secondary_op_tmpl.addr.nbytes > 8)\n+\t\t\treturn ERR_PTR(-EINVAL);\n+\n+\t\tif (info->secondary_op_tmpl.data.dir == SPI_MEM_NO_DATA)\n+\t\t\treturn ERR_PTR(-EINVAL);\n+\n+\t\tif (!spi_mem_supports_op(mem, &info->secondary_op_tmpl))\n+\t\t\treturn ERR_PTR(-EOPNOTSUPP);\n+\n+\t\tif (ctlr->mem_ops && ctlr->mem_ops->dirmap_create &&\n+\t\t    !spi_mem_controller_is_capable(ctlr, secondary_op_tmpl))\n+\t\t\treturn ERR_PTR(-EOPNOTSUPP);\n+\t}\n+\n \tdesc = kzalloc_obj(*desc);\n \tif (!desc)\n \t\treturn ERR_PTR(-ENOMEM);\ndiff --git a/include/linux/spi/spi-mem.h b/include/linux/spi/spi-mem.h\nindex 9a96ddace3eb..2012a3b2ef91 100644\n--- a/include/linux/spi/spi-mem.h\n+++ b/include/linux/spi/spi-mem.h\n@@ -227,6 +227,8 @@ struct spi_mem_op {\n  * struct spi_mem_dirmap_info - Direct mapping information\n  * @op_tmpl: operation template that should be used by the direct mapping when\n  *\t     the memory device is accessed\n+ * @secondary_op_tmpl: secondary template, may be used as an alternative to the\n+ *                     primary template (decided by the upper layer)\n  * @offset: absolute offset this direct mapping is pointing to\n  * @length: length in byte of this direct mapping\n  *\n@@ -239,6 +241,7 @@ struct spi_mem_op {\n struct spi_mem_dirmap_info {\n \tstruct spi_mem_op *op_tmpl;\n \tstruct spi_mem_op primary_op_tmpl;\n+\tstruct spi_mem_op secondary_op_tmpl;\n \tu64 offset;\n \tu64 length;\n };\n@@ -382,12 +385,14 @@ struct spi_controller_mem_ops {\n  * @swap16: Supports swapping bytes on a 16 bit boundary when configured in\n  *\t    Octal DTR\n  * @per_op_freq: Supports per operation frequency switching\n+ * @secondary_op_tmpl: Supports leveraging a secondary memory operation template\n  */\n struct spi_controller_mem_caps {\n \tbool dtr;\n \tbool ecc;\n \tbool swap16;\n \tbool per_op_freq;\n+\tbool secondary_op_tmpl;\n };\n \n #define spi_mem_controller_is_capable(ctlr, cap)\t\\\n","prefixes":["v3","05/11"]}