{"id":2220283,"url":"http://patchwork.ozlabs.org/api/1.1/patches/2220283/?format=json","web_url":"http://patchwork.ozlabs.org/project/uboot/patch/20260406-mtk-spi-nor-improvements-v1-2-66f675cbbd3e@baylibre.com/","project":{"id":18,"url":"http://patchwork.ozlabs.org/api/1.1/projects/18/?format=json","name":"U-Boot","link_name":"uboot","list_id":"u-boot.lists.denx.de","list_email":"u-boot@lists.denx.de","web_url":null,"scm_url":null,"webscm_url":null},"msgid":"<20260406-mtk-spi-nor-improvements-v1-2-66f675cbbd3e@baylibre.com>","date":"2026-04-06T20:13:28","name":"[2/8] spi: mtk_snor: avoid alloc in mtk_snor_cmd_program()","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"06690fdb5c5109dae6a932de1c8e3d9b5f6e3bca","submitter":{"id":87228,"url":"http://patchwork.ozlabs.org/api/1.1/people/87228/?format=json","name":"David Lechner","email":"dlechner@baylibre.com"},"delegate":{"id":161331,"url":"http://patchwork.ozlabs.org/api/1.1/users/161331/?format=json","username":"dlech","first_name":"David","last_name":"Lechner","email":"dlechner@baylibre.com"},"mbox":"http://patchwork.ozlabs.org/project/uboot/patch/20260406-mtk-spi-nor-improvements-v1-2-66f675cbbd3e@baylibre.com/mbox/","series":[{"id":498893,"url":"http://patchwork.ozlabs.org/api/1.1/series/498893/?format=json","web_url":"http://patchwork.ozlabs.org/project/uboot/list/?series=498893","date":"2026-04-06T20:13:26","name":"spi: mtk_snor: various fixes and improvements","version":1,"mbox":"http://patchwork.ozlabs.org/series/498893/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2220283/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2220283/checks/","tags":{},"headers":{"Return-Path":"<u-boot-bounces@lists.denx.de>","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 unprotected) header.d=baylibre-com.20251104.gappssmtp.com\n header.i=@baylibre-com.20251104.gappssmtp.com header.a=rsa-sha256\n header.s=20251104 header.b=g+3I5JXF;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de\n (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de;\n envelope-from=u-boot-bounces@lists.denx.de; receiver=patchwork.ozlabs.org)","phobos.denx.de;\n dmarc=none (p=none dis=none) header.from=baylibre.com","phobos.denx.de;\n spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de","phobos.denx.de;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=baylibre-com.20251104.gappssmtp.com\n header.i=@baylibre-com.20251104.gappssmtp.com header.b=\"g+3I5JXF\";\n\tdkim-atps=neutral","phobos.denx.de;\n dmarc=none (p=none dis=none) header.from=baylibre.com","phobos.denx.de;\n spf=pass smtp.mailfrom=dlechner@baylibre.com"],"Received":["from phobos.denx.de (phobos.denx.de\n [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01])\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 4fqLCV5XXSz1y2d\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 07 Apr 2026 06:14:46 +1000 (AEST)","from h2850616.stratoserver.net (localhost [IPv6:::1])\n\tby phobos.denx.de (Postfix) with ESMTP id C15518412A;\n\tMon,  6 Apr 2026 22:14:41 +0200 (CEST)","by phobos.denx.de (Postfix, from userid 109)\n id 82C8D84101; Mon,  6 Apr 2026 22:14:38 +0200 (CEST)","from mail-ot1-x32c.google.com (mail-ot1-x32c.google.com\n [IPv6:2607:f8b0:4864:20::32c])\n (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits))\n (No client certificate requested)\n by phobos.denx.de (Postfix) with ESMTPS id EFE7784034\n for <u-boot@lists.denx.de>; Mon,  6 Apr 2026 22:14:34 +0200 (CEST)","by mail-ot1-x32c.google.com with SMTP id\n 46e09a7af769-7d7eb85fb81so4316400a34.0\n for <u-boot@lists.denx.de>; Mon, 06 Apr 2026 13:14:34 -0700 (PDT)","from [127.0.1.1] ([2600:8803:e7e4:500:90d7:b13f:c53:8ca3])\n by smtp.gmail.com with ESMTPSA id\n 006d021491bc7-68597f6c7bdsm2642044eaf.3.2026.04.06.13.14.32\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Mon, 06 Apr 2026 13:14:33 -0700 (PDT)"],"X-Spam-Checker-Version":"SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de","X-Spam-Level":"","X-Spam-Status":"No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED,\n DKIM_VALID,RCVD_IN_DNSWL_BLOCKED,SPF_HELO_NONE,SPF_PASS autolearn=ham\n autolearn_force=no version=3.4.2","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=baylibre-com.20251104.gappssmtp.com; s=20251104; t=1775506474;\n x=1776111274;\n darn=lists.denx.de;\n h=cc:to:in-reply-to:references:message-id:content-transfer-encoding\n :mime-version:subject:date:from:from:to:cc:subject:date:message-id\n :reply-to; bh=VKGm7yhCsjipaFsCGLxtb8PswdRVNpcFQxW+zs2so2M=;\n b=g+3I5JXFhCdBCGoDUhHY6Azv5ox2Nv7YTPqcTUg/LV7k+jbPu+sWULTddVkK0mWQNQ\n a5HNHRhSnT537ISud51Sldhuwiv/rb0iBzIal3t+3aa8u1CRGv8bzCC0d4g5l6lkw61F\n oR70ZaIMx0M+doFaPcPc1PY1OMzuHNlfkyOqHvCneiA6bweNfFfRIEhIdaLn34qrBr0Q\n 9l9iAsS3tVmq1qxp/Rb2f1sIMEutiS9uUNKhdwgqzK8ZcsVC1cCIMUGsJXVrfi282Fg3\n ngUt/FmYMilMpp1hC7fyFBmfiJZvD6ne/Y3db4GMAZoq9XwhmEgbdk/uhgXpPyIEyDDL\n Rcgg==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1775506474; x=1776111274;\n h=cc:to:in-reply-to:references:message-id:content-transfer-encoding\n :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to\n :cc:subject:date:message-id:reply-to;\n bh=VKGm7yhCsjipaFsCGLxtb8PswdRVNpcFQxW+zs2so2M=;\n b=cvCGDI0zmzGdNFmHAmv2+PV7L0ypY0PV05NtDIRrBFsw6zwRRSbLSIATp2Ts/iGf7J\n +tpQSldl8EgmvjSeALl+5vKp1TRiBVWsnjE5n5LOSQZCfmYg0gm98xfJnTqxsxzZaGiz\n kWx0PwxzCSmVAnmVAH/vSkhaj/571XhlXPOvfHy09vOd4TDAOsrGM8hZ6xTYgK8657qq\n lAX23nSVCO46tO/BPCuWm8hsSbgfHg7oiWTOXTn7PHpG6d0KSJR8Cymfiic/gKGC/ldw\n 3c2gEuegHG5ZOrYiAnIQU4px4O0eKbcF2dDPcN5aCj8B5uy4b8GzVpyDGwKnDVPLygOq\n axFw==","X-Forwarded-Encrypted":"i=1;\n AJvYcCVhyxUdRv4yPCO0i4jB+1uZuGIQdVS0wJWZzS5+G3c2zN54BKKh5csvPCqe/iiUXmkkTI8qqc8=@lists.denx.de","X-Gm-Message-State":"AOJu0YzGESilOlYwDq0YbroA5Ntefarxb/+PptnTMYQZp4pV5ptkPpAb\n iDbI/jsnYysg4ozZPZDcnZAiXIvuixUCN9n0576UGadeGz26s/lG6UYtMkfT5mfIWLhhF+zYqMN\n jxcWs","X-Gm-Gg":"AeBDievLuELC1IG05mYlnWo9LRPiIZhJlbc4RCnyqz6jEd4FZ8K0iHR23lj1Ermu5WI\n 2GX96NOyzaNszjsvg1I4DRJu7J5GPKS7dXXe0Rm4UIaiVwqqAtE2NrhgKfGiAaRH3nwPsMwSXe4\n HhLpqkKoNmiGHSlKp1Tebf+ibsyGvhGZNc0siRD6RzgNWBE/JCi6p4QXZq6LGBKc0GEtHXs76eO\n jbc9sceVTz1sbZnjYOd2QPmHf8IScxF2yR2cO9x9/g3kQbI5hwxt3YnbTdtnsIKqgSBklxdRUx/\n dKDt0QDUe1yhUa71Lq9FCiRKjAgDqLfFxalHli3zLEKtdudYPEAIiLWD0zajM/Yx2bgOAxh1C1A\n zNOnBJLAhg8ic2N7kALAZNMvdUrnfORHnAEl14J5ZiXrZbVywyu6+921EufzO9af/YfjquU0ZkG\n nK5MyAgnNzouTXcU3mL26ESuHI9/A=","X-Received":"by 2002:a05:6820:4b86:b0:67b:de4d:f30a with SMTP id\n 006d021491bc7-6822094b344mr8024715eaf.46.1775506473708;\n Mon, 06 Apr 2026 13:14:33 -0700 (PDT)","From":"David Lechner <dlechner@baylibre.com>","Date":"Mon, 06 Apr 2026 15:13:28 -0500","Subject":"[PATCH 2/8] spi: mtk_snor: avoid alloc in mtk_snor_cmd_program()","MIME-Version":"1.0","Content-Type":"text/plain; charset=\"utf-8\"","Content-Transfer-Encoding":"7bit","Message-Id":"<20260406-mtk-spi-nor-improvements-v1-2-66f675cbbd3e@baylibre.com>","References":"<20260406-mtk-spi-nor-improvements-v1-0-66f675cbbd3e@baylibre.com>","In-Reply-To":"\n <20260406-mtk-spi-nor-improvements-v1-0-66f675cbbd3e@baylibre.com>","To":"Ryder Lee <ryder.lee@mediatek.com>, Weijie Gao <weijie.gao@mediatek.com>,\n Chunfeng Yun <chunfeng.yun@mediatek.com>,\n Igor Belwon <igor.belwon@mentallysanemainliners.org>,\n GSS_MTK_Uboot_upstream <GSS_MTK_Uboot_upstream@mediatek.com>,\n Tom Rini <trini@konsulko.com>","Cc":"Julien Stephan <jstephan@baylibre.com>, u-boot@lists.denx.de,\n David Lechner <dlechner@baylibre.com>, \"Noah.Shen\" <noah.shen@mediatek.com>,\n \"Noah.Shen\" <noah.shen@mediatek.com>","X-Mailer":"b4 0.16-dev","X-Developer-Signature":"v=1; a=openpgp-sha256; l=3788; i=dlechner@baylibre.com;\n h=from:subject:message-id;\n bh=MYJ8+w//x4zsArBlVUGfW1SKOP19RZGZatT9aBchbzg=;\n b=owEBhAF7/pANAwAKAcLMIAH/AY/AAcsmYgBp1BP4B8cKoEXEfR9h5+4oV93k3u8g235uQkoZq\n SaqsXICEOSJAUoEAAEKADQWIQTsGNmeYg6D1pzYaJjCzCAB/wGPwAUCadQT+BYcZGxlY2huZXJA\n YmF5bGlicmUuY29tAAoJEMLMIAH/AY/AQRoH/iT5YvSSVwzzyjFFuKm4TDFaAWgPIx3yPvN88N6\n 0PsYpfiiuOgEUsLxxycLyfMGhl0Cv/QT19WTJSII2wu/iGVTXHkfH0GIS5BqJYZVpHobj9aogSg\n uTDnDOZadBjGqY9mP7dL9iGQqiRhIvrs09Bk2pejiPR1/RuSlb+E+vWomyf/eXk+r0dek0nI10h\n XmTyUGUhET/CgUVbFs52Dj7jwNNGj3jHEkyIyERcL2FX9LAXT/5i33eGWC9qS0Sl7/DcWGMNGOm\n KOP0WSa+44Zo9PZshEhnIlU8zYl22rDiAFAknqStQoE6FZIYKQopTb12noEBK+AQuvHco/ZabSc\n idlQ=","X-Developer-Key":"i=dlechner@baylibre.com; a=openpgp;\n fpr=8A73D82A6A1F509907F373881F8AF88C82F77C03","X-BeenThere":"u-boot@lists.denx.de","X-Mailman-Version":"2.1.39","Precedence":"list","List-Id":"U-Boot discussion <u-boot.lists.denx.de>","List-Unsubscribe":"<https://lists.denx.de/options/u-boot>,\n <mailto:u-boot-request@lists.denx.de?subject=unsubscribe>","List-Archive":"<https://lists.denx.de/pipermail/u-boot/>","List-Post":"<mailto:u-boot@lists.denx.de>","List-Help":"<mailto:u-boot-request@lists.denx.de?subject=help>","List-Subscribe":"<https://lists.denx.de/listinfo/u-boot>,\n <mailto:u-boot-request@lists.denx.de?subject=subscribe>","Errors-To":"u-boot-bounces@lists.denx.de","Sender":"\"U-Boot\" <u-boot-bounces@lists.denx.de>","X-Virus-Scanned":"clamav-milter 0.103.8 at phobos.denx.de","X-Virus-Status":"Clean"},"content":"From: \"Noah.Shen\" <noah.shen@mediatek.com>\n\nRework mtk_snor_cmd_program() to avoid allocating a temporary buffer\nfor tx data. This improves performance a bit by avoiding the need to\nallocate memory and copy data an extra time.\n\nSigned-off-by: Noah.Shen <noah.shen@mediatek.com>\nSigned-off-by: David Lechner <dlechner@baylibre.com>\n---\n drivers/spi/mtk_snor.c | 77 +++++++++++++++++++++++++++++---------------------\n 1 file changed, 45 insertions(+), 32 deletions(-)","diff":"diff --git a/drivers/spi/mtk_snor.c b/drivers/spi/mtk_snor.c\nindex eb36c9dd5e8..0ff4a8b23d5 100644\n--- a/drivers/spi/mtk_snor.c\n+++ b/drivers/spi/mtk_snor.c\n@@ -383,50 +383,63 @@ static int mtk_snor_pp_unbuffered(struct mtk_snor_priv *priv,\n static int mtk_snor_cmd_program(struct mtk_snor_priv *priv,\n \t\t\t\tconst struct spi_mem_op *op)\n {\n-\tu32 tx_len = 0;\n-\tu32 trx_len = 0;\n+\tint rx_len = 0;\n \tint reg_offset = MTK_NOR_REG_PRGDATA_MAX;\n+\tint tx_len, prg_len;\n+\tint i;\n \tvoid __iomem *reg;\n-\tu8 *txbuf;\n-\tint tx_cnt = 0;\n-\tu8 *rxbuf = op->data.buf.in;\n-\tint i = 0;\n+\tu8 val;\n \n-\ttx_len = 1 + op->addr.nbytes + op->dummy.nbytes;\n-\ttrx_len = tx_len + op->data.nbytes;\n-\tif (op->data.dir == SPI_MEM_DATA_OUT)\n-\t\ttx_len += op->data.nbytes;\n-\n-\ttxbuf = kmalloc_array(tx_len, sizeof(u8), GFP_KERNEL);\n-\tmemset(txbuf, 0x0, tx_len * sizeof(u8));\n-\n-\t/* Join all bytes to be transferred */\n-\ttxbuf[tx_cnt] = op->cmd.opcode;\n-\ttx_cnt++;\n-\tfor (i = op->addr.nbytes; i > 0; i--, tx_cnt++)\n-\t\ttxbuf[tx_cnt] = ((u8 *)&op->addr.val)[i - 1];\n-\tfor (i = op->dummy.nbytes; i > 0; i--, tx_cnt++)\n-\t\ttxbuf[tx_cnt] = 0x0;\n+\ttx_len = op->cmd.nbytes + op->addr.nbytes;\n+\n+\t/* count dummy bytes only if we need to write data after it */\n \tif (op->data.dir == SPI_MEM_DATA_OUT)\n-\t\tfor (i = op->data.nbytes; i > 0; i--, tx_cnt++)\n-\t\t\ttxbuf[tx_cnt] = ((u8 *)op->data.buf.out)[i - 1];\n+\t\ttx_len += op->dummy.nbytes + op->data.nbytes;\n+\telse if (op->data.dir == SPI_MEM_DATA_IN)\n+\t\trx_len = op->data.nbytes;\n \n-\tfor (i = MTK_NOR_REG_PRGDATA_MAX; i >= 0; i--)\n-\t\twriteb(0, priv->base + MTK_NOR_REG_PRGDATA(i));\n+\tprg_len = op->cmd.nbytes + op->addr.nbytes + op->dummy.nbytes +\n+\t\t  op->data.nbytes;\n \n-\tfor (i = 0; i < tx_len; i++, reg_offset--)\n-\t\twriteb(txbuf[i], priv->base + MTK_NOR_REG_PRGDATA(reg_offset));\n+\t/* fill tx data */\n \n-\tkfree(txbuf);\n+\tfor (i = op->cmd.nbytes; i > 0; i--, reg_offset--) {\n+\t\treg = priv->base + MTK_NOR_REG_PRGDATA(reg_offset);\n+\t\tval = (op->cmd.opcode >> ((i - 1) * BITS_PER_BYTE)) & 0xff;\n+\t\twriteb(val, reg);\n+\t}\n \n-\twritel(trx_len * BITS_PER_BYTE, priv->base + MTK_NOR_REG_PRG_CNT);\n+\tfor (i = op->addr.nbytes; i > 0; i--, reg_offset--) {\n+\t\treg = priv->base + MTK_NOR_REG_PRGDATA(reg_offset);\n+\t\tval = (op->addr.val >> ((i - 1) * BITS_PER_BYTE)) & 0xff;\n+\t\twriteb(val, reg);\n+\t}\n \n-\tmtk_snor_cmd_exec(priv, MTK_NOR_CMD_PROGRAM, trx_len * BITS_PER_BYTE);\n+\tfor (i = 0; i < op->dummy.nbytes; i++, reg_offset--) {\n+\t\treg = priv->base + MTK_NOR_REG_PRGDATA(reg_offset);\n+\t\twriteb(0, reg);\n+\t}\n \n-\treg_offset = op->data.nbytes - 1;\n \tfor (i = 0; i < op->data.nbytes; i++, reg_offset--) {\n+\t\treg = priv->base + MTK_NOR_REG_PRGDATA(reg_offset);\n+\t\twriteb(((const u8 *)(op->data.buf.out))[i], reg);\n+\t}\n+\n+\tfor (; reg_offset >= 0; reg_offset--) {\n+\t\treg = priv->base + MTK_NOR_REG_PRGDATA(reg_offset);\n+\t\twriteb(0, reg);\n+\t}\n+\n+\t/* trigger op */\n+\twritel(prg_len * BITS_PER_BYTE, priv->base + MTK_NOR_REG_PRG_CNT);\n+\n+\tmtk_snor_cmd_exec(priv, MTK_NOR_CMD_PROGRAM, prg_len * BITS_PER_BYTE);\n+\n+\t/* fetch read data */\n+\treg_offset = 0;\n+\tfor (i = op->data.nbytes - 1; i >= 0; i--, reg_offset++) {\n \t\treg = priv->base + MTK_NOR_REG_SHIFT(reg_offset);\n-\t\trxbuf[i] = readb(reg);\n+\t\t((u8 *)(op->data.buf.in))[i] = readb(reg);\n \t}\n \n \treturn 0;\n","prefixes":["2/8"]}