From nobody Fri Apr 17 07:44:38 2026 Received: from mail-pl1-f181.google.com (mail-pl1-f181.google.com [209.85.214.181]) (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 AC920344D86 for ; Mon, 23 Feb 2026 06:19:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771827580; cv=none; b=T+9NITeaNOG4Z0sHRROI42vTJ+8WtC4XRk59Fln+66mTDGT1qIBXibMcR1gZZBGd72cPaD2jJsHrHP9T30s2eb/CsVU6pdseuPx+n4Lvw8MmxPLyDd8ukeTUcosYvpyFGK0AhSoYBGWOodthrfyEJ7FPson4sO8IHDEcYTaw8v0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771827580; c=relaxed/simple; bh=q5iWDDiVP6ItgngzmXfBwHdc6oyRXu9KbdXi8CD9nEs=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=FEN8mEAsS9SgU5fGg2VgMUDKoFsn12ViNrDd/VWnzPhlz3XBeXXzK0hmknwkhI7MGlfr9AqjM4t5P4M40zuI9U14JEdQA2cKKxvlLGamJBLFzZLuEWNbtwA4v4cyaJTGo4+qzYBwendXRznJWass/QuNMP1aTIR9Hv8oJv2anX8= 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=XGMsnO3n; arc=none smtp.client-ip=209.85.214.181 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="XGMsnO3n" Received: by mail-pl1-f181.google.com with SMTP id d9443c01a7336-2a9296b3926so26865235ad.1 for ; Sun, 22 Feb 2026 22:19:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1771827579; x=1772432379; 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=N7WrDyX53tBhhQs9DM7PCsQhtyvoI2GRXLB5HiWYUgc=; b=XGMsnO3nBw6dA55EcxYnazD4/2aJb1zNmoKQ9EDKo+IWvpuo9nhiU3yNJySgAWOFUw 1dLYzdNkC96zJtUDdpNdTONNjkcTHgtGxdwC0QJznWiJyuKewWx+B6eXngREC01aZqYx 2G5TI+Nk85hyoQ68dvSK7/uNF54vatvxS8kjw9BtoZZRg06iRKyFMt6U3ZqG+tY9gZSe MoTiq18/PJHXK1cTZ+DQ9BZBRIiaqN3mB5+l0avo7moHwHA1xPrO1wasHxK3UkrU3HNQ ZkSwKnSOJjxTs6cCugjZokWPqNpbOKngvqSzv9aaoeyJwooQuVklZYEcAQF1laTzADUX 4ScA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771827579; x=1772432379; 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=N7WrDyX53tBhhQs9DM7PCsQhtyvoI2GRXLB5HiWYUgc=; b=nERA3rVMxzyVZNt3OgRXSO6/I94/UzUazCOUHJPezDffu66eWrHnDJYxOLRCtt7KFI 62bYEU6jVdVFKzGUe6Xz21cYxYRj7dpRK9dkb2WbroP1G//FeQzX+kzfEk21DjeY3Oum ibUJBCEl+rcUKZFMzDjoF4bk9BwYqBR8BcTPPrJEN2c2ulanJK87yRb0ATHdl2IblUQa QpphrXW0VSCJaIePdSB1pkrrSPDrNCsRkFavuctJMbYSK7XJIaZjZj+ij7K4tsnwt4S1 iHogJsP3xDaB0LAbjs9YBLE9UAUxqnjjdLVfNQyS3jbDNHtItK1pkPT6VEiTI4/Bly+k CAOg== X-Forwarded-Encrypted: i=1; AJvYcCWlg7MKElDgNKwWy1qvmUsaDwM5pYMCKUNYMB4LpOVSu9ZERwPrAyNdb35Ex1IGRaUmVDF6+/miiWcD85g=@vger.kernel.org X-Gm-Message-State: AOJu0YzEyIx6KO4mRF9e4zs4TReG4zOUR3cGQom+ZVbHhAMu4DKyS3cc Rhh8h33k7DPkcEm3TdAkSFXftXqhJFRlFsYjjV1HrvipvVN1miJGhDkqoZ71ew== X-Gm-Gg: ATEYQzzp4AoQKvn/XBEtnZxyW8Y6xG1u6Jq6uzYhnHsj6rf2QH6EixK7+6uj1n7KmDp 5/K8fxY03OdJjtpQcYme7rUcaRHEOulQ6JTEVR0DwuuFBI4fAv6yPgwFDKXJuFCOClxm5EQLREf AGnylhvXzAaMleUvqOrtAfa/g+Q9agz5r9Qq48UGPH5nwK9pDfAjKs1eiw08x5UwOFWWV1w3N7m k9/WAxkOdr3aaKhnyRANeMH+jlavzMkFeHI6vfUV0DMWLWvl0BFjG0ejwUY6wkOvq8PcVJtavb0 sN2WuLvLll+v0yLR8asu4ZHLRQ+J/ZVb2RTMQ4SteD3U1z0PbHcnK88uMpo9xopojX+jBiy4ace qNYvyvNKXIDcRYXaz3jrt8CPZBnR8rbWYhc+OJ9Wf6dzZxR6duMaZy0Ag3gS2ECc+ZTVlq23RhA tDQxRA+B1X9DdWsx4hIxhmHnzSD1RSIRvD/HEMPEsXY47UzA== X-Received: by 2002:a17:903:2b06:b0:2a3:ee53:d201 with SMTP id d9443c01a7336-2ad743e3e8emr61818115ad.12.1771827579002; Sun, 22 Feb 2026 22:19:39 -0800 (PST) Received: from twhmp6px (mxsmtp211.mxic.com.tw. [211.75.127.162]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2ad7503f4a4sm60191805ad.79.2026.02.22.22.19.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 22 Feb 2026 22:19:38 -0800 (PST) Received: from hqs-appsw-a2o.mp600.macronix.com (unknown [172.17.236.67]) by twhmp6px (Postfix) with ESMTPS id D5AF64136074; Mon, 23 Feb 2026 14:19:36 +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 v6 1/3] dt-bindings: mtd: spinand: Add randomizer enable/disable properties Date: Mon, 23 Feb 2026 14:17:04 +0800 Message-Id: <20260223061706.1027986-2-linchengming884@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20260223061706.1027986-1-linchengming884@gmail.com> References: <20260223061706.1027986-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. 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. 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..09ed2f73ab5c 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 Fri Apr 17 07:44:38 2026 Received: from mail-pg1-f179.google.com (mail-pg1-f179.google.com [209.85.215.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 D53B61534EC for ; Mon, 23 Feb 2026 06:19:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771827581; cv=none; b=B0qAUQUOrwG69oJ1JUb2Cm6V/CVnZfoTxeywy/UT5WoBTI+yR8BDZqV0renPiaXMLor8cm47xttTHjTI6gCHbua++ExDxRz5X9G1WTM+bCRvvkfs1Te3b0c5khCFeUVt4MRauc6f25mpjZFYJ8mauNR+LRCYN/TJ5qK6o+LdMaM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771827581; c=relaxed/simple; bh=A0cKTP/NcPWurRQx3wyGtZw1VFNDkseDTGwzrhDZmHE=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=KZJ0/ZHZkkEwmGEtL8GT9Y4DVljfpAP0+1FWt5fVr1PNWzREe7nFtD0q9TNUDLFjGa3KqSNDmBEdH1qkLCSHQ7wpE1gW75SsS8lfqqa1zd0+CTynSc+ntnqBfbpz3/kM+xK5dyEc6HKRI2M9swEvnvpai1w5CKpCbAu5pf5UNbo= 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=k9PNDkEU; arc=none smtp.client-ip=209.85.215.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="k9PNDkEU" Received: by mail-pg1-f179.google.com with SMTP id 41be03b00d2f7-c6e72d7a4d7so2605750a12.0 for ; Sun, 22 Feb 2026 22:19:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1771827579; x=1772432379; 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=k9PNDkEUTUtrDK0yjQG3hUJSVTVAOZIfKVJPouS45WyPXE9XdlToOFGW5kJncEEXo6 s5uRa0yw1PGh+msd4+gIbHjjqsfLQ7cbn5mRnQr3Q44c4eyi3vifig/ytdw5xf8Fmj+E IokAkbuMMsibBpt4eAR28bzxIVhlOO2o8pVqMrsiv36UqELMnPOU6Jjbbg+0jvpk8964 CnjEIIa8AXrfO+nNeeFSUApNHr4lipl4mvRXtA8baxWdY6v7U8LIMlhW5i6lgVjlVsFi ESuPj5D8W8mxmh2lH1ouFE6jx35ovC/Z8+uidnUyV4zkZf0Z5uhQTPq2J80rliYiBDIg Qaqg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771827579; x=1772432379; 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=fTqUuhALs59xgVPnOA84+9We1WDf3XtZCU+vPqZYDM1SIwwt1u04SeqBdCMW/dJ9QN AxuRvnbN05qjgsrJfm6JtIlB5fuZQF+85JsNV0mW+dSEpfbFGnav7Gq36egJI2AAWbsp 7TRKPqkc3HrnqcF02lopEL7spsbsNXSqvfhRPOcNFgbkJuq3iS/BW3BnMDsWndvybUQD SzibwGK0Y68fUhddLWMuaT/MkemPdKEwOuW2aHeJHuL+UHZDSQqhMOcoytCxPzasgDmD q/6hbvJ9A0XjMeVNWcesqBWsUq9JY5DDYu6YhZsKO+jzIPzBdGi8Shgf9of2grlHE13s u1WQ== X-Forwarded-Encrypted: i=1; AJvYcCXgeDLS34IWX+YCRGUKaI80t6hludyBqWSL0554FWiKdv9Gr9KbK8soDM56nROCfDbzDIBeHkXNVbPVzDE=@vger.kernel.org X-Gm-Message-State: AOJu0YzvMPC/OmNdzNS/lzLpA9CJoopmmVbEru83aaeoZDk2yD4jkAmp k7i0iOjbMp/DqSj67DMlhAXNxIrLsu0W9oNR/eBeTxfALGB/RIbbO/3I X-Gm-Gg: ATEYQzykULRWLDabrUDSuZfqoBqGxnqlIEeB/qedr1th6rHzwP6uQnLX/gj065SbPDN XCTaonuy49Vw1NZAxf7x65dinvyXam0XIwvTHWnPchtO7aXElhB/AWqlyG0RebbdyURIyFg0lEE 5OBgZLkmd5+GTN7KggzMZ0shLcSXpoaR0FT/8hcEpM5OFDy9g4STegC9J1lW+/AlTjAOT/QuF4g OfcIH15LuIy7gOYg2FhuSnYqonntLgX5EZJH0rD7feS9lSPlxD4E/nh431UNFl+8DtY2AaIkFrB WSW2CUgWqzxOceU4TytIPAxq/tQhG5xEC8gL3vor89SQ9e7rZmRqTQc3dPjDcd/Dzb1nmJsOwe1 5cAs+LpIGG9zKdXWJa9TirS0x+sWmiA6QOhQFTcdiDq2qwOci18cVCkGuO/f3QAxYfpfd6skKJU OBBANdO1axda6ubIIA96yze7ylzlmpGSLHk8f88GjqZYJBcA== X-Received: by 2002:a17:90b:498f:b0:354:a76e:7f08 with SMTP id 98e67ed59e1d1-358ae6a4304mr5524288a91.0.1771827579168; Sun, 22 Feb 2026 22:19:39 -0800 (PST) Received: from twhmp6px (mxsmtp211.mxic.com.tw. [211.75.127.162]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3589d8e3e73sm9340820a91.15.2026.02.22.22.19.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 22 Feb 2026 22:19:38 -0800 (PST) Received: from hqs-appsw-a2o.mp600.macronix.com (unknown [172.17.236.67]) by twhmp6px (Postfix) with ESMTPS id E38AD4136075; Mon, 23 Feb 2026 14:19:36 +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 v6 2/3] mtd: spi-nand: Add support for randomizer Date: Mon, 23 Feb 2026 14:17:05 +0800 Message-Id: <20260223061706.1027986-3-linchengming884@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20260223061706.1027986-1-linchengming884@gmail.com> References: <20260223061706.1027986-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 Fri Apr 17 07:44:38 2026 Received: from mail-pg1-f172.google.com (mail-pg1-f172.google.com [209.85.215.172]) (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 5712D345CC0 for ; Mon, 23 Feb 2026 06:19:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771827583; cv=none; b=s/CxoTyLQDZq0NYCAoANmdxyXVNZZ1AIEs4uWCOOT/qBpmdaeOWgDGLJNqakJYUpwEihw9z1r+KHQaNI5seHWTTpb9QsTDJQNEWqbwhurEYP9gtbH6l6E73V99FhI20blguxYL+re2ouH/PdAnHxThZMGeIKPzu9D8LI7m3Ng34= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771827583; c=relaxed/simple; bh=zd9sEH7/GbHmbptufpYewUPGoANYwNraqMsqvNgTnNU=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=NuEjOOKTB3hs3h4KmJg31ndhB9upY0lVWNz1EwQah8qkj709eJbC3enRBVkHcued+MXhT3S8G6zgUHWn0mnGaJqR9Rg7aj+MhH0jWcvrOA5nJO6E5rkgAFgyyyrVx5WVbj5ODJMOg74KzrbXHV5IF2adwxV5FuecxhnPcKKAAq8= 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=hKow2aV7; arc=none smtp.client-ip=209.85.215.172 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="hKow2aV7" Received: by mail-pg1-f172.google.com with SMTP id 41be03b00d2f7-c626bd75628so1362708a12.3 for ; Sun, 22 Feb 2026 22:19:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1771827580; x=1772432380; 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=WsnjGMHARfSY9wrs6OVMjrIiggJWhVMOYFI5ymUBQZQ=; b=hKow2aV7NNf1DTOsZytXfCl0/9L8QcTqdGjLwiHxMfdZUkOgIOHXrC6uiGrDI5NIHB +zo8HmKYx2ZGbRoy24Z1AMV8kKsEai3i5fwZquXzqOUH25sPa8IMtz6ngisRiyuGQVMb i3IcoCFP+obNHxAaNTAR+wrAefh/a70EgO+YmSxy+74CmZZQdE9N4Mfs+Yy60sk1yK0S qQ6nbl4cq2uKyov5ect73I5fw6T0en5bL28iPh8dMqdtsr1l4rSTCnx7hSvNXFoW8JgL jIKxUAxKew00/MibqS3UZdmV0upzQVh4D9ymCCPBVCiboxSRy6gMW2xqXvqju5tq2gnS 6B6A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771827580; x=1772432380; 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=WsnjGMHARfSY9wrs6OVMjrIiggJWhVMOYFI5ymUBQZQ=; b=H6KG5bwbvBlvt+DX5Wpr4H2gRKXa1kUupOitvGJphoqOo/Cgdy8QJIF4gWr1uMUPyp NCchTHjYcxOTSMb+mupCHG520x7y9Iaxwq8MVygmLmcl8N/n282hhhpXky1wH39yPZi+ fSe5UY3FzsBVwS8lTPE+A1JaqMSxgPkUEKohgYWUi8KyvlNxrJpRb06E+Yl19QyP0pNL WScYrvRt3lJ2+hYN3saHhtqjRRNwYOCoU4DhIWEC4P3pqiff8SnBeVIoOwfxnFCum/7w fP7okhUP22peabmQa39ZObnZMShL1Mt7uzfvS7epb/A+7KUi5fUtxz68OHYm+3vgLFWl 3Ggw== X-Forwarded-Encrypted: i=1; AJvYcCWA5C2/Juj5rHq8/NooOC/8Db/UijGYd88LXqCF97cfgekZHnB//uRr30kQoB7oVcJlgzywNHTKXxZcUtY=@vger.kernel.org X-Gm-Message-State: AOJu0YzfPRLkBGU+il6w8qNMP8Zi8AGFT+ovemPlyDxNKMJ3AnFcf0Jh H7tg7OEa3Wle0Y2XTpSyKhOSiq38E8YgKadXZIdxN6yQjcXAZRH09niF X-Gm-Gg: ATEYQzxdtjfFb20H40aUUjKpCzBhKf9DfIzPYTaFsPH7VOD0wB3rQYdO/P6S/aVX5Jv Hl8bXOrYWxvJcQbpGWs/0iT4u8ClrkGuujLtFtt0wWxzN6aR5qkPMqMX/aoAv8otsaHaWf1YwPA XFuSgP/DtMDTpQyxFEWFltvbWQA9qyO0mW9KvodJefE+HxzAWCMph45x+Grr4Fn57y6G2NJ28zE Tv+PRuxSxi2VNYVUl7QbEdxYeZgiaVrvnOO094QfODx/alxvDueVFcFDYTYQXqhBEJxnedFKUt6 RMHvneJRUwGcnjBmGgPLq9ysFer82Px3zjVr0/9iLf27sX+KNTZBRUsPE2JPiljeGys5WIuIp6n XmhKIUdwfJTTt/iwxPMmz4HQ/qPLKGZZRgxFz1hllNu58WJzc/ot2g/PIASVsBbCErnAWs8Irqq M7pTE4kZ73tM42fW+NJHT+pM6F+zo8Ysc+pd0Fd4PKmgwhsXu12LAg3PMR X-Received: by 2002:a17:903:248:b0:2a0:a33f:3049 with SMTP id d9443c01a7336-2ad743fe006mr63299695ad.4.1771827579539; Sun, 22 Feb 2026 22:19:39 -0800 (PST) Received: from twhmp6px (mxsmtp211.mxic.com.tw. [211.75.127.162]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-c70b726cbf2sm6473599a12.34.2026.02.22.22.19.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 22 Feb 2026 22:19:39 -0800 (PST) Received: from hqs-appsw-a2o.mp600.macronix.com (unknown [172.17.236.67]) by twhmp6px (Postfix) with ESMTPS id 034BA4136078; Mon, 23 Feb 2026 14:19:36 +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 v6 3/3] mtd: spi-nand: macronix: Enable randomizer support Date: Mon, 23 Feb 2026 14:17:06 +0800 Message-Id: <20260223061706.1027986-4-linchengming884@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20260223061706.1027986-1-linchengming884@gmail.com> References: <20260223061706.1027986-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. Signed-off-by: Cheng Ming Lin --- drivers/mtd/nand/spi/macronix.c | 42 +++++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/drivers/mtd/nand/spi/macronix.c b/drivers/mtd/nand/spi/macroni= x.c index 67cafa1bb8ef..e086c46090b0 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,16 @@ 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) +{ + int ret; + + ret =3D spinand_write_reg_op(spinand, MACRONIX_FEATURE_ADDR_RANDOMIZER, + enable ? MACRONIX_CFG_RANDOMIZER_EN : 0); + + return ret; +} + static const struct spinand_info macronix_spinand_table[] =3D { SPINAND_INFO("MX35LF1GE4AB", SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x12), @@ -231,7 +243,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 +256,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 +268,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 +281,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 +293,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 +344,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 +358,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 +400,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 +414,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 +465,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