[PATCH v3 00/15] mtd: rawnand: sunxi: support the Allwinner randomized OOB format
From: James Hilliard <hidden>
Date: 2026-09-09 08:31:07
Also in:
linux-arm-kernel, linux-sunxi, lkml
Allwinner NAND firmware leaves the bad-block marker in the randomizer data stream. On H6/H616 it also places all protected user data before the first ECC step. These choices differ from the mainline format, which keeps the physical marker plain and maximizes the H6/H616 user-data area. Add allwinner,randomized-oob to select the firmware format for the configured hardware-ECC geometry. Older controllers keep their fixed four-byte-per-step user-data layout; H6/H616 use four bytes per 1 KiB step, capped at 16 bytes, packed before the first ECC step. Without the property, retain the existing marker handling and OOB layout. Normal hardware-ECC accesses use the controller randomizer. MTD_OPS_RAW continues to bypass both ECC and randomization and expose physical data and OOB, including randomized markers stored by firmware. Address the ECC-error paths as well. In randomized-OOB mode, use the controller-specific vendor spare-byte erased-page heuristic on the protected user data from the original hardware read. Older controllers use exact erased-spare checks, including their first-page and page-127 signatures; H616 requires byte zero and at least nine of ten spare bytes to be 0xff. Accepted erased pages return all-0xff data and OOB without a raw reread. An all-zero physical page instead returns a bad marker and an ECC failure. Other ECC failures retain the original decoded data and protected OOB for bad-block and flash-BBT pattern scans. PIO and DMA share this page-wide classification, including randomized-format subpage reads. Plain-marker mode keeps its existing physical erased-chunk check. Prepend independent fixes for PIO OOB lengths, per-step pattern IDs, read/write error handling and duplicate OOB program confirms, followed by OOB-helper cleanups. These fixes also apply when randomized-OOB mode is disabled. Also combine contiguous unprotected OOB reads and reduce repeated chip setup and register accesses without changing the page format. Assisted-by: Codex:gpt-6-astra Signed-off-by: James Hilliard <redacted> --- Changes in v3: - add a prerequisite fix for the logical OOB length used by PIO transfers - clarify logical ECC steps versus hardware slots and share protected-OOB register indexing - select the controller-specific vendor spare-byte erased-page check from the SoC capabilities, only in randomized-OOB mode and without rereading the main data - retain hardware-decoded data and protected OOB on other ECC failures for bad-block and BBT pattern scans (reported by Miquel Raynal) - retain a bad marker and ECC failure for all-zero physical pages, and disable the ECC exception for the vendor format - share page classification between PIO and DMA, reading complete pages for randomized-format subpage requests - propagate OOB read errors and defer randomized-format ECC accounting until those reads have succeeded - propagate read/program setup, column-change and buffer-transfer errors, including extra OOB; stop failed writes and disable ECC and randomization - discard partial DMA ECC statistics before retrying in PIO, and keep correction counts separate from successful OOB-transfer status - select the current hardware step's pattern ID instead of slot zero - avoid a second program confirm after an OOB-only write - avoid redundant column changes before writing extra OOB bytes - reject oversized ECC steps in randomized-OOB mode before the core can fall back to software ECC - combine adjacent parity and trailing OOB reads in randomized-OOB mode - remove duplicate chip setup immediately before core page commands - program each packed DMA user-data length register once per operation, and write PIO slot zero directly without read-modify-write - reuse pattern IDs and packed error counters within a DMA read, while refreshing the snapshot after every PIO ECC operation - Link to v2: https://patch.msgid.link/20260904-submit-sunxi-nand-vendor-oob-layout-v1-v2-0-b12074f4aca7@gmail.com Changes in v2: - rebase on the current MTD nand/next branch - retain the merged protected-OOB allocation, BBM reservation and stack-buffer fixes - clarify that randomization is part of the normal hardware-ECC page format while MTD_OPS_RAW continues to expose physical bytes - explain why a BSP-compatible BBM remains randomized in physical raw data - document the decoded bad-block and flash-BBT access paths - reject the firmware OOB format with software or disabled ECC - document the BSP page-format compatibility contract and the older-controller format audit - Link to v1: https://patch.msgid.link/20260810-submit-sunxi-nand-vendor-oob-layout-v1-v1-0-463853a14ad9@gmail.com To: Miquel Raynal <miquel.raynal@bootlin.com> To: Richard Weinberger <richard@nod.at> To: Vignesh Raghavendra <vigneshr@ti.com> To: Chen-Yu Tsai <wens@kernel.org> To: Jernej Skrabec <jernej.skrabec@gmail.com> To: Samuel Holland <samuel@sholland.org> To: Richard Genoud <richard.genoud@bootlin.com> To: Rob Herring <robh@kernel.org> To: Krzysztof Kozlowski <krzk+dt@kernel.org> To: Conor Dooley <conor+dt@kernel.org> To: Maxime Ripard <mripard@kernel.org> To: Masahiro Yamada <redacted> To: Boris Brezillon <bbrezillon@kernel.org> To: Brian Norris <computersforpeace@gmail.com> Cc: linux-mtd@lists.infradead.org Cc: linux-arm-kernel@lists.infradead.org Cc: linux-sunxi@lists.linux.dev Cc: linux-kernel@vger.kernel.org Cc: devicetree@vger.kernel.org --- James Hilliard (15): mtd: rawnand: sunxi: use the logical step's OOB length in PIO mtd: rawnand: sunxi: propagate page-setup and erased-check errors mtd: rawnand: sunxi: stop failed program operations and disable ECC mtd: rawnand: sunxi: select the pattern ID for the current ECC step mtd: rawnand: sunxi: propagate buffer and column transfer errors mtd: rawnand: sunxi: avoid a second program confirm for OOB writes mtd: rawnand: sunxi: avoid redundant column changes for extra OOB mtd: rawnand: sunxi: clarify OOB register and step handling dt-bindings: mtd: sunxi: Add randomized OOB flag mtd: rawnand: sunxi: support randomized OOB formats mtd: rawnand: sunxi: select the packed H6/H616 OOB layout mtd: rawnand: sunxi: combine contiguous unprotected OOB reads mtd: rawnand: sunxi: avoid duplicate chip setup before page commands mtd: rawnand: sunxi: reduce user-data length register accesses mtd: rawnand: sunxi: reuse ECC status within each DMA read .../bindings/mtd/allwinner,sun4i-a10-nand.yaml | 10 + drivers/mtd/nand/raw/sunxi_nand.c | 948 +++++++++++++++------ 2 files changed, 689 insertions(+), 269 deletions(-) --- base-commit: 7e874b1750a40f3dc9a629aeb72eba09c77f77e9 change-id: 20260810-submit-sunxi-nand-vendor-oob-layout-v1-e3114d10cc9c Best regards, -- James Hilliard [off-list ref]