From nobody Mon Apr 6 10:43:32 2026 Received: from mail-pl1-f175.google.com (mail-pl1-f175.google.com [209.85.214.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E76BC329C67 for ; Thu, 5 Mar 2026 07:12:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772694775; cv=none; b=Sqr8M3lpj0G+IDWXs3AGKvdG8oYu3uJEcEsMLguYjpPRu7B9Y2h8WOKz4XOFkLhlKO7mJFhyVbbN38jK1dyYsr7TH1Y4DFfNMoLxZtfRdN0TWdbbwXrTmbvHitHwyurQtzKY46cEMCR8ellJiO//ChjKAHM5SG0luZb69dkLecY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772694775; c=relaxed/simple; bh=KK/RfrneX26MbnhhIHZJrPe9nQFBKGB8P79R9Zne4HA=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=F71wh5FlBOn/9pedK6otzD0yNC0+yAqAjPkNYp6UYJnxNscrhEHFgHdL3s3a6OsCyx4TxpHXfWnVgm3pbkfLFatBeTOWlUi9ozFFz5E+SbXGrdb1JidzI48oLwwcEaiqeWqYCG2ugJBNOPpXsj8rPKyAAxmcNezLNRkMoVnfbdQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=AUIomeja; arc=none smtp.client-ip=209.85.214.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="AUIomeja" Received: by mail-pl1-f175.google.com with SMTP id d9443c01a7336-2a8fba3f769so34079055ad.2 for ; Wed, 04 Mar 2026 23:12:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772694773; x=1773299573; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ajhw8hYpqHjqV3r6yWVus18nRMpwuD8YgLrA+5qE4SA=; b=AUIomejak5dmqxZ0xhKYTm4dlZkIcDmW/TSR5WYQOQc5uj71bwh9RhdeR/nw9uWFMn u9+wxbH05Ui5uNvM/ZInnBdWyPjcFua3frNaVhVY+1+PW+kb/tAF+XfZx+K3PtDeMASG kxRqRwXYRizMDoThiMh78awVHJBdiMymZKUPbSielPzhz+ceAGa7IYad4/yytTzhdpv7 KmYyQa1vcOL+SM7ozz1ChwkE0Q+xb7AFmDK10bueN3MtaL84WzdaSQC3mSQ+22fM2AAc eD4jKo1NsJ0B/rxEY1OAalp41+XD6/oapfjArsPBBtCVwI8oT2hIw/pdgih2PftCSoWd 2lzA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772694773; x=1773299573; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=ajhw8hYpqHjqV3r6yWVus18nRMpwuD8YgLrA+5qE4SA=; b=jslw+luuCyZJnZ9tAhmhhUOxdh8g2oqTC3f3aRt45Xvvi6Sn6DglRetR7J5KeqLhmq oZ9nu/76t39k1j36jmHssX/TAYK3D22R+b+DsT0OYkcvZWolf5hbykxr6e7MI9OiRPwv 4CJ3IuM05swhwh3NemenYSvPGSR3ErgHdOC8836TeMot2L/xGLiJn+XfPYiwBTcaVdiz GLqJcvtYPrrc+HdJ3Ef72Kc6DNo5ChyZUCVa5WURmlGppJb2HSnSymafl1zEW3ciUhoS f18jS5mm1OVs6k/Rp1AlAlJKoXKN8M2HqoRt1TgmAlTzCOV/uRdU7mcxO78iAmN6GFOu qANw== X-Forwarded-Encrypted: i=1; AJvYcCUc7gIv5JE4aUFCCz+9qZRODxzS+ngDTmMRuQWcBDkto8LIWPfWB6mnawb9RO1QBtHCmYKqhkIc5lJxkK4=@vger.kernel.org X-Gm-Message-State: AOJu0YylOrxN23tE7jdkZA9iLclEalkl2Mxg590RZdvT7GaSrZ8pgTcI lErFxfyQy0tOxHryu/LosKyPVgf/Z5I9PtpaJv3U8SgD8RjDgXK/A5LR X-Gm-Gg: ATEYQzwgtiiQMD/P7tuy/jBlt9sL2bJTT8XB2xqVTHaAgdhEhKdWyFCCkV+XD3IXe4S SOzVtIwIj16+p8bVf2b79trRDu9784zeA8ixmMtOG/j47NjRveOG39G5f26zOSX0fmoQRLN1vTD hFLUbIwRb8zOum/Iw7erC8KixuF01qJ3zw7RlnV7DJW6FAEvATn0GjZKG0tFvxO3UnZPZCy8NIN VT9CixzfY9PT6uMPs8um6NDyyV0LTqOXmXFehp51/uaWnWPyYhMDvDWKAWquv56GA7q9GGH5Mh8 /UsmqcV4qgM4Nl9NIQW/07Jp4vhyYtS1Kig4xngzoADITMkHpqtfEFAZFAbqVWqKYx3dLWWc4za 4HzxH65Op3AAXLohV/IcROLTAYEUNPc9ZGWKv9FGuQVEy32f/JnHup0aZf5YfxINATURqmMCUv8 977Pu5Q2kOVN9DLHp6VQpy9mA2cds2HyztuSIlW2KBVeyPDw== X-Received: by 2002:a17:902:c94a:b0:2ad:ca65:a398 with SMTP id d9443c01a7336-2ae6abe7cd8mr42850435ad.57.1772694773349; Wed, 04 Mar 2026 23:12:53 -0800 (PST) Received: from twhmp6px (mxsmtp211.mxic.com.tw. [211.75.127.162]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2adfb6a03fbsm283865575ad.43.2026.03.04.23.12.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 04 Mar 2026 23:12:52 -0800 (PST) Received: from hqs-appsw-a2o.mp600.macronix.com (unknown [172.17.236.67]) by twhmp6px (Postfix) with ESMTPS id B62F94163B6B; Thu, 5 Mar 2026 15:12:50 +0800 (CST) From: Cheng Ming Lin To: Miquel Raynal , Richard Weinberger , Vignesh Raghavendra , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: Tudor Ambarus , Mikhail Kshevetskiy , Pablo Martin-Gomez , Tianling Shen , Pratyush Yadav , linux-mtd@lists.infradead.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, alvinzhou@mxic.com.tw, Cheng Ming Lin Subject: [PATCH v8 1/3] dt-bindings: mtd: spinand: Add randomizer enable/disable properties Date: Thu, 5 Mar 2026 15:10:40 +0800 Message-Id: <20260305071042.1193522-2-linchengming884@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20260305071042.1193522-1-linchengming884@gmail.com> References: <20260305071042.1193522-1-linchengming884@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Cheng Ming Lin Add "nand-randomizer-enable" and "nand-randomizer-disable" boolean properties. These properties allow enabling or disabling the randomizer feature via the device tree. According to JEDEC standard JESD22-A117E, no single data pattern represents a universal worst-case for all NAND flash failure mechanisms. Different patterns, such as fully programmed, checkerboard, or mostly erased, can disproportionately stress specific cells (e.g., programmed, erased, or those influenced by adjacent states). Given that no fixed pattern can cover all scenarios, the use of a randomized data pattern is a practical and effective mitigation strategy. Our hardware implements a randomizer feature that scrambles user data before it is written to the flash and restores the original data upon read. This ensures the data stored on the media is more evenly distributed, thus reducing pattern-dependent degradation. This is especially crucial for preventing errors caused by unbalanced data (e.g., all zeros or all ones) in blocks with high program/erase (P/E) cycle counts. Ultimately, the randomizer improves the long-term reliability and endurance of the flash device. Signed-off-by: Cheng Ming Lin --- .../devicetree/bindings/mtd/nand-chip.yaml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Documentation/devicetree/bindings/mtd/nand-chip.yaml b/Documen= tation/devicetree/bindings/mtd/nand-chip.yaml index 609d4a4ddd80..2559cd97ccc5 100644 --- a/Documentation/devicetree/bindings/mtd/nand-chip.yaml +++ b/Documentation/devicetree/bindings/mtd/nand-chip.yaml @@ -67,6 +67,24 @@ properties: the secure regions present. $ref: /schemas/types.yaml#/definitions/uint64-matrix =20 + nand-randomizer-enable: + description: + Enable the randomizer feature. This property is mutually-exclusive + with nand-randomizer-disable. + type: boolean + + nand-randomizer-disable: + description: + Disable the randomizer feature. This property is mutually-exclusive + with nand-randomizer-enable. + type: boolean + +dependencies: + nand-randomizer-enable: + not: + required: + - nand-randomizer-disable + required: - reg =20 --=20 2.25.1 From nobody Mon Apr 6 10:43:32 2026 Received: from mail-pl1-f179.google.com (mail-pl1-f179.google.com [209.85.214.179]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9EE54313543 for ; Thu, 5 Mar 2026 07:12:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772694775; cv=none; b=kKUnHpoXquo4YHbKdzXbqo44rkRpsJvOZZs7gKeG/31nNLavGXjqSvZZ/QzNkznzIn3eoYhLYRZUJfjPHZJPNEnqbacfsR5Nhio1UJdhkXPD76sTTii6hsMnsj1Ws3j8Q4se+X7CQXLalRGU0eBEp6A+SF0tioLIY1qKK7ql2Bc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772694775; c=relaxed/simple; bh=A0cKTP/NcPWurRQx3wyGtZw1VFNDkseDTGwzrhDZmHE=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=i6d4u97VzpFruF7tJx1WjT5mEykw9wNBBuQOPnS4PUekCjMPUiLWaLImnRVccomafxyoecU4bI3jlgbhWcQl4nMil4d8xEtc30ku9LRpJWnqq4slqP0yq2DS4Umixx5jOv94kDvzMTvZGmvFrhxac4l+p7B/hPB8ZWnsg7g8jDo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=QAZDvYvq; arc=none smtp.client-ip=209.85.214.179 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="QAZDvYvq" Received: by mail-pl1-f179.google.com with SMTP id d9443c01a7336-2ad9516a653so32114465ad.0 for ; Wed, 04 Mar 2026 23:12:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772694773; x=1773299573; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=nILoW48W9hqLRwmHITphjoIJRhEY+2JRSNwPbSj3wbI=; b=QAZDvYvqeK9boCHTvE1AcCc29dsBfWcVnSf3yzXNxuGohAp2fxjD/E5v8kK/kbyZj7 5sS+oP/OB3W70hnZY9jxPuEvUxU9q0Z8vBeMQtc3Q9rjicCWgFUmlQG2PVzou8YCxxV1 TmjFMOtjmotjVQwubwZFWuWO9YNf98ypsLd3VkpBLyBlU3efJ3q6hUR/8vWiUUhwATSZ VIUHEUcYkg6LnT8+Fbw/ZNvj6SQ/uhxgKhWUMbsU4c15HP68MNqEEqs72oY9mIvYgu8a 17RTOZ+PWCM8ruxUSS831kLRJqkG828IzpyCeKzky5F0JCIL5mp9eCBX65v7X8Qp8ADG G/CQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772694773; x=1773299573; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=nILoW48W9hqLRwmHITphjoIJRhEY+2JRSNwPbSj3wbI=; b=kOQM14ECfC1whH8/Zrf+DDcXiBax8HIs77Pb60911sgXyDkYSNHobKVg79FofCMGXW ms+hb/XEdygq/tjRVc/e3dm30eyNFNQIYVVUP8Qy8Pe5QNkGDGuz0HuiXBwGC1ec4FcS aUiMzHCkD1Cb/4FzWO7ZISfXYB9gIX3h/wuQ2njDozpJnh7G6LdNVYi55FTwonKno28b OZIPiDxdCxTXXde3pKrabky2ErGyMC2SHYJCQR9IAzV4lMBnrGR3CYR9itlgZuGUrrCG kOZKNUaC5SqOq/9jh3GOApBX8rEN/hdl40ejzNjOGKqhPlxHlz/TTZBX+dXdV25ZCopI ZrIA== X-Forwarded-Encrypted: i=1; AJvYcCXfR/DgxX5TFGVdertjXf8+yW2orrnmD+W0ljjiiSOSNVH4z16t5IEELIlRy3GZw20yKTOrCWCQ01bymeQ=@vger.kernel.org X-Gm-Message-State: AOJu0YzvCuLXm0ngeGn1NONlIoF/nBYdJhTnUifrc02REeQoAdf6MXed sYKjAvpt47qQpXzK8/CPUGzPTQNDiFOCWcHXo/yopblQSME+bmrlXJc0 X-Gm-Gg: ATEYQzxw2a+3ra6oUPUQOgFzCcaxKA5NgihjkcU3gTj5PsXY0LnSJrAPt96uuOA+jfh x3HMKLu89vhz2VjHAlHnGVrsE9/RavZyJ2KkzhBNeXD2Rw1AE6lcf1Dn3h4pvq9jMBv352oo37p FLBdwGUxtaoH7G0eOOc9dz33+pOhopffsWHlGKKsD7s2Jt49lNe8EMOABxMKWBTbvvUL8QUpkFs ra8+E0KgB6BJHwMKa1LyGdtiAVGAY7ZcU0XdmtqWbOVN6zb3/CjqxVfc3e7i+mAGVIRMO6Fq8rp 6ddftOdbQFq9Xo/lXjouRPODvYdIk8Uts1gg9zfcNkbm5LKPZajE56U5bc4jK/nDn1alGAX+KU0 W4TExGJamSHwhaOl5uXBYyhOYrhhmlguTCe/LcRVhTZWK85QE+aFoTKY+XAiOOYwHLrRd9jaAfU fEJY1lUDm5p6GDyqUfnYIFgyj3kU21miBkAhtSFPGbRBhlxQ== X-Received: by 2002:a17:902:db0f:b0:2ae:57e6:616c with SMTP id d9443c01a7336-2ae6a9c6eecmr45501805ad.3.1772694772962; Wed, 04 Mar 2026 23:12:52 -0800 (PST) Received: from twhmp6px (mxsmtp211.mxic.com.tw. [211.75.127.162]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2adfb69ef1csm227491785ad.53.2026.03.04.23.12.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 04 Mar 2026 23:12:52 -0800 (PST) Received: from hqs-appsw-a2o.mp600.macronix.com (unknown [172.17.236.67]) by twhmp6px (Postfix) with ESMTPS id B91B74163B71; Thu, 5 Mar 2026 15:12:50 +0800 (CST) From: Cheng Ming Lin To: Miquel Raynal , Richard Weinberger , Vignesh Raghavendra , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: Tudor Ambarus , Mikhail Kshevetskiy , Pablo Martin-Gomez , Tianling Shen , Pratyush Yadav , linux-mtd@lists.infradead.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, alvinzhou@mxic.com.tw, Cheng Ming Lin Subject: [PATCH v8 2/3] mtd: spi-nand: Add support for randomizer Date: Thu, 5 Mar 2026 15:10:41 +0800 Message-Id: <20260305071042.1193522-3-linchengming884@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20260305071042.1193522-1-linchengming884@gmail.com> References: <20260305071042.1193522-1-linchengming884@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Cheng Ming Lin This patch adds support for the randomizer feature. It introduces a 'set_randomizer' callback in 'struct spinand_info' and 'struct spinand_device'. If a driver implements this callback, the core will invoke it during device initialization (spinand_init) to enable or disable the randomizer feature based on the device tree configuration. Signed-off-by: Cheng Ming Lin --- drivers/mtd/nand/spi/core.c | 27 +++++++++++++++++++++++++++ include/linux/mtd/spinand.h | 9 +++++++++ 2 files changed, 36 insertions(+) diff --git a/drivers/mtd/nand/spi/core.c b/drivers/mtd/nand/spi/core.c index 8aa3753aaaa1..77a0371010c4 100644 --- a/drivers/mtd/nand/spi/core.c +++ b/drivers/mtd/nand/spi/core.c @@ -1307,6 +1307,29 @@ static int spinand_create_dirmaps(struct spinand_dev= ice *spinand) return 0; } =20 +static int spinand_randomizer_init(struct spinand_device *spinand) +{ + struct device_node *np =3D spinand->spimem->spi->dev.of_node; + bool enable =3D false; + int ret; + + if (!spinand->set_randomizer) + return 0; + + if (of_property_read_bool(np, "nand-enable-randomizer")) + enable =3D true; + else if (of_property_read_bool(np, "nand-disable-randomizer")) + enable =3D false; + else + return 0; + + ret =3D spinand->set_randomizer(spinand, enable); + if (ret) + return ret; + + return 0; +} + static const struct nand_ops spinand_ops =3D { .erase =3D spinand_erase, .markbad =3D spinand_markbad, @@ -1594,6 +1617,7 @@ int spinand_match_and_init(struct spinand_device *spi= nand, spinand->user_otp =3D &table[i].user_otp; spinand->read_retries =3D table[i].read_retries; spinand->set_read_retry =3D table[i].set_read_retry; + spinand->set_randomizer =3D table[i].set_randomizer; =20 /* I/O variants selection with single-spi SDR commands */ =20 @@ -1881,6 +1905,9 @@ static int spinand_init(struct spinand_device *spinan= d) * ECC initialization must have happened previously. */ spinand_cont_read_init(spinand); + ret =3D spinand_randomizer_init(spinand); + if (ret) + goto err_cleanup_nanddev; =20 mtd->_read_oob =3D spinand_mtd_read; mtd->_write_oob =3D spinand_mtd_write; diff --git a/include/linux/mtd/spinand.h b/include/linux/mtd/spinand.h index 6a024cf1c53a..6a68a6c3866a 100644 --- a/include/linux/mtd/spinand.h +++ b/include/linux/mtd/spinand.h @@ -584,6 +584,7 @@ enum spinand_bus_interface { * @user_otp: SPI NAND user OTP info. * @read_retries: the number of read retry modes supported * @set_read_retry: enable/disable read retry for data recovery + * @set_randomizer: enable/disable randomizer support * * Each SPI NAND manufacturer driver should have a spinand_info table * describing all the chips supported by the driver. @@ -612,6 +613,8 @@ struct spinand_info { unsigned int read_retries; int (*set_read_retry)(struct spinand_device *spinand, unsigned int read_retry); + int (*set_randomizer)(struct spinand_device *spinand, + bool enable); }; =20 #define SPINAND_ID(__method, ...) \ @@ -668,6 +671,9 @@ struct spinand_info { .read_retries =3D __read_retries, \ .set_read_retry =3D __set_read_retry =20 +#define SPINAND_RANDOMIZER(__set_randomizer) \ + .set_randomizer =3D __set_randomizer + #define SPINAND_INFO(__model, __id, __memorg, __eccreq, __op_variants, \ __flags, ...) \ { \ @@ -753,6 +759,7 @@ struct spinand_mem_ops { * @user_otp: SPI NAND user OTP info. * @read_retries: the number of read retry modes supported * @set_read_retry: Enable/disable the read retry feature + * @set_randomizer: Enable/disable the randomizer feature */ struct spinand_device { struct nand_device base; @@ -786,6 +793,8 @@ struct spinand_device { bool cont_read_possible; int (*set_cont_read)(struct spinand_device *spinand, bool enable); + int (*set_randomizer)(struct spinand_device *spinand, + bool enable); =20 const struct spinand_fact_otp *fact_otp; const struct spinand_user_otp *user_otp; --=20 2.25.1 From nobody Mon Apr 6 10:43:32 2026 Received: from mail-pf1-f180.google.com (mail-pf1-f180.google.com [209.85.210.180]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 65F35328B77 for ; Thu, 5 Mar 2026 07:12:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772694777; cv=none; b=hvzN3JtbRekwIiRx4DyUH9bHH8ZHd2JTWn5/mRSSduAknPAITarxT2etJ5Yk/7gOsYNQYZ+WHB3etcnkJQ6kkkUgZk9oWuE9aR7/cKDQLmMWbH2yRimf5Srde/0xNhktZftgKHwhIozUKj0aZh2ryeGO9CRHULjDm4yf5yIp1Do= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772694777; c=relaxed/simple; bh=zSey4JmxR0mKtyd7baVSEA6f7u4t3leuToTkJw1Iazk=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=GjNCvE5OJSHL/pB7QM0jD1OisdI7N3zWM01xX4+FqN/XCFWelWKMPJm1nUCoPZ4G1tovrADU8VdfJ5BC29/pGHEXsbtI8YC2qDAkKnZRcfp3zb8s/zgugS1/7OvsaKKHWZF07qWHcvrt8exOs2uC2e6fHpoqHihxh1vxLX3ivaE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=brAf8d27; arc=none smtp.client-ip=209.85.210.180 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="brAf8d27" Received: by mail-pf1-f180.google.com with SMTP id d2e1a72fcca58-824a829f9bbso3666964b3a.0 for ; Wed, 04 Mar 2026 23:12:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772694774; x=1773299574; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=8aIGlyOzKqFOkPBlr/GKgJ5SMsPwq+ibKKXshl+7xEI=; b=brAf8d27JEVqJLNQC0wHPRwCpgYWbOZ3bJXVjcQ0zm3FERtvLgPDg0ncSA2t2OgGem PCBw033AI/vOHiNfJcHGbVSdwm8rT6jUQiaq5gXaWziz/ud2xNY1gakAQTXGGs+zvSAG QTB0hyBM3s217xl1+paKy9VzVbiAeuqsj3TpSDDW2DaVCTZyZq7OXjU1OlHfBkkpyu9q ABp5sxZM20CHyoSTMHbB9gZH8LchaG3S9tn0rBMmeHZdmSQHVJON8V+5KfK9C+uTu2Dm kMJ69Ai0JtOHe7xmZ8pFmN0fe6ta04PgaDGwoxOrtgFnyKVy93MWuqgorjN5qk0kdqUu hrAg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772694774; x=1773299574; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=8aIGlyOzKqFOkPBlr/GKgJ5SMsPwq+ibKKXshl+7xEI=; b=qUTEe+LC/0ZJO5wbgXg4IxlmPlPjky5VM1hkGSyW2MgqPr9KpZ3Fuo8+1A5ScxGZkU rgQaggaZ7NzJcqALbvx8BTnCp5IIfQ9YaoLdwmApYZaJODQRYRYodozonU0hlVzeNdHY qKnyD9Pfw3Nqbhqh/rtMTxDwbf0S/k5x1omb55/J+TXpgEtvuFrtDsR+lOz/zST0MM7D 9begE69Xe1GmtZMA2UueRs1g5XT8y+emOpat7Ms3Xs491MOAu8MPUwpR8cKTDW9ZhKDJ +55UBmgXd0dyRhjWAo1j4YyorcBDRvOUpz6LZba1cyEjleNzS0T4M7VuZcFfj1pHvI2/ +j5g== X-Forwarded-Encrypted: i=1; AJvYcCV1u6hnpkloyXMsGzkc9xoBc+fOAoAC10Yd76z7/jeGJ2d4AuiW27dVjGzQveG2Zw/NixkYwCIyZ+CaSqw=@vger.kernel.org X-Gm-Message-State: AOJu0YzJ5eFjzw83o0J4Qc0SxbaoYwqDzrTxqs1PGZe3BF8/6u70Jtlp YkGNsFuHY3MXmibBGp2eBfGSiaUnRCWK2JohpU27QsMrI1PIErxZvnQI X-Gm-Gg: ATEYQzwzn53QQroJWbecbXOjvIe2KwRzYQh7lDl8n3aQ7stqsG7IzrFSz3gf+QjBxaE uRPvt417bgvylu3hLdDE8Tc5O7W/hkqw0LoSSPBhMR+8NRZ1xBcFaNp0n3k4q0GPLBZGPl0wHyc qFflVJOEgxpF5O8EM0zgjQa+5/YSH+Dq/XV5KOuuOG+jwGOleQKlQTCXxEU20d0wGWxps8DmaiM kytcUJ4eDwky6zs+T66ZtoX3rNoeaTtqlRs+ukRFFRb1fssvfXxpOF7jOtjZ/3S5SIccrkuMFOP ddzy6Svy2Udyt2atneC+pX5Ur4cN5sUbe9aF56zV0/0mUqk/I41muBUuLZhEPneZa/0m7aoFDgz 5lyj5Ye3Hr70FOhtXXDSQqJjAuICaMCCzQauoT4fkE07Ij8wOOZ2m6XTyje43YPRT069orONuuS Qdr5p6JyVnEiweelESSg+AtyYOfjuHmF8+iiOMnqZFoQcWQ97oGva0ICMH X-Received: by 2002:a05:6a20:ce4d:b0:38e:53cc:3bb0 with SMTP id adf61e73a8af0-3982deb4e17mr4746429637.19.1772694773785; Wed, 04 Mar 2026 23:12:53 -0800 (PST) Received: from twhmp6px (mxsmtp211.mxic.com.tw. [211.75.127.162]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-c7378d24c99sm3488488a12.6.2026.03.04.23.12.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 04 Mar 2026 23:12:53 -0800 (PST) Received: from hqs-appsw-a2o.mp600.macronix.com (unknown [172.17.236.67]) by twhmp6px (Postfix) with ESMTPS id BC2534163B76; Thu, 5 Mar 2026 15:12:50 +0800 (CST) From: Cheng Ming Lin To: Miquel Raynal , Richard Weinberger , Vignesh Raghavendra , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: Tudor Ambarus , Mikhail Kshevetskiy , Pablo Martin-Gomez , Tianling Shen , Pratyush Yadav , linux-mtd@lists.infradead.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, alvinzhou@mxic.com.tw, Cheng Ming Lin Subject: [PATCH v8 3/3] mtd: spi-nand: macronix: Enable randomizer support Date: Thu, 5 Mar 2026 15:10:42 +0800 Message-Id: <20260305071042.1193522-4-linchengming884@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20260305071042.1193522-1-linchengming884@gmail.com> References: <20260305071042.1193522-1-linchengming884@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Cheng Ming Lin Implement the 'set_randomizer' callback for Macronix SPI NAND chips. The randomizer is enabled by setting bit 1 of the Configuration Register (address 0x10). This patch adds support for the following chips: - MX35LFxG24AD series - MX35UFxG24AD series When the randomizer is enabled, data is scrambled internally during program operations and automatically descrambled during read operations. This helps reduce bit errors caused by program disturbance. Please refer to the following link for randomizer feature: Link: https://www.mxic.com.tw/Lists/ApplicationNote/Attachments/2151/AN1051= V1-The%20Introduction%20of%20Randomizer%20Feature%20on%20MX30xFxG28AD_MX35x= FxG24AD.pdf Signed-off-by: Cheng Ming Lin --- drivers/mtd/nand/spi/macronix.c | 38 ++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/drivers/mtd/nand/spi/macronix.c b/drivers/mtd/nand/spi/macroni= x.c index 67cafa1bb8ef..7dfcc34e9b72 100644 --- a/drivers/mtd/nand/spi/macronix.c +++ b/drivers/mtd/nand/spi/macronix.c @@ -14,6 +14,8 @@ #define MACRONIX_ECCSR_BF_LAST_PAGE(eccsr) FIELD_GET(GENMASK(3, 0), eccsr) #define MACRONIX_ECCSR_BF_ACCUMULATED_PAGES(eccsr) FIELD_GET(GENMASK(7, 4)= , eccsr) #define MACRONIX_CFG_CONT_READ BIT(2) +#define MACRONIX_CFG_RANDOMIZER_EN BIT(1) +#define MACRONIX_FEATURE_ADDR_RANDOMIZER 0x10 #define MACRONIX_FEATURE_ADDR_READ_RETRY 0x70 #define MACRONIX_NUM_READ_RETRY_MODES 5 =20 @@ -170,6 +172,12 @@ static int macronix_set_read_retry(struct spinand_devi= ce *spinand, return spi_mem_exec_op(spinand->spimem, &op); } =20 +static int macronix_set_randomizer(struct spinand_device *spinand, bool en= able) +{ + return spinand_write_reg_op(spinand, MACRONIX_FEATURE_ADDR_RANDOMIZER, + enable ? MACRONIX_CFG_RANDOMIZER_EN : 0); +} + static const struct spinand_info macronix_spinand_table[] =3D { SPINAND_INFO("MX35LF1GE4AB", SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x12), @@ -231,7 +239,8 @@ static const struct spinand_info macronix_spinand_table= [] =3D { SPINAND_HAS_QE_BIT, SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, NULL), SPINAND_READ_RETRY(MACRONIX_NUM_READ_RETRY_MODES, - macronix_set_read_retry)), + macronix_set_read_retry), + SPINAND_RANDOMIZER(macronix_set_randomizer)), SPINAND_INFO("MX35LF2G24AD", SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x24, 0x03), NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 2, 1, 1), @@ -243,7 +252,8 @@ static const struct spinand_info macronix_spinand_table= [] =3D { SPINAND_HAS_PROG_PLANE_SELECT_BIT, SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, NULL), SPINAND_READ_RETRY(MACRONIX_NUM_READ_RETRY_MODES, - macronix_set_read_retry)), + macronix_set_read_retry), + SPINAND_RANDOMIZER(macronix_set_randomizer)), SPINAND_INFO("MX35LF2G24AD-Z4I8", SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x64, 0x03), NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1), @@ -254,7 +264,8 @@ static const struct spinand_info macronix_spinand_table= [] =3D { SPINAND_HAS_QE_BIT, SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, NULL), SPINAND_READ_RETRY(MACRONIX_NUM_READ_RETRY_MODES, - macronix_set_read_retry)), + macronix_set_read_retry), + SPINAND_RANDOMIZER(macronix_set_randomizer)), SPINAND_INFO("MX35LF4G24AD", SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x35, 0x03), NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 2, 1, 1), @@ -266,7 +277,8 @@ static const struct spinand_info macronix_spinand_table= [] =3D { SPINAND_HAS_PROG_PLANE_SELECT_BIT, SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, NULL), SPINAND_READ_RETRY(MACRONIX_NUM_READ_RETRY_MODES, - macronix_set_read_retry)), + macronix_set_read_retry), + SPINAND_RANDOMIZER(macronix_set_randomizer)), SPINAND_INFO("MX35LF4G24AD-Z4I8", SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x75, 0x03), NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 1), @@ -277,7 +289,8 @@ static const struct spinand_info macronix_spinand_table= [] =3D { SPINAND_HAS_QE_BIT, SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, NULL), SPINAND_READ_RETRY(MACRONIX_NUM_READ_RETRY_MODES, - macronix_set_read_retry)), + macronix_set_read_retry), + SPINAND_RANDOMIZER(macronix_set_randomizer)), SPINAND_INFO("MX31LF1GE4BC", SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x1e), NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1), @@ -327,7 +340,8 @@ static const struct spinand_info macronix_spinand_table= [] =3D { SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, macronix_ecc_get_status), SPINAND_READ_RETRY(MACRONIX_NUM_READ_RETRY_MODES, - macronix_set_read_retry)), + macronix_set_read_retry), + SPINAND_RANDOMIZER(macronix_set_randomizer)), SPINAND_INFO("MX35UF4G24AD-Z4I8", SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xf5, 0x03), NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 1), @@ -340,7 +354,8 @@ static const struct spinand_info macronix_spinand_table= [] =3D { SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, macronix_ecc_get_status), SPINAND_READ_RETRY(MACRONIX_NUM_READ_RETRY_MODES, - macronix_set_read_retry)), + macronix_set_read_retry), + SPINAND_RANDOMIZER(macronix_set_randomizer)), SPINAND_INFO("MX35UF4GE4AD", SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xb7, 0x03), NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 1), @@ -381,7 +396,8 @@ static const struct spinand_info macronix_spinand_table= [] =3D { SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, macronix_ecc_get_status), SPINAND_READ_RETRY(MACRONIX_NUM_READ_RETRY_MODES, - macronix_set_read_retry)), + macronix_set_read_retry), + SPINAND_RANDOMIZER(macronix_set_randomizer)), SPINAND_INFO("MX35UF2G24AD-Z4I8", SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xe4, 0x03), NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1), @@ -394,7 +410,8 @@ static const struct spinand_info macronix_spinand_table= [] =3D { SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, macronix_ecc_get_status), SPINAND_READ_RETRY(MACRONIX_NUM_READ_RETRY_MODES, - macronix_set_read_retry)), + macronix_set_read_retry), + SPINAND_RANDOMIZER(macronix_set_randomizer)), SPINAND_INFO("MX35UF2GE4AD", SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xa6, 0x03), NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1), @@ -444,7 +461,8 @@ static const struct spinand_info macronix_spinand_table= [] =3D { SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, macronix_ecc_get_status), SPINAND_READ_RETRY(MACRONIX_NUM_READ_RETRY_MODES, - macronix_set_read_retry)), + macronix_set_read_retry), + SPINAND_RANDOMIZER(macronix_set_randomizer)), SPINAND_INFO("MX35UF1GE4AD", SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x96, 0x03), NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1), --=20 2.25.1