Hi,
Le 18/10/2025 à 01:11, Andre Przywara a écrit :
Hi,

On 16/10/2025 15:27, Richard Genoud wrote:
Move ECC_PAT_FOUND register in SoC capabilities structure

This register offset moved in H616, it's now its own register, not
shared with NFC_ECC_ST.
Push that specificity in caps structure.

Right, so if I understand correctly, this moves from bits[31:16] of ECC_ST to bits[31:0] of a new separate register. If this is correct, can you add this piece of information to the commit message, to motivate the addition of the whole field masking operation?
Yes, exactly.
I'll add that this info in the commit message.

Thanks!


Assuming that this looks alright to me:

Signed-off-by: Richard Genoud <[email protected]>

Reviewed-by: Andre Przywara <[email protected]>

Cheers,
Andre


---
  drivers/mtd/nand/raw/sunxi_nand.c |  9 +++++++--
  drivers/mtd/nand/raw/sunxi_nand.h | 16 +++++++++++++++-
  2 files changed, 22 insertions(+), 3 deletions(-)

diff --git a/drivers/mtd/nand/raw/sunxi_nand.c b/drivers/mtd/nand/raw/ sunxi_nand.c
index 64a0db37f3f0..869b3ddd971c 100644
--- a/drivers/mtd/nand/raw/sunxi_nand.c
+++ b/drivers/mtd/nand/raw/sunxi_nand.c
@@ -699,6 +699,7 @@ static int sunxi_nfc_hw_ecc_read_chunk(struct mtd_info *mtd,
      struct nand_ecc_ctrl *ecc = &nand->ecc;
      int raw_mode = 0;
      u32 status;
+    u32 pattern_found;
      int ret;
      if (*cur_off != data_off)
@@ -724,8 +725,9 @@ static int sunxi_nfc_hw_ecc_read_chunk(struct mtd_info *mtd,
      *cur_off = oob_off + ecc->bytes + 4;
-    status = readl(nfc->regs + NFC_REG_ECC_ST);
-    if (status & NFC_ECC_PAT_FOUND(0)) {
+    pattern_found = readl(nfc->regs + nfc->caps->reg_pat_found);
+    pattern_found = field_get(NFC_ECC_PAT_FOUND_MSK(nfc), pattern_found);
+    if (pattern_found & NFC_ECC_PAT_FOUND(0)) {
          u8 pattern = 0xff;
          if (unlikely(!(readl(nfc->regs + NFC_REG_PAT_ID) & 0x1)))
@@ -744,6 +746,7 @@ static int sunxi_nfc_hw_ecc_read_chunk(struct mtd_info *mtd,
      nand->cmdfunc(mtd, NAND_CMD_RNDOUT, oob_off, -1);
      sunxi_nfc_randomizer_read_buf(mtd, oob, ecc->bytes + 4, true, page);
+    status = readl(nfc->regs + NFC_REG_ECC_ST);
      if (status & NFC_ECC_ERR(0)) {
          /*
           * Re-read the data with the randomizer disabled to identify
@@ -1715,6 +1718,8 @@ static const struct sunxi_nfc_caps sunxi_nfc_a10_caps = {
      .nstrengths = 9,
      .reg_ecc_err_cnt = NFC_REG_A10_ECC_ERR_CNT,
      .reg_user_data = NFC_REG_A10_USER_DATA,
+    .reg_pat_found = NFC_REG_ECC_ST,
+    .pat_found_mask = GENMASK(31, 16),
  };
  static const struct udevice_id sunxi_nand_ids[] = {
diff --git a/drivers/mtd/nand/raw/sunxi_nand.h b/drivers/mtd/nand/raw/ sunxi_nand.h
index 1977d1bd8eaf..35079d37bb1f 100644
--- a/drivers/mtd/nand/raw/sunxi_nand.h
+++ b/drivers/mtd/nand/raw/sunxi_nand.h
@@ -25,6 +25,9 @@
  #include <linux/bitops.h>
+/* non compile-time field get */
+#define field_get(_mask, _reg) (((_reg) & (_mask)) >> (ffs(_mask) - 1))
+
  #define NFC_REG_CTL        0x0000
  #define NFC_REG_ST        0x0004
  #define NFC_REG_INT        0x0008
@@ -146,7 +149,14 @@
  /* define bit use in NFC_ECC_ST */
  #define NFC_ECC_ERR(x)        BIT(x)
-#define NFC_ECC_PAT_FOUND(x)    BIT((x) + 16)
+
+/*
+ * define bit use in NFC_REG_PAT_FOUND
+ * For A10/A23, NFC_REG_PAT_FOUND == NFC_ECC_ST register
+ */
+#define NFC_ECC_PAT_FOUND(x)    BIT(x)
+#define NFC_ECC_PAT_FOUND_MSK(nfc) ((nfc)->caps->pat_found_mask)
+
  #define NFC_ECC_ERR_CNT(b, x)    (((x) >> ((b) * 8)) & 0xff)
  #define NFC_DEFAULT_TIMEOUT_MS    1000
@@ -162,11 +172,15 @@
   * @nstrengths:        Number of element of ECC strengths array
   * @reg_ecc_err_cnt:    ECC error counter register
   * @reg_user_data:    User data register
+ * @reg_pat_found:    Data Pattern Status Register
+ * @pat_found_mask:    ECC_PAT_FOUND mask in NFC_REG_PAT_FOUND register
   */
  struct sunxi_nfc_caps {
      unsigned int nstrengths;
      unsigned int reg_ecc_err_cnt;
      unsigned int reg_user_data;
+    unsigned int reg_pat_found;
+    unsigned int pat_found_mask;
  };
  #endif



--
Richard Genoud, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

Reply via email to