forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-11 1f93a7dfd1f8d5ff7a5c53246c7534fe2332d6f4
kernel/drivers/mtd/nand/raw/brcmnand/brcmnand.c
....@@ -1,18 +1,9 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * Copyright © 2010-2015 Broadcom Corporation
3
- *
4
- * This program is free software; you can redistribute it and/or modify
5
- * it under the terms of the GNU General Public License version 2 as
6
- * published by the Free Software Foundation.
7
- *
8
- * This program is distributed in the hope that it will be useful,
9
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
10
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
- * GNU General Public License for more details.
124 */
135
146 #include <linux/clk.h>
15
-#include <linux/version.h>
167 #include <linux/module.h>
178 #include <linux/init.h>
189 #include <linux/delay.h>
....@@ -92,6 +83,12 @@
9283 #define FLASH_DMA_ECC_ERROR (1 << 8)
9384 #define FLASH_DMA_CORR_ERROR (1 << 9)
9485
86
+/* Bitfields for DMA_MODE */
87
+#define FLASH_DMA_MODE_STOP_ON_ERROR BIT(1) /* stop in Uncorr ECC error */
88
+#define FLASH_DMA_MODE_MODE BIT(0) /* link list */
89
+#define FLASH_DMA_MODE_MASK (FLASH_DMA_MODE_STOP_ON_ERROR | \
90
+ FLASH_DMA_MODE_MODE)
91
+
9592 /* 512B flash cache in the NAND controller HW */
9693 #define FC_SHIFT 9U
9794 #define FC_BYTES 512U
....@@ -104,6 +101,102 @@
104101 #define NAND_CTRL_RDY (INTFC_CTLR_READY | INTFC_FLASH_READY)
105102 #define NAND_POLL_STATUS_TIMEOUT_MS 100
106103
104
+#define EDU_CMD_WRITE 0x00
105
+#define EDU_CMD_READ 0x01
106
+#define EDU_STATUS_ACTIVE BIT(0)
107
+#define EDU_ERR_STATUS_ERRACK BIT(0)
108
+#define EDU_DONE_MASK GENMASK(1, 0)
109
+
110
+#define EDU_CONFIG_MODE_NAND BIT(0)
111
+#define EDU_CONFIG_SWAP_BYTE BIT(1)
112
+#ifdef CONFIG_CPU_BIG_ENDIAN
113
+#define EDU_CONFIG_SWAP_CFG EDU_CONFIG_SWAP_BYTE
114
+#else
115
+#define EDU_CONFIG_SWAP_CFG 0
116
+#endif
117
+
118
+/* edu registers */
119
+enum edu_reg {
120
+ EDU_CONFIG = 0,
121
+ EDU_DRAM_ADDR,
122
+ EDU_EXT_ADDR,
123
+ EDU_LENGTH,
124
+ EDU_CMD,
125
+ EDU_STOP,
126
+ EDU_STATUS,
127
+ EDU_DONE,
128
+ EDU_ERR_STATUS,
129
+};
130
+
131
+static const u16 edu_regs[] = {
132
+ [EDU_CONFIG] = 0x00,
133
+ [EDU_DRAM_ADDR] = 0x04,
134
+ [EDU_EXT_ADDR] = 0x08,
135
+ [EDU_LENGTH] = 0x0c,
136
+ [EDU_CMD] = 0x10,
137
+ [EDU_STOP] = 0x14,
138
+ [EDU_STATUS] = 0x18,
139
+ [EDU_DONE] = 0x1c,
140
+ [EDU_ERR_STATUS] = 0x20,
141
+};
142
+
143
+/* flash_dma registers */
144
+enum flash_dma_reg {
145
+ FLASH_DMA_REVISION = 0,
146
+ FLASH_DMA_FIRST_DESC,
147
+ FLASH_DMA_FIRST_DESC_EXT,
148
+ FLASH_DMA_CTRL,
149
+ FLASH_DMA_MODE,
150
+ FLASH_DMA_STATUS,
151
+ FLASH_DMA_INTERRUPT_DESC,
152
+ FLASH_DMA_INTERRUPT_DESC_EXT,
153
+ FLASH_DMA_ERROR_STATUS,
154
+ FLASH_DMA_CURRENT_DESC,
155
+ FLASH_DMA_CURRENT_DESC_EXT,
156
+};
157
+
158
+/* flash_dma registers v0*/
159
+static const u16 flash_dma_regs_v0[] = {
160
+ [FLASH_DMA_REVISION] = 0x00,
161
+ [FLASH_DMA_FIRST_DESC] = 0x04,
162
+ [FLASH_DMA_CTRL] = 0x08,
163
+ [FLASH_DMA_MODE] = 0x0c,
164
+ [FLASH_DMA_STATUS] = 0x10,
165
+ [FLASH_DMA_INTERRUPT_DESC] = 0x14,
166
+ [FLASH_DMA_ERROR_STATUS] = 0x18,
167
+ [FLASH_DMA_CURRENT_DESC] = 0x1c,
168
+};
169
+
170
+/* flash_dma registers v1*/
171
+static const u16 flash_dma_regs_v1[] = {
172
+ [FLASH_DMA_REVISION] = 0x00,
173
+ [FLASH_DMA_FIRST_DESC] = 0x04,
174
+ [FLASH_DMA_FIRST_DESC_EXT] = 0x08,
175
+ [FLASH_DMA_CTRL] = 0x0c,
176
+ [FLASH_DMA_MODE] = 0x10,
177
+ [FLASH_DMA_STATUS] = 0x14,
178
+ [FLASH_DMA_INTERRUPT_DESC] = 0x18,
179
+ [FLASH_DMA_INTERRUPT_DESC_EXT] = 0x1c,
180
+ [FLASH_DMA_ERROR_STATUS] = 0x20,
181
+ [FLASH_DMA_CURRENT_DESC] = 0x24,
182
+ [FLASH_DMA_CURRENT_DESC_EXT] = 0x28,
183
+};
184
+
185
+/* flash_dma registers v4 */
186
+static const u16 flash_dma_regs_v4[] = {
187
+ [FLASH_DMA_REVISION] = 0x00,
188
+ [FLASH_DMA_FIRST_DESC] = 0x08,
189
+ [FLASH_DMA_FIRST_DESC_EXT] = 0x0c,
190
+ [FLASH_DMA_CTRL] = 0x10,
191
+ [FLASH_DMA_MODE] = 0x14,
192
+ [FLASH_DMA_STATUS] = 0x18,
193
+ [FLASH_DMA_INTERRUPT_DESC] = 0x20,
194
+ [FLASH_DMA_INTERRUPT_DESC_EXT] = 0x24,
195
+ [FLASH_DMA_ERROR_STATUS] = 0x28,
196
+ [FLASH_DMA_CURRENT_DESC] = 0x30,
197
+ [FLASH_DMA_CURRENT_DESC_EXT] = 0x34,
198
+};
199
+
107200 /* Controller feature flags */
108201 enum {
109202 BRCMNAND_HAS_1K_SECTORS = BIT(0),
....@@ -111,6 +204,8 @@
111204 BRCMNAND_HAS_CACHE_MODE = BIT(2),
112205 BRCMNAND_HAS_WP = BIT(3),
113206 };
207
+
208
+struct brcmnand_host;
114209
115210 struct brcmnand_controller {
116211 struct device *dev;
....@@ -130,14 +225,31 @@
130225
131226 int cmd_pending;
132227 bool dma_pending;
228
+ bool edu_pending;
133229 struct completion done;
134230 struct completion dma_done;
231
+ struct completion edu_done;
135232
136233 /* List of NAND hosts (one for each chip-select) */
137234 struct list_head host_list;
138235
236
+ /* EDU info, per-transaction */
237
+ const u16 *edu_offsets;
238
+ void __iomem *edu_base;
239
+ int edu_irq;
240
+ int edu_count;
241
+ u64 edu_dram_addr;
242
+ u32 edu_ext_addr;
243
+ u32 edu_cmd;
244
+ u32 edu_config;
245
+
246
+ /* flash_dma reg */
247
+ const u16 *flash_dma_offsets;
139248 struct brcm_nand_dma_desc *dma_desc;
140249 dma_addr_t dma_pa;
250
+
251
+ int (*dma_trans)(struct brcmnand_host *host, u64 addr, u32 *buf,
252
+ u32 len, u8 dma_cmd);
141253
142254 /* in-memory cache of the FLASH_CACHE, used only for some commands */
143255 u8 flash_cache[FC_BYTES];
....@@ -151,6 +263,7 @@
151263 const unsigned int *block_sizes;
152264 unsigned int max_page_size;
153265 const unsigned int *page_sizes;
266
+ unsigned int page_size_shift;
154267 unsigned int max_oob;
155268 u32 features;
156269
....@@ -159,6 +272,8 @@
159272 u32 nand_cs_nand_xor;
160273 u32 corr_stat_threshold;
161274 u32 flash_dma_mode;
275
+ u32 flash_edu_mode;
276
+ bool pio_poll_mode;
162277 };
163278
164279 struct brcmnand_cfg {
....@@ -223,8 +338,38 @@
223338 BRCMNAND_FC_BASE,
224339 };
225340
226
-/* BRCMNAND v4.0 */
227
-static const u16 brcmnand_regs_v40[] = {
341
+/* BRCMNAND v2.1-v2.2 */
342
+static const u16 brcmnand_regs_v21[] = {
343
+ [BRCMNAND_CMD_START] = 0x04,
344
+ [BRCMNAND_CMD_EXT_ADDRESS] = 0x08,
345
+ [BRCMNAND_CMD_ADDRESS] = 0x0c,
346
+ [BRCMNAND_INTFC_STATUS] = 0x5c,
347
+ [BRCMNAND_CS_SELECT] = 0x14,
348
+ [BRCMNAND_CS_XOR] = 0x18,
349
+ [BRCMNAND_LL_OP] = 0,
350
+ [BRCMNAND_CS0_BASE] = 0x40,
351
+ [BRCMNAND_CS1_BASE] = 0,
352
+ [BRCMNAND_CORR_THRESHOLD] = 0,
353
+ [BRCMNAND_CORR_THRESHOLD_EXT] = 0,
354
+ [BRCMNAND_UNCORR_COUNT] = 0,
355
+ [BRCMNAND_CORR_COUNT] = 0,
356
+ [BRCMNAND_CORR_EXT_ADDR] = 0x60,
357
+ [BRCMNAND_CORR_ADDR] = 0x64,
358
+ [BRCMNAND_UNCORR_EXT_ADDR] = 0x68,
359
+ [BRCMNAND_UNCORR_ADDR] = 0x6c,
360
+ [BRCMNAND_SEMAPHORE] = 0x50,
361
+ [BRCMNAND_ID] = 0x54,
362
+ [BRCMNAND_ID_EXT] = 0,
363
+ [BRCMNAND_LL_RDATA] = 0,
364
+ [BRCMNAND_OOB_READ_BASE] = 0x20,
365
+ [BRCMNAND_OOB_READ_10_BASE] = 0,
366
+ [BRCMNAND_OOB_WRITE_BASE] = 0x30,
367
+ [BRCMNAND_OOB_WRITE_10_BASE] = 0,
368
+ [BRCMNAND_FC_BASE] = 0x200,
369
+};
370
+
371
+/* BRCMNAND v3.3-v4.0 */
372
+static const u16 brcmnand_regs_v33[] = {
228373 [BRCMNAND_CMD_START] = 0x04,
229374 [BRCMNAND_CMD_EXT_ADDRESS] = 0x08,
230375 [BRCMNAND_CMD_ADDRESS] = 0x0c,
....@@ -421,6 +566,9 @@
421566 CFG_BUS_WIDTH = BIT(CFG_BUS_WIDTH_SHIFT),
422567 CFG_DEVICE_SIZE_SHIFT = 24,
423568
569
+ /* Only for v2.1 */
570
+ CFG_PAGE_SIZE_SHIFT_v2_1 = 30,
571
+
424572 /* Only for pre-v7.1 (with no CFG_EXT register) */
425573 CFG_PAGE_SIZE_SHIFT = 20,
426574 CFG_BLK_SIZE_SHIFT = 28,
....@@ -456,12 +604,16 @@
456604 {
457605 static const unsigned int block_sizes_v6[] = { 8, 16, 128, 256, 512, 1024, 2048, 0 };
458606 static const unsigned int block_sizes_v4[] = { 16, 128, 8, 512, 256, 1024, 2048, 0 };
459
- static const unsigned int page_sizes[] = { 512, 2048, 4096, 8192, 0 };
607
+ static const unsigned int block_sizes_v2_2[] = { 16, 128, 8, 512, 256, 0 };
608
+ static const unsigned int block_sizes_v2_1[] = { 16, 128, 8, 512, 0 };
609
+ static const unsigned int page_sizes_v3_4[] = { 512, 2048, 4096, 8192, 0 };
610
+ static const unsigned int page_sizes_v2_2[] = { 512, 2048, 4096, 0 };
611
+ static const unsigned int page_sizes_v2_1[] = { 512, 2048, 0 };
460612
461613 ctrl->nand_version = nand_readreg(ctrl, 0) & 0xffff;
462614
463
- /* Only support v4.0+? */
464
- if (ctrl->nand_version < 0x0400) {
615
+ /* Only support v2.1+ */
616
+ if (ctrl->nand_version < 0x0201) {
465617 dev_err(ctrl->dev, "version %#x not supported\n",
466618 ctrl->nand_version);
467619 return -ENODEV;
....@@ -470,14 +622,16 @@
470622 /* Register offsets */
471623 if (ctrl->nand_version >= 0x0702)
472624 ctrl->reg_offsets = brcmnand_regs_v72;
473
- else if (ctrl->nand_version >= 0x0701)
625
+ else if (ctrl->nand_version == 0x0701)
474626 ctrl->reg_offsets = brcmnand_regs_v71;
475627 else if (ctrl->nand_version >= 0x0600)
476628 ctrl->reg_offsets = brcmnand_regs_v60;
477629 else if (ctrl->nand_version >= 0x0500)
478630 ctrl->reg_offsets = brcmnand_regs_v50;
479
- else if (ctrl->nand_version >= 0x0400)
480
- ctrl->reg_offsets = brcmnand_regs_v40;
631
+ else if (ctrl->nand_version >= 0x0303)
632
+ ctrl->reg_offsets = brcmnand_regs_v33;
633
+ else if (ctrl->nand_version >= 0x0201)
634
+ ctrl->reg_offsets = brcmnand_regs_v21;
481635
482636 /* Chip-select stride */
483637 if (ctrl->nand_version >= 0x0701)
....@@ -503,20 +657,38 @@
503657 ctrl->max_page_size = 16 * 1024;
504658 ctrl->max_block_size = 2 * 1024 * 1024;
505659 } else {
506
- ctrl->page_sizes = page_sizes;
660
+ if (ctrl->nand_version >= 0x0304)
661
+ ctrl->page_sizes = page_sizes_v3_4;
662
+ else if (ctrl->nand_version >= 0x0202)
663
+ ctrl->page_sizes = page_sizes_v2_2;
664
+ else
665
+ ctrl->page_sizes = page_sizes_v2_1;
666
+
667
+ if (ctrl->nand_version >= 0x0202)
668
+ ctrl->page_size_shift = CFG_PAGE_SIZE_SHIFT;
669
+ else
670
+ ctrl->page_size_shift = CFG_PAGE_SIZE_SHIFT_v2_1;
671
+
507672 if (ctrl->nand_version >= 0x0600)
508673 ctrl->block_sizes = block_sizes_v6;
509
- else
674
+ else if (ctrl->nand_version >= 0x0400)
510675 ctrl->block_sizes = block_sizes_v4;
676
+ else if (ctrl->nand_version >= 0x0202)
677
+ ctrl->block_sizes = block_sizes_v2_2;
678
+ else
679
+ ctrl->block_sizes = block_sizes_v2_1;
511680
512681 if (ctrl->nand_version < 0x0400) {
513
- ctrl->max_page_size = 4096;
682
+ if (ctrl->nand_version < 0x0202)
683
+ ctrl->max_page_size = 2048;
684
+ else
685
+ ctrl->max_page_size = 4096;
514686 ctrl->max_block_size = 512 * 1024;
515687 }
516688 }
517689
518690 /* Maximum spare area sector size (per 512B) */
519
- if (ctrl->nand_version >= 0x0702)
691
+ if (ctrl->nand_version == 0x0702)
520692 ctrl->max_oob = 128;
521693 else if (ctrl->nand_version >= 0x0600)
522694 ctrl->max_oob = 64;
....@@ -545,6 +717,17 @@
545717 ctrl->features |= BRCMNAND_HAS_WP;
546718
547719 return 0;
720
+}
721
+
722
+static void brcmnand_flash_dma_revision_init(struct brcmnand_controller *ctrl)
723
+{
724
+ /* flash_dma register offsets */
725
+ if (ctrl->nand_version >= 0x0703)
726
+ ctrl->flash_dma_offsets = flash_dma_regs_v4;
727
+ else if (ctrl->nand_version == 0x0602)
728
+ ctrl->flash_dma_offsets = flash_dma_regs_v0;
729
+ else
730
+ ctrl->flash_dma_offsets = flash_dma_regs_v1;
548731 }
549732
550733 static inline u32 brcmnand_read_reg(struct brcmnand_controller *ctrl,
....@@ -587,6 +770,22 @@
587770 int word, u32 val)
588771 {
589772 __raw_writel(val, ctrl->nand_fc + word * 4);
773
+}
774
+
775
+static inline void edu_writel(struct brcmnand_controller *ctrl,
776
+ enum edu_reg reg, u32 val)
777
+{
778
+ u16 offs = ctrl->edu_offsets[reg];
779
+
780
+ brcmnand_writel(val, ctrl->edu_base + offs);
781
+}
782
+
783
+static inline u32 edu_readl(struct brcmnand_controller *ctrl,
784
+ enum edu_reg reg)
785
+{
786
+ u16 offs = ctrl->edu_offsets[reg];
787
+
788
+ return brcmnand_readl(ctrl->edu_base + offs);
590789 }
591790
592791 static void brcmnand_clear_ecc_addr(struct brcmnand_controller *ctrl)
....@@ -669,7 +868,10 @@
669868 enum brcmnand_reg reg = BRCMNAND_CORR_THRESHOLD;
670869 int cs = host->cs;
671870
672
- if (ctrl->nand_version >= 0x0702)
871
+ if (!ctrl->reg_offsets[reg])
872
+ return;
873
+
874
+ if (ctrl->nand_version == 0x0702)
673875 bits = 7;
674876 else if (ctrl->nand_version >= 0x0600)
675877 bits = 6;
....@@ -723,12 +925,14 @@
723925
724926 static inline u32 brcmnand_spare_area_mask(struct brcmnand_controller *ctrl)
725927 {
726
- if (ctrl->nand_version >= 0x0702)
928
+ if (ctrl->nand_version == 0x0702)
727929 return GENMASK(7, 0);
728930 else if (ctrl->nand_version >= 0x0600)
729931 return GENMASK(6, 0);
730
- else
932
+ else if (ctrl->nand_version >= 0x0303)
731933 return GENMASK(5, 0);
934
+ else
935
+ return GENMASK(4, 0);
732936 }
733937
734938 #define NAND_ACC_CONTROL_ECC_SHIFT 16
....@@ -853,23 +1057,33 @@
8531057 * Flash DMA
8541058 ***********************************************************************/
8551059
856
-enum flash_dma_reg {
857
- FLASH_DMA_REVISION = 0x00,
858
- FLASH_DMA_FIRST_DESC = 0x04,
859
- FLASH_DMA_FIRST_DESC_EXT = 0x08,
860
- FLASH_DMA_CTRL = 0x0c,
861
- FLASH_DMA_MODE = 0x10,
862
- FLASH_DMA_STATUS = 0x14,
863
- FLASH_DMA_INTERRUPT_DESC = 0x18,
864
- FLASH_DMA_INTERRUPT_DESC_EXT = 0x1c,
865
- FLASH_DMA_ERROR_STATUS = 0x20,
866
- FLASH_DMA_CURRENT_DESC = 0x24,
867
- FLASH_DMA_CURRENT_DESC_EXT = 0x28,
868
-};
869
-
8701060 static inline bool has_flash_dma(struct brcmnand_controller *ctrl)
8711061 {
8721062 return ctrl->flash_dma_base;
1063
+}
1064
+
1065
+static inline bool has_edu(struct brcmnand_controller *ctrl)
1066
+{
1067
+ return ctrl->edu_base;
1068
+}
1069
+
1070
+static inline bool use_dma(struct brcmnand_controller *ctrl)
1071
+{
1072
+ return has_flash_dma(ctrl) || has_edu(ctrl);
1073
+}
1074
+
1075
+static inline void disable_ctrl_irqs(struct brcmnand_controller *ctrl)
1076
+{
1077
+ if (ctrl->pio_poll_mode)
1078
+ return;
1079
+
1080
+ if (has_flash_dma(ctrl)) {
1081
+ ctrl->flash_dma_base = NULL;
1082
+ disable_irq(ctrl->dma_irq);
1083
+ }
1084
+
1085
+ disable_irq(ctrl->irq);
1086
+ ctrl->pio_poll_mode = true;
8731087 }
8741088
8751089 static inline bool flash_dma_buf_ok(const void *buf)
....@@ -878,14 +1092,19 @@
8781092 likely(IS_ALIGNED((uintptr_t)buf, 4));
8791093 }
8801094
881
-static inline void flash_dma_writel(struct brcmnand_controller *ctrl, u8 offs,
882
- u32 val)
1095
+static inline void flash_dma_writel(struct brcmnand_controller *ctrl,
1096
+ enum flash_dma_reg dma_reg, u32 val)
8831097 {
1098
+ u16 offs = ctrl->flash_dma_offsets[dma_reg];
1099
+
8841100 brcmnand_writel(val, ctrl->flash_dma_base + offs);
8851101 }
8861102
887
-static inline u32 flash_dma_readl(struct brcmnand_controller *ctrl, u8 offs)
1103
+static inline u32 flash_dma_readl(struct brcmnand_controller *ctrl,
1104
+ enum flash_dma_reg dma_reg)
8881105 {
1106
+ u16 offs = ctrl->flash_dma_offsets[dma_reg];
1107
+
8891108 return brcmnand_readl(ctrl->flash_dma_base + offs);
8901109 }
8911110
....@@ -944,32 +1163,29 @@
9441163 struct brcmnand_cfg *cfg = &host->hwcfg;
9451164 int sas = cfg->spare_area_size << cfg->sector_size_1k;
9461165 int sectors = cfg->page_size / (512 << cfg->sector_size_1k);
1166
+ u32 next;
9471167
948
- if (section >= sectors * 2)
1168
+ if (section > sectors)
9491169 return -ERANGE;
9501170
951
- oobregion->offset = (section / 2) * sas;
1171
+ next = (section * sas);
1172
+ if (section < sectors)
1173
+ next += 6;
9521174
953
- if (section & 1) {
954
- oobregion->offset += 9;
955
- oobregion->length = 7;
1175
+ if (section) {
1176
+ oobregion->offset = ((section - 1) * sas) + 9;
9561177 } else {
957
- oobregion->length = 6;
958
-
959
- /* First sector of each page may have BBI */
960
- if (!section) {
961
- /*
962
- * Small-page NAND use byte 6 for BBI while large-page
963
- * NAND use bytes 0 and 1.
964
- */
965
- if (cfg->page_size > 512) {
966
- oobregion->offset += 2;
967
- oobregion->length -= 2;
968
- } else {
969
- oobregion->length--;
970
- }
1178
+ if (cfg->page_size > 512) {
1179
+ /* Large page NAND uses first 2 bytes for BBI */
1180
+ oobregion->offset = 2;
1181
+ } else {
1182
+ /* Small page NAND uses last byte before ECC for BBI */
1183
+ oobregion->offset = 0;
1184
+ next--;
9711185 }
9721186 }
1187
+
1188
+ oobregion->length = next - oobregion->offset;
9731189
9741190 return 0;
9751191 }
....@@ -991,7 +1207,7 @@
9911207 if (section >= sectors)
9921208 return -ERANGE;
9931209
994
- oobregion->offset = (section * (sas + 1)) - chip->ecc.bytes;
1210
+ oobregion->offset = ((section + 1) * sas) - chip->ecc.bytes;
9951211 oobregion->length = chip->ecc.bytes;
9961212
9971213 return 0;
....@@ -1229,6 +1445,52 @@
12291445 return tbytes;
12301446 }
12311447
1448
+static void brcmnand_edu_init(struct brcmnand_controller *ctrl)
1449
+{
1450
+ /* initialize edu */
1451
+ edu_writel(ctrl, EDU_ERR_STATUS, 0);
1452
+ edu_readl(ctrl, EDU_ERR_STATUS);
1453
+ edu_writel(ctrl, EDU_DONE, 0);
1454
+ edu_writel(ctrl, EDU_DONE, 0);
1455
+ edu_writel(ctrl, EDU_DONE, 0);
1456
+ edu_writel(ctrl, EDU_DONE, 0);
1457
+ edu_readl(ctrl, EDU_DONE);
1458
+}
1459
+
1460
+/* edu irq */
1461
+static irqreturn_t brcmnand_edu_irq(int irq, void *data)
1462
+{
1463
+ struct brcmnand_controller *ctrl = data;
1464
+
1465
+ if (ctrl->edu_count) {
1466
+ ctrl->edu_count--;
1467
+ while (!(edu_readl(ctrl, EDU_DONE) & EDU_DONE_MASK))
1468
+ udelay(1);
1469
+ edu_writel(ctrl, EDU_DONE, 0);
1470
+ edu_readl(ctrl, EDU_DONE);
1471
+ }
1472
+
1473
+ if (ctrl->edu_count) {
1474
+ ctrl->edu_dram_addr += FC_BYTES;
1475
+ ctrl->edu_ext_addr += FC_BYTES;
1476
+
1477
+ edu_writel(ctrl, EDU_DRAM_ADDR, (u32)ctrl->edu_dram_addr);
1478
+ edu_readl(ctrl, EDU_DRAM_ADDR);
1479
+ edu_writel(ctrl, EDU_EXT_ADDR, ctrl->edu_ext_addr);
1480
+ edu_readl(ctrl, EDU_EXT_ADDR);
1481
+
1482
+ mb(); /* flush previous writes */
1483
+ edu_writel(ctrl, EDU_CMD, ctrl->edu_cmd);
1484
+ edu_readl(ctrl, EDU_CMD);
1485
+
1486
+ return IRQ_HANDLED;
1487
+ }
1488
+
1489
+ complete(&ctrl->edu_done);
1490
+
1491
+ return IRQ_HANDLED;
1492
+}
1493
+
12321494 static irqreturn_t brcmnand_ctlrdy_irq(int irq, void *data)
12331495 {
12341496 struct brcmnand_controller *ctrl = data;
....@@ -1236,6 +1498,16 @@
12361498 /* Discard all NAND_CTLRDY interrupts during DMA */
12371499 if (ctrl->dma_pending)
12381500 return IRQ_HANDLED;
1501
+
1502
+ /* check if you need to piggy back on the ctrlrdy irq */
1503
+ if (ctrl->edu_pending) {
1504
+ if (irq == ctrl->irq && ((int)ctrl->edu_irq >= 0))
1505
+ /* Discard interrupts while using dedicated edu irq */
1506
+ return IRQ_HANDLED;
1507
+
1508
+ /* no registered edu irq, call handler */
1509
+ return brcmnand_edu_irq(irq, data);
1510
+ }
12391511
12401512 complete(&ctrl->done);
12411513 return IRQ_HANDLED;
....@@ -1286,22 +1558,48 @@
12861558 * NAND MTD API: read/program/erase
12871559 ***********************************************************************/
12881560
1289
-static void brcmnand_cmd_ctrl(struct mtd_info *mtd, int dat,
1290
- unsigned int ctrl)
1561
+static void brcmnand_cmd_ctrl(struct nand_chip *chip, int dat,
1562
+ unsigned int ctrl)
12911563 {
12921564 /* intentionally left blank */
12931565 }
12941566
1295
-static int brcmnand_waitfunc(struct mtd_info *mtd, struct nand_chip *this)
1567
+static bool brcmstb_nand_wait_for_completion(struct nand_chip *chip)
12961568 {
1297
- struct nand_chip *chip = mtd_to_nand(mtd);
12981569 struct brcmnand_host *host = nand_get_controller_data(chip);
12991570 struct brcmnand_controller *ctrl = host->ctrl;
1300
- unsigned long timeo = msecs_to_jiffies(100);
1571
+ struct mtd_info *mtd = nand_to_mtd(chip);
1572
+ bool err = false;
1573
+ int sts;
1574
+
1575
+ if (mtd->oops_panic_write) {
1576
+ /* switch to interrupt polling and PIO mode */
1577
+ disable_ctrl_irqs(ctrl);
1578
+ sts = bcmnand_ctrl_poll_status(ctrl, NAND_CTRL_RDY,
1579
+ NAND_CTRL_RDY, 0);
1580
+ err = (sts < 0) ? true : false;
1581
+ } else {
1582
+ unsigned long timeo = msecs_to_jiffies(
1583
+ NAND_POLL_STATUS_TIMEOUT_MS);
1584
+ /* wait for completion interrupt */
1585
+ sts = wait_for_completion_timeout(&ctrl->done, timeo);
1586
+ err = (sts <= 0) ? true : false;
1587
+ }
1588
+
1589
+ return err;
1590
+}
1591
+
1592
+static int brcmnand_waitfunc(struct nand_chip *chip)
1593
+{
1594
+ struct brcmnand_host *host = nand_get_controller_data(chip);
1595
+ struct brcmnand_controller *ctrl = host->ctrl;
1596
+ bool err = false;
13011597
13021598 dev_dbg(ctrl->dev, "wait on native cmd %d\n", ctrl->cmd_pending);
1303
- if (ctrl->cmd_pending &&
1304
- wait_for_completion_timeout(&ctrl->done, timeo) <= 0) {
1599
+ if (ctrl->cmd_pending)
1600
+ err = brcmstb_nand_wait_for_completion(chip);
1601
+
1602
+ if (err) {
13051603 u32 cmd = brcmnand_read_reg(ctrl, BRCMNAND_CMD_START)
13061604 >> brcmnand_cmd_shift(ctrl);
13071605
....@@ -1329,7 +1627,6 @@
13291627 enum brcmnand_llop_type type, u32 data,
13301628 bool last_op)
13311629 {
1332
- struct mtd_info *mtd = nand_to_mtd(&host->chip);
13331630 struct nand_chip *chip = &host->chip;
13341631 struct brcmnand_controller *ctrl = host->ctrl;
13351632 u32 tmp;
....@@ -1362,13 +1659,13 @@
13621659 (void)brcmnand_read_reg(ctrl, BRCMNAND_LL_OP);
13631660
13641661 brcmnand_send_cmd(host, CMD_LOW_LEVEL_OP);
1365
- return brcmnand_waitfunc(mtd, chip);
1662
+ return brcmnand_waitfunc(chip);
13661663 }
13671664
1368
-static void brcmnand_cmdfunc(struct mtd_info *mtd, unsigned command,
1665
+static void brcmnand_cmdfunc(struct nand_chip *chip, unsigned command,
13691666 int column, int page_addr)
13701667 {
1371
- struct nand_chip *chip = mtd_to_nand(mtd);
1668
+ struct mtd_info *mtd = nand_to_mtd(chip);
13721669 struct brcmnand_host *host = nand_get_controller_data(chip);
13731670 struct brcmnand_controller *ctrl = host->ctrl;
13741671 u64 addr = (u64)page_addr << chip->page_shift;
....@@ -1433,7 +1730,7 @@
14331730
14341731 brcmnand_set_cmd_addr(mtd, addr);
14351732 brcmnand_send_cmd(host, native_cmd);
1436
- brcmnand_waitfunc(mtd, chip);
1733
+ brcmnand_waitfunc(chip);
14371734
14381735 if (native_cmd == CMD_PARAMETER_READ ||
14391736 native_cmd == CMD_PARAMETER_CHANGE_COL) {
....@@ -1467,9 +1764,8 @@
14671764 brcmnand_wp(mtd, 1);
14681765 }
14691766
1470
-static uint8_t brcmnand_read_byte(struct mtd_info *mtd)
1767
+static uint8_t brcmnand_read_byte(struct nand_chip *chip)
14711768 {
1472
- struct nand_chip *chip = mtd_to_nand(mtd);
14731769 struct brcmnand_host *host = nand_get_controller_data(chip);
14741770 struct brcmnand_controller *ctrl = host->ctrl;
14751771 uint8_t ret = 0;
....@@ -1524,19 +1820,18 @@
15241820 return ret;
15251821 }
15261822
1527
-static void brcmnand_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
1823
+static void brcmnand_read_buf(struct nand_chip *chip, uint8_t *buf, int len)
15281824 {
15291825 int i;
15301826
15311827 for (i = 0; i < len; i++, buf++)
1532
- *buf = brcmnand_read_byte(mtd);
1828
+ *buf = brcmnand_read_byte(chip);
15331829 }
15341830
1535
-static void brcmnand_write_buf(struct mtd_info *mtd, const uint8_t *buf,
1536
- int len)
1831
+static void brcmnand_write_buf(struct nand_chip *chip, const uint8_t *buf,
1832
+ int len)
15371833 {
15381834 int i;
1539
- struct nand_chip *chip = mtd_to_nand(mtd);
15401835 struct brcmnand_host *host = nand_get_controller_data(chip);
15411836
15421837 switch (host->last_cmd) {
....@@ -1549,6 +1844,97 @@
15491844 BUG();
15501845 break;
15511846 }
1847
+}
1848
+
1849
+/**
1850
+ * Kick EDU engine
1851
+ */
1852
+static int brcmnand_edu_trans(struct brcmnand_host *host, u64 addr, u32 *buf,
1853
+ u32 len, u8 cmd)
1854
+{
1855
+ struct brcmnand_controller *ctrl = host->ctrl;
1856
+ unsigned long timeo = msecs_to_jiffies(200);
1857
+ int ret = 0;
1858
+ int dir = (cmd == CMD_PAGE_READ ? DMA_FROM_DEVICE : DMA_TO_DEVICE);
1859
+ u8 edu_cmd = (cmd == CMD_PAGE_READ ? EDU_CMD_READ : EDU_CMD_WRITE);
1860
+ unsigned int trans = len >> FC_SHIFT;
1861
+ dma_addr_t pa;
1862
+
1863
+ pa = dma_map_single(ctrl->dev, buf, len, dir);
1864
+ if (dma_mapping_error(ctrl->dev, pa)) {
1865
+ dev_err(ctrl->dev, "unable to map buffer for EDU DMA\n");
1866
+ return -ENOMEM;
1867
+ }
1868
+
1869
+ ctrl->edu_pending = true;
1870
+ ctrl->edu_dram_addr = pa;
1871
+ ctrl->edu_ext_addr = addr;
1872
+ ctrl->edu_cmd = edu_cmd;
1873
+ ctrl->edu_count = trans;
1874
+
1875
+ edu_writel(ctrl, EDU_DRAM_ADDR, (u32)ctrl->edu_dram_addr);
1876
+ edu_readl(ctrl, EDU_DRAM_ADDR);
1877
+ edu_writel(ctrl, EDU_EXT_ADDR, ctrl->edu_ext_addr);
1878
+ edu_readl(ctrl, EDU_EXT_ADDR);
1879
+ edu_writel(ctrl, EDU_LENGTH, FC_BYTES);
1880
+ edu_readl(ctrl, EDU_LENGTH);
1881
+
1882
+ /* Start edu engine */
1883
+ mb(); /* flush previous writes */
1884
+ edu_writel(ctrl, EDU_CMD, ctrl->edu_cmd);
1885
+ edu_readl(ctrl, EDU_CMD);
1886
+
1887
+ if (wait_for_completion_timeout(&ctrl->edu_done, timeo) <= 0) {
1888
+ dev_err(ctrl->dev,
1889
+ "timeout waiting for EDU; status %#x, error status %#x\n",
1890
+ edu_readl(ctrl, EDU_STATUS),
1891
+ edu_readl(ctrl, EDU_ERR_STATUS));
1892
+ }
1893
+
1894
+ dma_unmap_single(ctrl->dev, pa, len, dir);
1895
+
1896
+ /* for program page check NAND status */
1897
+ if (((brcmnand_read_reg(ctrl, BRCMNAND_INTFC_STATUS) &
1898
+ INTFC_FLASH_STATUS) & NAND_STATUS_FAIL) &&
1899
+ edu_cmd == EDU_CMD_WRITE) {
1900
+ dev_info(ctrl->dev, "program failed at %llx\n",
1901
+ (unsigned long long)addr);
1902
+ ret = -EIO;
1903
+ }
1904
+
1905
+ /* Make sure the EDU status is clean */
1906
+ if (edu_readl(ctrl, EDU_STATUS) & EDU_STATUS_ACTIVE)
1907
+ dev_warn(ctrl->dev, "EDU still active: %#x\n",
1908
+ edu_readl(ctrl, EDU_STATUS));
1909
+
1910
+ if (unlikely(edu_readl(ctrl, EDU_ERR_STATUS) & EDU_ERR_STATUS_ERRACK)) {
1911
+ dev_warn(ctrl->dev, "EDU RBUS error at addr %llx\n",
1912
+ (unsigned long long)addr);
1913
+ ret = -EIO;
1914
+ }
1915
+
1916
+ ctrl->edu_pending = false;
1917
+ brcmnand_edu_init(ctrl);
1918
+ edu_writel(ctrl, EDU_STOP, 0); /* force stop */
1919
+ edu_readl(ctrl, EDU_STOP);
1920
+
1921
+ if (!ret && edu_cmd == EDU_CMD_READ) {
1922
+ u64 err_addr = 0;
1923
+
1924
+ /*
1925
+ * check for ECC errors here, subpage ECC errors are
1926
+ * retained in ECC error address register
1927
+ */
1928
+ err_addr = brcmnand_get_uncorrecc_addr(ctrl);
1929
+ if (!err_addr) {
1930
+ err_addr = brcmnand_get_correcc_addr(ctrl);
1931
+ if (err_addr)
1932
+ ret = -EUCLEAN;
1933
+ } else
1934
+ ret = -EBADMSG;
1935
+ }
1936
+
1937
+ return ret;
15521938 }
15531939
15541940 /**
....@@ -1594,8 +1980,11 @@
15941980
15951981 flash_dma_writel(ctrl, FLASH_DMA_FIRST_DESC, lower_32_bits(desc));
15961982 (void)flash_dma_readl(ctrl, FLASH_DMA_FIRST_DESC);
1597
- flash_dma_writel(ctrl, FLASH_DMA_FIRST_DESC_EXT, upper_32_bits(desc));
1598
- (void)flash_dma_readl(ctrl, FLASH_DMA_FIRST_DESC_EXT);
1983
+ if (ctrl->nand_version > 0x0602) {
1984
+ flash_dma_writel(ctrl, FLASH_DMA_FIRST_DESC_EXT,
1985
+ upper_32_bits(desc));
1986
+ (void)flash_dma_readl(ctrl, FLASH_DMA_FIRST_DESC_EXT);
1987
+ }
15991988
16001989 /* Start FLASH_DMA engine */
16011990 ctrl->dma_pending = true;
....@@ -1657,7 +2046,7 @@
16572046 brcmnand_set_cmd_addr(mtd, addr);
16582047 /* SPARE_AREA_READ does not use ECC, so just use PAGE_READ */
16592048 brcmnand_send_cmd(host, CMD_PAGE_READ);
1660
- brcmnand_waitfunc(mtd, chip);
2049
+ brcmnand_waitfunc(chip);
16612050
16622051 if (likely(buf)) {
16632052 brcmnand_soc_data_bus_prepare(ctrl->soc, false);
....@@ -1708,28 +2097,31 @@
17082097 static int brcmstb_nand_verify_erased_page(struct mtd_info *mtd,
17092098 struct nand_chip *chip, void *buf, u64 addr)
17102099 {
1711
- int i, sas;
1712
- void *oob = chip->oob_poi;
2100
+ struct mtd_oob_region ecc;
2101
+ int i;
17132102 int bitflips = 0;
17142103 int page = addr >> chip->page_shift;
17152104 int ret;
2105
+ void *ecc_bytes;
2106
+ void *ecc_chunk;
17162107
1717
- if (!buf) {
1718
- buf = chip->data_buf;
1719
- /* Invalidate page cache */
1720
- chip->pagebuf = -1;
1721
- }
1722
-
1723
- sas = mtd->oobsize / chip->ecc.steps;
2108
+ if (!buf)
2109
+ buf = nand_get_data_buf(chip);
17242110
17252111 /* read without ecc for verification */
1726
- ret = chip->ecc.read_page_raw(mtd, chip, buf, true, page);
2112
+ ret = chip->ecc.read_page_raw(chip, buf, true, page);
17272113 if (ret)
17282114 return ret;
17292115
1730
- for (i = 0; i < chip->ecc.steps; i++, oob += sas) {
1731
- ret = nand_check_erased_ecc_chunk(buf, chip->ecc.size,
1732
- oob, sas, NULL, 0,
2116
+ for (i = 0; i < chip->ecc.steps; i++) {
2117
+ ecc_chunk = buf + chip->ecc.size * i;
2118
+
2119
+ mtd_ooblayout_ecc(mtd, i, &ecc);
2120
+ ecc_bytes = chip->oob_poi + ecc.offset;
2121
+
2122
+ ret = nand_check_erased_ecc_chunk(ecc_chunk, chip->ecc.size,
2123
+ ecc_bytes, ecc.length,
2124
+ NULL, 0,
17332125 chip->ecc.strength);
17342126 if (ret < 0)
17352127 return ret;
....@@ -1748,21 +2140,28 @@
17482140 u64 err_addr = 0;
17492141 int err;
17502142 bool retry = true;
2143
+ bool edu_err = false;
17512144
17522145 dev_dbg(ctrl->dev, "read %llx -> %p\n", (unsigned long long)addr, buf);
17532146
17542147 try_dmaread:
17552148 brcmnand_clear_ecc_addr(ctrl);
17562149
1757
- if (has_flash_dma(ctrl) && !oob && flash_dma_buf_ok(buf)) {
1758
- err = brcmnand_dma_trans(host, addr, buf, trans * FC_BYTES,
1759
- CMD_PAGE_READ);
2150
+ if (ctrl->dma_trans && !oob && flash_dma_buf_ok(buf)) {
2151
+ err = ctrl->dma_trans(host, addr, buf,
2152
+ trans * FC_BYTES,
2153
+ CMD_PAGE_READ);
2154
+
17602155 if (err) {
17612156 if (mtd_is_bitflip_or_eccerr(err))
17622157 err_addr = addr;
17632158 else
17642159 return -EIO;
17652160 }
2161
+
2162
+ if (has_edu(ctrl) && err_addr)
2163
+ edu_err = true;
2164
+
17662165 } else {
17672166 if (oob)
17682167 memset(oob, 0x99, mtd->oobsize);
....@@ -1810,6 +2209,11 @@
18102209 if (mtd_is_bitflip(err)) {
18112210 unsigned int corrected = brcmnand_count_corrected(ctrl);
18122211
2212
+ /* in case of EDU correctable error we read again using PIO */
2213
+ if (edu_err)
2214
+ err = brcmnand_read_by_pio(mtd, chip, addr, trans, buf,
2215
+ oob, &err_addr);
2216
+
18132217 dev_dbg(ctrl->dev, "corrected error at 0x%llx\n",
18142218 (unsigned long long)err_addr);
18152219 mtd->ecc_stats.corrected += corrected;
....@@ -1820,9 +2224,10 @@
18202224 return 0;
18212225 }
18222226
1823
-static int brcmnand_read_page(struct mtd_info *mtd, struct nand_chip *chip,
1824
- uint8_t *buf, int oob_required, int page)
2227
+static int brcmnand_read_page(struct nand_chip *chip, uint8_t *buf,
2228
+ int oob_required, int page)
18252229 {
2230
+ struct mtd_info *mtd = nand_to_mtd(chip);
18262231 struct brcmnand_host *host = nand_get_controller_data(chip);
18272232 u8 *oob = oob_required ? (u8 *)chip->oob_poi : NULL;
18282233
....@@ -1832,10 +2237,11 @@
18322237 mtd->writesize >> FC_SHIFT, (u32 *)buf, oob);
18332238 }
18342239
1835
-static int brcmnand_read_page_raw(struct mtd_info *mtd, struct nand_chip *chip,
1836
- uint8_t *buf, int oob_required, int page)
2240
+static int brcmnand_read_page_raw(struct nand_chip *chip, uint8_t *buf,
2241
+ int oob_required, int page)
18372242 {
18382243 struct brcmnand_host *host = nand_get_controller_data(chip);
2244
+ struct mtd_info *mtd = nand_to_mtd(chip);
18392245 u8 *oob = oob_required ? (u8 *)chip->oob_poi : NULL;
18402246 int ret;
18412247
....@@ -1848,17 +2254,18 @@
18482254 return ret;
18492255 }
18502256
1851
-static int brcmnand_read_oob(struct mtd_info *mtd, struct nand_chip *chip,
1852
- int page)
2257
+static int brcmnand_read_oob(struct nand_chip *chip, int page)
18532258 {
2259
+ struct mtd_info *mtd = nand_to_mtd(chip);
2260
+
18542261 return brcmnand_read(mtd, chip, (u64)page << chip->page_shift,
18552262 mtd->writesize >> FC_SHIFT,
18562263 NULL, (u8 *)chip->oob_poi);
18572264 }
18582265
1859
-static int brcmnand_read_oob_raw(struct mtd_info *mtd, struct nand_chip *chip,
1860
- int page)
2266
+static int brcmnand_read_oob_raw(struct nand_chip *chip, int page)
18612267 {
2268
+ struct mtd_info *mtd = nand_to_mtd(chip);
18622269 struct brcmnand_host *host = nand_get_controller_data(chip);
18632270
18642271 brcmnand_set_ecc_enabled(host, 0);
....@@ -1889,10 +2296,12 @@
18892296 for (i = 0; i < ctrl->max_oob; i += 4)
18902297 oob_reg_write(ctrl, i, 0xffffffff);
18912298
1892
- if (has_flash_dma(ctrl) && !oob && flash_dma_buf_ok(buf)) {
1893
- if (brcmnand_dma_trans(host, addr, (u32 *)buf,
1894
- mtd->writesize, CMD_PROGRAM_PAGE))
2299
+ if (use_dma(ctrl) && !oob && flash_dma_buf_ok(buf)) {
2300
+ if (ctrl->dma_trans(host, addr, (u32 *)buf, mtd->writesize,
2301
+ CMD_PROGRAM_PAGE))
2302
+
18952303 ret = -EIO;
2304
+
18962305 goto out;
18972306 }
18982307
....@@ -1920,7 +2329,7 @@
19202329
19212330 /* we cannot use SPARE_AREA_PROGRAM when PARTIAL_PAGE_EN=0 */
19222331 brcmnand_send_cmd(host, CMD_PROGRAM_PAGE);
1923
- status = brcmnand_waitfunc(mtd, chip);
2332
+ status = brcmnand_waitfunc(chip);
19242333
19252334 if (status & NAND_STATUS_FAIL) {
19262335 dev_info(ctrl->dev, "program failed at %llx\n",
....@@ -1934,9 +2343,10 @@
19342343 return ret;
19352344 }
19362345
1937
-static int brcmnand_write_page(struct mtd_info *mtd, struct nand_chip *chip,
1938
- const uint8_t *buf, int oob_required, int page)
2346
+static int brcmnand_write_page(struct nand_chip *chip, const uint8_t *buf,
2347
+ int oob_required, int page)
19392348 {
2349
+ struct mtd_info *mtd = nand_to_mtd(chip);
19402350 struct brcmnand_host *host = nand_get_controller_data(chip);
19412351 void *oob = oob_required ? chip->oob_poi : NULL;
19422352
....@@ -1946,10 +2356,10 @@
19462356 return nand_prog_page_end_op(chip);
19472357 }
19482358
1949
-static int brcmnand_write_page_raw(struct mtd_info *mtd,
1950
- struct nand_chip *chip, const uint8_t *buf,
2359
+static int brcmnand_write_page_raw(struct nand_chip *chip, const uint8_t *buf,
19512360 int oob_required, int page)
19522361 {
2362
+ struct mtd_info *mtd = nand_to_mtd(chip);
19532363 struct brcmnand_host *host = nand_get_controller_data(chip);
19542364 void *oob = oob_required ? chip->oob_poi : NULL;
19552365
....@@ -1961,16 +2371,16 @@
19612371 return nand_prog_page_end_op(chip);
19622372 }
19632373
1964
-static int brcmnand_write_oob(struct mtd_info *mtd, struct nand_chip *chip,
1965
- int page)
2374
+static int brcmnand_write_oob(struct nand_chip *chip, int page)
19662375 {
1967
- return brcmnand_write(mtd, chip, (u64)page << chip->page_shift,
1968
- NULL, chip->oob_poi);
2376
+ return brcmnand_write(nand_to_mtd(chip), chip,
2377
+ (u64)page << chip->page_shift, NULL,
2378
+ chip->oob_poi);
19692379 }
19702380
1971
-static int brcmnand_write_oob_raw(struct mtd_info *mtd, struct nand_chip *chip,
1972
- int page)
2381
+static int brcmnand_write_oob_raw(struct nand_chip *chip, int page)
19732382 {
2383
+ struct mtd_info *mtd = nand_to_mtd(chip);
19742384 struct brcmnand_host *host = nand_get_controller_data(chip);
19752385 int ret;
19762386
....@@ -2059,7 +2469,7 @@
20592469 (!!(cfg->device_width == 16) << CFG_BUS_WIDTH_SHIFT) |
20602470 (device_size << CFG_DEVICE_SIZE_SHIFT);
20612471 if (cfg_offs == cfg_ext_offs) {
2062
- tmp |= (page_size << CFG_PAGE_SIZE_SHIFT) |
2472
+ tmp |= (page_size << ctrl->page_size_shift) |
20632473 (block_size << CFG_BLK_SIZE_SHIFT);
20642474 nand_writereg(ctrl, cfg_offs, tmp);
20652475 } else {
....@@ -2071,9 +2481,11 @@
20712481
20722482 tmp = nand_readreg(ctrl, acc_control_offs);
20732483 tmp &= ~brcmnand_ecc_level_mask(ctrl);
2074
- tmp |= cfg->ecc_level << NAND_ACC_CONTROL_ECC_SHIFT;
20752484 tmp &= ~brcmnand_spare_area_mask(ctrl);
2076
- tmp |= cfg->spare_area_size;
2485
+ if (ctrl->nand_version >= 0x0302) {
2486
+ tmp |= cfg->ecc_level << NAND_ACC_CONTROL_ECC_SHIFT;
2487
+ tmp |= cfg->spare_area_size;
2488
+ }
20772489 nand_writereg(ctrl, acc_control_offs, tmp);
20782490
20792491 brcmnand_set_sector_size_1k(host, cfg->sector_size_1k);
....@@ -2120,6 +2532,8 @@
21202532 {
21212533 struct mtd_info *mtd = nand_to_mtd(&host->chip);
21222534 struct nand_chip *chip = &host->chip;
2535
+ const struct nand_ecc_props *requirements =
2536
+ nanddev_get_ecc_requirements(&chip->base);
21232537 struct brcmnand_controller *ctrl = host->ctrl;
21242538 struct brcmnand_cfg *cfg = &host->hwcfg;
21252539 char msg[128];
....@@ -2153,31 +2567,42 @@
21532567 cfg->col_adr_bytes = 2;
21542568 cfg->blk_adr_bytes = get_blk_adr_bytes(mtd->size, mtd->writesize);
21552569
2156
- if (chip->ecc.mode != NAND_ECC_HW) {
2570
+ if (chip->ecc.engine_type != NAND_ECC_ENGINE_TYPE_ON_HOST) {
21572571 dev_err(ctrl->dev, "only HW ECC supported; selected: %d\n",
2158
- chip->ecc.mode);
2572
+ chip->ecc.engine_type);
21592573 return -EINVAL;
21602574 }
21612575
2162
- if (chip->ecc.algo == NAND_ECC_UNKNOWN) {
2576
+ if (chip->ecc.algo == NAND_ECC_ALGO_UNKNOWN) {
21632577 if (chip->ecc.strength == 1 && chip->ecc.size == 512)
21642578 /* Default to Hamming for 1-bit ECC, if unspecified */
2165
- chip->ecc.algo = NAND_ECC_HAMMING;
2579
+ chip->ecc.algo = NAND_ECC_ALGO_HAMMING;
21662580 else
21672581 /* Otherwise, BCH */
2168
- chip->ecc.algo = NAND_ECC_BCH;
2582
+ chip->ecc.algo = NAND_ECC_ALGO_BCH;
21692583 }
21702584
2171
- if (chip->ecc.algo == NAND_ECC_HAMMING && (chip->ecc.strength != 1 ||
2172
- chip->ecc.size != 512)) {
2585
+ if (chip->ecc.algo == NAND_ECC_ALGO_HAMMING &&
2586
+ (chip->ecc.strength != 1 || chip->ecc.size != 512)) {
21732587 dev_err(ctrl->dev, "invalid Hamming params: %d bits per %d bytes\n",
21742588 chip->ecc.strength, chip->ecc.size);
21752589 return -EINVAL;
21762590 }
21772591
2592
+ if (chip->ecc.engine_type != NAND_ECC_ENGINE_TYPE_NONE &&
2593
+ (!chip->ecc.size || !chip->ecc.strength)) {
2594
+ if (requirements->step_size && requirements->strength) {
2595
+ /* use detected ECC parameters */
2596
+ chip->ecc.size = requirements->step_size;
2597
+ chip->ecc.strength = requirements->strength;
2598
+ dev_info(ctrl->dev, "Using ECC step-size %d, strength %d\n",
2599
+ chip->ecc.size, chip->ecc.strength);
2600
+ }
2601
+ }
2602
+
21782603 switch (chip->ecc.size) {
21792604 case 512:
2180
- if (chip->ecc.algo == NAND_ECC_HAMMING)
2605
+ if (chip->ecc.algo == NAND_ECC_ALGO_HAMMING)
21812606 cfg->ecc_level = 15;
21822607 else
21832608 cfg->ecc_level = chip->ecc.strength;
....@@ -2248,7 +2673,7 @@
22482673 * to/from, and have nand_base pass us a bounce buffer instead, as
22492674 * needed.
22502675 */
2251
- chip->options |= NAND_USE_BOUNCE_BUFFER;
2676
+ chip->options |= NAND_USES_DMA;
22522677
22532678 if (chip->bbt_options & NAND_BBT_USE_FLASH)
22542679 chip->bbt_options |= NAND_BBT_NO_OOB;
....@@ -2304,17 +2729,14 @@
23042729 mtd->owner = THIS_MODULE;
23052730 mtd->dev.parent = &pdev->dev;
23062731
2307
- chip->IO_ADDR_R = (void __iomem *)0xdeadbeef;
2308
- chip->IO_ADDR_W = (void __iomem *)0xdeadbeef;
2732
+ chip->legacy.cmd_ctrl = brcmnand_cmd_ctrl;
2733
+ chip->legacy.cmdfunc = brcmnand_cmdfunc;
2734
+ chip->legacy.waitfunc = brcmnand_waitfunc;
2735
+ chip->legacy.read_byte = brcmnand_read_byte;
2736
+ chip->legacy.read_buf = brcmnand_read_buf;
2737
+ chip->legacy.write_buf = brcmnand_write_buf;
23092738
2310
- chip->cmd_ctrl = brcmnand_cmd_ctrl;
2311
- chip->cmdfunc = brcmnand_cmdfunc;
2312
- chip->waitfunc = brcmnand_waitfunc;
2313
- chip->read_byte = brcmnand_read_byte;
2314
- chip->read_buf = brcmnand_read_buf;
2315
- chip->write_buf = brcmnand_write_buf;
2316
-
2317
- chip->ecc.mode = NAND_ECC_HW;
2739
+ chip->ecc.engine_type = NAND_ECC_ENGINE_TYPE_ON_HOST;
23182740 chip->ecc.read_page = brcmnand_read_page;
23192741 chip->ecc.write_page = brcmnand_write_page;
23202742 chip->ecc.read_page_raw = brcmnand_read_page_raw;
....@@ -2392,6 +2814,8 @@
23922814
23932815 if (has_flash_dma(ctrl))
23942816 ctrl->flash_dma_mode = flash_dma_readl(ctrl, FLASH_DMA_MODE);
2817
+ else if (has_edu(ctrl))
2818
+ ctrl->edu_config = edu_readl(ctrl, EDU_CONFIG);
23952819
23962820 return 0;
23972821 }
....@@ -2404,6 +2828,13 @@
24042828 if (has_flash_dma(ctrl)) {
24052829 flash_dma_writel(ctrl, FLASH_DMA_MODE, ctrl->flash_dma_mode);
24062830 flash_dma_writel(ctrl, FLASH_DMA_ERROR_STATUS, 0);
2831
+ }
2832
+
2833
+ if (has_edu(ctrl)) {
2834
+ ctrl->edu_config = edu_readl(ctrl, EDU_CONFIG);
2835
+ edu_writel(ctrl, EDU_CONFIG, ctrl->edu_config);
2836
+ edu_readl(ctrl, EDU_CONFIG);
2837
+ brcmnand_edu_init(ctrl);
24072838 }
24082839
24092840 brcmnand_write_reg(ctrl, BRCMNAND_CS_SELECT, ctrl->nand_cs_nand_select);
....@@ -2435,6 +2866,8 @@
24352866 EXPORT_SYMBOL_GPL(brcmnand_pm_ops);
24362867
24372868 static const struct of_device_id brcmnand_of_match[] = {
2869
+ { .compatible = "brcm,brcmnand-v2.1" },
2870
+ { .compatible = "brcm,brcmnand-v2.2" },
24382871 { .compatible = "brcm,brcmnand-v4.0" },
24392872 { .compatible = "brcm,brcmnand-v5.0" },
24402873 { .compatible = "brcm,brcmnand-v6.0" },
....@@ -2443,6 +2876,7 @@
24432876 { .compatible = "brcm,brcmnand-v7.0" },
24442877 { .compatible = "brcm,brcmnand-v7.1" },
24452878 { .compatible = "brcm,brcmnand-v7.2" },
2879
+ { .compatible = "brcm,brcmnand-v7.3" },
24462880 {},
24472881 };
24482882 MODULE_DEVICE_TABLE(of, brcmnand_of_match);
....@@ -2450,6 +2884,49 @@
24502884 /***********************************************************************
24512885 * Platform driver setup (per controller)
24522886 ***********************************************************************/
2887
+static int brcmnand_edu_setup(struct platform_device *pdev)
2888
+{
2889
+ struct device *dev = &pdev->dev;
2890
+ struct brcmnand_controller *ctrl = dev_get_drvdata(&pdev->dev);
2891
+ struct resource *res;
2892
+ int ret;
2893
+
2894
+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "flash-edu");
2895
+ if (res) {
2896
+ ctrl->edu_base = devm_ioremap_resource(dev, res);
2897
+ if (IS_ERR(ctrl->edu_base))
2898
+ return PTR_ERR(ctrl->edu_base);
2899
+
2900
+ ctrl->edu_offsets = edu_regs;
2901
+
2902
+ edu_writel(ctrl, EDU_CONFIG, EDU_CONFIG_MODE_NAND |
2903
+ EDU_CONFIG_SWAP_CFG);
2904
+ edu_readl(ctrl, EDU_CONFIG);
2905
+
2906
+ /* initialize edu */
2907
+ brcmnand_edu_init(ctrl);
2908
+
2909
+ ctrl->edu_irq = platform_get_irq_optional(pdev, 1);
2910
+ if (ctrl->edu_irq < 0) {
2911
+ dev_warn(dev,
2912
+ "FLASH EDU enabled, using ctlrdy irq\n");
2913
+ } else {
2914
+ ret = devm_request_irq(dev, ctrl->edu_irq,
2915
+ brcmnand_edu_irq, 0,
2916
+ "brcmnand-edu", ctrl);
2917
+ if (ret < 0) {
2918
+ dev_err(ctrl->dev, "can't allocate IRQ %d: error %d\n",
2919
+ ctrl->edu_irq, ret);
2920
+ return ret;
2921
+ }
2922
+
2923
+ dev_info(dev, "FLASH EDU enabled using irq %u\n",
2924
+ ctrl->edu_irq);
2925
+ }
2926
+ }
2927
+
2928
+ return 0;
2929
+}
24532930
24542931 int brcmnand_probe(struct platform_device *pdev, struct brcmnand_soc *soc)
24552932 {
....@@ -2475,6 +2952,7 @@
24752952
24762953 init_completion(&ctrl->done);
24772954 init_completion(&ctrl->dma_done);
2955
+ init_completion(&ctrl->edu_done);
24782956 nand_controller_init(&ctrl->controller);
24792957 ctrl->controller.ops = &brcmnand_controller_ops;
24802958 INIT_LIST_HEAD(&ctrl->host_list);
....@@ -2529,7 +3007,21 @@
25293007 goto err;
25303008 }
25313009
2532
- flash_dma_writel(ctrl, FLASH_DMA_MODE, 1); /* linked-list */
3010
+ /* initialize the dma version */
3011
+ brcmnand_flash_dma_revision_init(ctrl);
3012
+
3013
+ ret = -EIO;
3014
+ if (ctrl->nand_version >= 0x0700)
3015
+ ret = dma_set_mask_and_coherent(&pdev->dev,
3016
+ DMA_BIT_MASK(40));
3017
+ if (ret)
3018
+ ret = dma_set_mask_and_coherent(&pdev->dev,
3019
+ DMA_BIT_MASK(32));
3020
+ if (ret)
3021
+ goto err;
3022
+
3023
+ /* linked-list and stop on error */
3024
+ flash_dma_writel(ctrl, FLASH_DMA_MODE, FLASH_DMA_MODE_MASK);
25333025 flash_dma_writel(ctrl, FLASH_DMA_ERROR_STATUS, 0);
25343026
25353027 /* Allocate descriptor(s) */
....@@ -2558,6 +3050,16 @@
25583050 }
25593051
25603052 dev_info(dev, "enabling FLASH_DMA\n");
3053
+ /* set flash dma transfer function to call */
3054
+ ctrl->dma_trans = brcmnand_dma_trans;
3055
+ } else {
3056
+ ret = brcmnand_edu_setup(pdev);
3057
+ if (ret < 0)
3058
+ goto err;
3059
+
3060
+ if (has_edu(ctrl))
3061
+ /* set edu transfer function to call */
3062
+ ctrl->dma_trans = brcmnand_edu_trans;
25613063 }
25623064
25633065 /* Disable automatic device ID config, direct addressing */
....@@ -2648,9 +3150,15 @@
26483150 {
26493151 struct brcmnand_controller *ctrl = dev_get_drvdata(&pdev->dev);
26503152 struct brcmnand_host *host;
3153
+ struct nand_chip *chip;
3154
+ int ret;
26513155
2652
- list_for_each_entry(host, &ctrl->host_list, node)
2653
- nand_release(&host->chip);
3156
+ list_for_each_entry(host, &ctrl->host_list, node) {
3157
+ chip = &host->chip;
3158
+ ret = mtd_device_unregister(nand_to_mtd(chip));
3159
+ WARN_ON(ret);
3160
+ nand_cleanup(chip);
3161
+ }
26543162
26553163 clk_disable_unprepare(ctrl->clk);
26563164