hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/drivers/mtd/nand/raw/meson_nand.c
....@@ -72,6 +72,7 @@
7272 #define GENCMDIADDRH(aih, addr) ((aih) | (((addr) >> 16) & 0xffff))
7373
7474 #define DMA_DIR(dir) ((dir) ? NFC_CMD_N2M : NFC_CMD_M2N)
75
+#define DMA_ADDR_ALIGN 8
7576
7677 #define ECC_CHECK_RETURN_FF (-1)
7778
....@@ -172,6 +173,7 @@
172173
173174 dma_addr_t daddr;
174175 dma_addr_t iaddr;
176
+ u32 info_bytes;
175177
176178 unsigned long assigned_cs;
177179 };
....@@ -275,7 +277,7 @@
275277
276278 if (raw) {
277279 len = mtd->writesize + mtd->oobsize;
278
- cmd = (len & GENMASK(5, 0)) | scrambler | DMA_DIR(dir);
280
+ cmd = (len & GENMASK(13, 0)) | scrambler | DMA_DIR(dir);
279281 writel(cmd, nfc->reg_base + NFC_REG_CMD);
280282 return;
281283 }
....@@ -499,6 +501,7 @@
499501 nfc->daddr, datalen, dir);
500502 return ret;
501503 }
504
+ nfc->info_bytes = infolen;
502505 cmd = GENCMDIADDRL(NFC_CMD_AIL, nfc->iaddr);
503506 writel(cmd, nfc->reg_base + NFC_REG_CMD);
504507
....@@ -516,8 +519,10 @@
516519 struct meson_nfc *nfc = nand_get_controller_data(nand);
517520
518521 dma_unmap_single(nfc->dev, nfc->daddr, datalen, dir);
519
- if (infolen)
522
+ if (infolen) {
520523 dma_unmap_single(nfc->dev, nfc->iaddr, infolen, dir);
524
+ nfc->info_bytes = 0;
525
+ }
521526 }
522527
523528 static int meson_nfc_read_buf(struct nand_chip *nand, u8 *buf, int len)
....@@ -536,7 +541,7 @@
536541 if (ret)
537542 goto out;
538543
539
- cmd = NFC_CMD_N2M | (len & GENMASK(5, 0));
544
+ cmd = NFC_CMD_N2M | (len & GENMASK(13, 0));
540545 writel(cmd, nfc->reg_base + NFC_REG_CMD);
541546
542547 meson_nfc_drain_cmd(nfc);
....@@ -560,7 +565,7 @@
560565 if (ret)
561566 return ret;
562567
563
- cmd = NFC_CMD_M2N | (len & GENMASK(5, 0));
568
+ cmd = NFC_CMD_M2N | (len & GENMASK(13, 0));
564569 writel(cmd, nfc->reg_base + NFC_REG_CMD);
565570
566571 meson_nfc_drain_cmd(nfc);
....@@ -706,6 +711,8 @@
706711 usleep_range(10, 15);
707712 /* info is updated by nfc dma engine*/
708713 smp_rmb();
714
+ dma_sync_single_for_cpu(nfc->dev, nfc->iaddr, nfc->info_bytes,
715
+ DMA_FROM_DEVICE);
709716 ret = *info & ECC_COMPLETE;
710717 } while (!ret);
711718 }
....@@ -832,6 +839,9 @@
832839
833840 static bool meson_nfc_is_buffer_dma_safe(const void *buffer)
834841 {
842
+ if ((uintptr_t)buffer % DMA_ADDR_ALIGN)
843
+ return false;
844
+
835845 if (virt_addr_valid(buffer) && (!object_is_on_stack(buffer)))
836846 return true;
837847 return false;
....@@ -1170,7 +1180,6 @@
11701180 struct meson_nfc *nfc = nand_get_controller_data(nand);
11711181 struct meson_nfc_nand_chip *meson_chip = to_meson_nand(nand);
11721182 struct mtd_info *mtd = nand_to_mtd(nand);
1173
- int nsectors = mtd->writesize / 1024;
11741183 int ret;
11751184
11761185 if (!mtd->name) {
....@@ -1188,7 +1197,7 @@
11881197 nand->options |= NAND_NO_SUBPAGE_WRITE;
11891198
11901199 ret = nand_ecc_choose_conf(nand, nfc->data->ecc_caps,
1191
- mtd->oobsize - 2 * nsectors);
1200
+ mtd->oobsize - 2);
11921201 if (ret) {
11931202 dev_err(nfc->dev, "failed to ECC init\n");
11941203 return -EINVAL;