1 // SPDX-License-Identifier: GPL-2.0+
2 /* Integrated Flash Controller NAND Machine Driver
3  *
4  * Copyright (c) 2012 Freescale Semiconductor, Inc
5  *
6  * Authors: Dipen Dudhat <Dipen.Dudhat@freescale.com>
7  */
8 
9 #include <common.h>
10 #include <malloc.h>
11 #include <nand.h>
12 
13 #include <linux/mtd/mtd.h>
14 #include <linux/mtd/rawnand.h>
15 #include <linux/mtd/nand_ecc.h>
16 
17 #include <asm/io.h>
18 #include <linux/errno.h>
19 #include <fsl_ifc.h>
20 
21 #ifndef CONFIG_SYS_FSL_IFC_BANK_COUNT
22 #define CONFIG_SYS_FSL_IFC_BANK_COUNT	4
23 #endif
24 
25 #define MAX_BANKS	CONFIG_SYS_FSL_IFC_BANK_COUNT
26 #define ERR_BYTE	0xFF /* Value returned for read bytes
27 				when read failed */
28 
29 struct fsl_ifc_ctrl;
30 
31 /* mtd information per set */
32 struct fsl_ifc_mtd {
33 	struct nand_chip chip;
34 	struct fsl_ifc_ctrl *ctrl;
35 
36 	struct device *dev;
37 	int bank;               /* Chip select bank number                */
38 	unsigned int bufnum_mask; /* bufnum = page & bufnum_mask */
39 	u8 __iomem *vbase;      /* Chip select base virtual address       */
40 };
41 
42 /* overview of the fsl ifc controller */
43 struct fsl_ifc_ctrl {
44 	struct nand_hw_control controller;
45 	struct fsl_ifc_mtd *chips[MAX_BANKS];
46 
47 	/* device info */
48 	struct fsl_ifc regs;
49 	void __iomem *addr;      /* Address of assigned IFC buffer        */
50 	unsigned int page;       /* Last page written to / read from      */
51 	unsigned int read_bytes; /* Number of bytes read during command   */
52 	unsigned int column;     /* Saved column from SEQIN               */
53 	unsigned int index;      /* Pointer to next byte to 'read'        */
54 	unsigned int status;     /* status read from NEESR after last op  */
55 	unsigned int oob;        /* Non zero if operating on OOB data     */
56 	unsigned int eccread;    /* Non zero for a full-page ECC read     */
57 };
58 
59 static struct fsl_ifc_ctrl *ifc_ctrl;
60 
61 /* 512-byte page with 4-bit ECC, 8-bit */
62 static struct nand_ecclayout oob_512_8bit_ecc4 = {
63 	.eccbytes = 8,
64 	.eccpos = {8, 9, 10, 11, 12, 13, 14, 15},
65 	.oobfree = { {0, 5}, {6, 2} },
66 };
67 
68 /* 512-byte page with 4-bit ECC, 16-bit */
69 static struct nand_ecclayout oob_512_16bit_ecc4 = {
70 	.eccbytes = 8,
71 	.eccpos = {8, 9, 10, 11, 12, 13, 14, 15},
72 	.oobfree = { {2, 6}, },
73 };
74 
75 /* 2048-byte page size with 4-bit ECC */
76 static struct nand_ecclayout oob_2048_ecc4 = {
77 	.eccbytes = 32,
78 	.eccpos = {
79 		8, 9, 10, 11, 12, 13, 14, 15,
80 		16, 17, 18, 19, 20, 21, 22, 23,
81 		24, 25, 26, 27, 28, 29, 30, 31,
82 		32, 33, 34, 35, 36, 37, 38, 39,
83 	},
84 	.oobfree = { {2, 6}, {40, 24} },
85 };
86 
87 /* 4096-byte page size with 4-bit ECC */
88 static struct nand_ecclayout oob_4096_ecc4 = {
89 	.eccbytes = 64,
90 	.eccpos = {
91 		8, 9, 10, 11, 12, 13, 14, 15,
92 		16, 17, 18, 19, 20, 21, 22, 23,
93 		24, 25, 26, 27, 28, 29, 30, 31,
94 		32, 33, 34, 35, 36, 37, 38, 39,
95 		40, 41, 42, 43, 44, 45, 46, 47,
96 		48, 49, 50, 51, 52, 53, 54, 55,
97 		56, 57, 58, 59, 60, 61, 62, 63,
98 		64, 65, 66, 67, 68, 69, 70, 71,
99 	},
100 	.oobfree = { {2, 6}, {72, 56} },
101 };
102 
103 /* 4096-byte page size with 8-bit ECC -- requires 218-byte OOB */
104 static struct nand_ecclayout oob_4096_ecc8 = {
105 	.eccbytes = 128,
106 	.eccpos = {
107 		8, 9, 10, 11, 12, 13, 14, 15,
108 		16, 17, 18, 19, 20, 21, 22, 23,
109 		24, 25, 26, 27, 28, 29, 30, 31,
110 		32, 33, 34, 35, 36, 37, 38, 39,
111 		40, 41, 42, 43, 44, 45, 46, 47,
112 		48, 49, 50, 51, 52, 53, 54, 55,
113 		56, 57, 58, 59, 60, 61, 62, 63,
114 		64, 65, 66, 67, 68, 69, 70, 71,
115 		72, 73, 74, 75, 76, 77, 78, 79,
116 		80, 81, 82, 83, 84, 85, 86, 87,
117 		88, 89, 90, 91, 92, 93, 94, 95,
118 		96, 97, 98, 99, 100, 101, 102, 103,
119 		104, 105, 106, 107, 108, 109, 110, 111,
120 		112, 113, 114, 115, 116, 117, 118, 119,
121 		120, 121, 122, 123, 124, 125, 126, 127,
122 		128, 129, 130, 131, 132, 133, 134, 135,
123 	},
124 	.oobfree = { {2, 6}, {136, 82} },
125 };
126 
127 /* 8192-byte page size with 4-bit ECC */
128 static struct nand_ecclayout oob_8192_ecc4 = {
129 	.eccbytes = 128,
130 	.eccpos = {
131 		8, 9, 10, 11, 12, 13, 14, 15,
132 		16, 17, 18, 19, 20, 21, 22, 23,
133 		24, 25, 26, 27, 28, 29, 30, 31,
134 		32, 33, 34, 35, 36, 37, 38, 39,
135 		40, 41, 42, 43, 44, 45, 46, 47,
136 		48, 49, 50, 51, 52, 53, 54, 55,
137 		56, 57, 58, 59, 60, 61, 62, 63,
138 		64, 65, 66, 67, 68, 69, 70, 71,
139 		72, 73, 74, 75, 76, 77, 78, 79,
140 		80, 81, 82, 83, 84, 85, 86, 87,
141 		88, 89, 90, 91, 92, 93, 94, 95,
142 		96, 97, 98, 99, 100, 101, 102, 103,
143 		104, 105, 106, 107, 108, 109, 110, 111,
144 		112, 113, 114, 115, 116, 117, 118, 119,
145 		120, 121, 122, 123, 124, 125, 126, 127,
146 		128, 129, 130, 131, 132, 133, 134, 135,
147 	},
148 	.oobfree = { {2, 6}, {136, 208} },
149 };
150 
151 /* 8192-byte page size with 8-bit ECC -- requires 218-byte OOB */
152 static struct nand_ecclayout oob_8192_ecc8 = {
153 	.eccbytes = 256,
154 	.eccpos = {
155 		8, 9, 10, 11, 12, 13, 14, 15,
156 		16, 17, 18, 19, 20, 21, 22, 23,
157 		24, 25, 26, 27, 28, 29, 30, 31,
158 		32, 33, 34, 35, 36, 37, 38, 39,
159 		40, 41, 42, 43, 44, 45, 46, 47,
160 		48, 49, 50, 51, 52, 53, 54, 55,
161 		56, 57, 58, 59, 60, 61, 62, 63,
162 		64, 65, 66, 67, 68, 69, 70, 71,
163 		72, 73, 74, 75, 76, 77, 78, 79,
164 		80, 81, 82, 83, 84, 85, 86, 87,
165 		88, 89, 90, 91, 92, 93, 94, 95,
166 		96, 97, 98, 99, 100, 101, 102, 103,
167 		104, 105, 106, 107, 108, 109, 110, 111,
168 		112, 113, 114, 115, 116, 117, 118, 119,
169 		120, 121, 122, 123, 124, 125, 126, 127,
170 		128, 129, 130, 131, 132, 133, 134, 135,
171 		136, 137, 138, 139, 140, 141, 142, 143,
172 		144, 145, 146, 147, 148, 149, 150, 151,
173 		152, 153, 154, 155, 156, 157, 158, 159,
174 		160, 161, 162, 163, 164, 165, 166, 167,
175 		168, 169, 170, 171, 172, 173, 174, 175,
176 		176, 177, 178, 179, 180, 181, 182, 183,
177 		184, 185, 186, 187, 188, 189, 190, 191,
178 		192, 193, 194, 195, 196, 197, 198, 199,
179 		200, 201, 202, 203, 204, 205, 206, 207,
180 		208, 209, 210, 211, 212, 213, 214, 215,
181 		216, 217, 218, 219, 220, 221, 222, 223,
182 		224, 225, 226, 227, 228, 229, 230, 231,
183 		232, 233, 234, 235, 236, 237, 238, 239,
184 		240, 241, 242, 243, 244, 245, 246, 247,
185 		248, 249, 250, 251, 252, 253, 254, 255,
186 		256, 257, 258, 259, 260, 261, 262, 263,
187 	},
188 	.oobfree = { {2, 6}, {264, 80} },
189 };
190 
191 /*
192  * Generic flash bbt descriptors
193  */
194 static u8 bbt_pattern[] = {'B', 'b', 't', '0' };
195 static u8 mirror_pattern[] = {'1', 't', 'b', 'B' };
196 
197 static struct nand_bbt_descr bbt_main_descr = {
198 	.options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE |
199 		   NAND_BBT_2BIT | NAND_BBT_VERSION,
200 	.offs =	2, /* 0 on 8-bit small page */
201 	.len = 4,
202 	.veroffs = 6,
203 	.maxblocks = 4,
204 	.pattern = bbt_pattern,
205 };
206 
207 static struct nand_bbt_descr bbt_mirror_descr = {
208 	.options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE |
209 		   NAND_BBT_2BIT | NAND_BBT_VERSION,
210 	.offs =	2, /* 0 on 8-bit small page */
211 	.len = 4,
212 	.veroffs = 6,
213 	.maxblocks = 4,
214 	.pattern = mirror_pattern,
215 };
216 
217 /*
218  * Set up the IFC hardware block and page address fields, and the ifc nand
219  * structure addr field to point to the correct IFC buffer in memory
220  */
221 static void set_addr(struct mtd_info *mtd, int column, int page_addr, int oob)
222 {
223 	struct nand_chip *chip = mtd_to_nand(mtd);
224 	struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
225 	struct fsl_ifc_ctrl *ctrl = priv->ctrl;
226 	struct fsl_ifc_runtime *ifc = ctrl->regs.rregs;
227 	int buf_num;
228 
229 	ctrl->page = page_addr;
230 
231 	/* Program ROW0/COL0 */
232 	ifc_out32(&ifc->ifc_nand.row0, page_addr);
233 	ifc_out32(&ifc->ifc_nand.col0, (oob ? IFC_NAND_COL_MS : 0) | column);
234 
235 	buf_num = page_addr & priv->bufnum_mask;
236 
237 	ctrl->addr = priv->vbase + buf_num * (mtd->writesize * 2);
238 	ctrl->index = column;
239 
240 	/* for OOB data point to the second half of the buffer */
241 	if (oob)
242 		ctrl->index += mtd->writesize;
243 }
244 
245 /* returns nonzero if entire page is blank */
246 static int check_read_ecc(struct mtd_info *mtd, struct fsl_ifc_ctrl *ctrl,
247 			  u32 eccstat, unsigned int bufnum)
248 {
249 	return (eccstat >> ((3 - bufnum % 4) * 8)) & 15;
250 }
251 
252 /*
253  * execute IFC NAND command and wait for it to complete
254  */
255 static int fsl_ifc_run_command(struct mtd_info *mtd)
256 {
257 	struct nand_chip *chip = mtd_to_nand(mtd);
258 	struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
259 	struct fsl_ifc_ctrl *ctrl = priv->ctrl;
260 	struct fsl_ifc_runtime *ifc = ctrl->regs.rregs;
261 	u32 timeo = (CONFIG_SYS_HZ * 10) / 1000;
262 	u32 time_start;
263 	u32 eccstat;
264 	int i;
265 
266 	/* set the chip select for NAND Transaction */
267 	ifc_out32(&ifc->ifc_nand.nand_csel, priv->bank << IFC_NAND_CSEL_SHIFT);
268 
269 	/* start read/write seq */
270 	ifc_out32(&ifc->ifc_nand.nandseq_strt,
271 		  IFC_NAND_SEQ_STRT_FIR_STRT);
272 
273 	/* wait for NAND Machine complete flag or timeout */
274 	time_start = get_timer(0);
275 
276 	while (get_timer(time_start) < timeo) {
277 		ctrl->status = ifc_in32(&ifc->ifc_nand.nand_evter_stat);
278 
279 		if (ctrl->status & IFC_NAND_EVTER_STAT_OPC)
280 			break;
281 	}
282 
283 	ifc_out32(&ifc->ifc_nand.nand_evter_stat, ctrl->status);
284 
285 	if (ctrl->status & IFC_NAND_EVTER_STAT_FTOER)
286 		printf("%s: Flash Time Out Error\n", __func__);
287 	if (ctrl->status & IFC_NAND_EVTER_STAT_WPER)
288 		printf("%s: Write Protect Error\n", __func__);
289 
290 	if (ctrl->eccread) {
291 		int errors;
292 		int bufnum = ctrl->page & priv->bufnum_mask;
293 		int sector_start = bufnum * chip->ecc.steps;
294 		int sector_end = sector_start + chip->ecc.steps - 1;
295 		u32 *eccstat_regs;
296 
297 		eccstat_regs = ifc->ifc_nand.nand_eccstat;
298 		eccstat = ifc_in32(&eccstat_regs[sector_start / 4]);
299 
300 		for (i = sector_start; i <= sector_end; i++) {
301 			if ((i != sector_start) && !(i % 4))
302 				eccstat = ifc_in32(&eccstat_regs[i / 4]);
303 
304 			errors = check_read_ecc(mtd, ctrl, eccstat, i);
305 
306 			if (errors == 15) {
307 				/*
308 				 * Uncorrectable error.
309 				 * We'll check for blank pages later.
310 				 *
311 				 * We disable ECCER reporting due to erratum
312 				 * IFC-A002770 -- so report it now if we
313 				 * see an uncorrectable error in ECCSTAT.
314 				 */
315 				ctrl->status |= IFC_NAND_EVTER_STAT_ECCER;
316 				continue;
317 			}
318 
319 			mtd->ecc_stats.corrected += errors;
320 		}
321 
322 		ctrl->eccread = 0;
323 	}
324 
325 	/* returns 0 on success otherwise non-zero) */
326 	return ctrl->status == IFC_NAND_EVTER_STAT_OPC ? 0 : -EIO;
327 }
328 
329 static void fsl_ifc_do_read(struct nand_chip *chip,
330 			    int oob,
331 			    struct mtd_info *mtd)
332 {
333 	struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
334 	struct fsl_ifc_ctrl *ctrl = priv->ctrl;
335 	struct fsl_ifc_runtime *ifc = ctrl->regs.rregs;
336 
337 	/* Program FIR/IFC_NAND_FCR0 for Small/Large page */
338 	if (mtd->writesize > 512) {
339 		ifc_out32(&ifc->ifc_nand.nand_fir0,
340 			  (IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
341 			  (IFC_FIR_OP_CA0 << IFC_NAND_FIR0_OP1_SHIFT) |
342 			  (IFC_FIR_OP_RA0 << IFC_NAND_FIR0_OP2_SHIFT) |
343 			  (IFC_FIR_OP_CMD1 << IFC_NAND_FIR0_OP3_SHIFT) |
344 			  (IFC_FIR_OP_RBCD << IFC_NAND_FIR0_OP4_SHIFT));
345 		ifc_out32(&ifc->ifc_nand.nand_fir1, 0x0);
346 
347 		ifc_out32(&ifc->ifc_nand.nand_fcr0,
348 			  (NAND_CMD_READ0 << IFC_NAND_FCR0_CMD0_SHIFT) |
349 			  (NAND_CMD_READSTART << IFC_NAND_FCR0_CMD1_SHIFT));
350 	} else {
351 		ifc_out32(&ifc->ifc_nand.nand_fir0,
352 			  (IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
353 			  (IFC_FIR_OP_CA0 << IFC_NAND_FIR0_OP1_SHIFT) |
354 			  (IFC_FIR_OP_RA0  << IFC_NAND_FIR0_OP2_SHIFT) |
355 			  (IFC_FIR_OP_RBCD << IFC_NAND_FIR0_OP3_SHIFT));
356 
357 		if (oob)
358 			ifc_out32(&ifc->ifc_nand.nand_fcr0,
359 				  NAND_CMD_READOOB << IFC_NAND_FCR0_CMD0_SHIFT);
360 		else
361 			ifc_out32(&ifc->ifc_nand.nand_fcr0,
362 				  NAND_CMD_READ0 << IFC_NAND_FCR0_CMD0_SHIFT);
363 	}
364 }
365 
366 /* cmdfunc send commands to the IFC NAND Machine */
367 static void fsl_ifc_cmdfunc(struct mtd_info *mtd, unsigned int command,
368 			     int column, int page_addr)
369 {
370 	struct nand_chip *chip = mtd_to_nand(mtd);
371 	struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
372 	struct fsl_ifc_ctrl *ctrl = priv->ctrl;
373 	struct fsl_ifc_runtime *ifc = ctrl->regs.rregs;
374 
375 	/* clear the read buffer */
376 	ctrl->read_bytes = 0;
377 	if (command != NAND_CMD_PAGEPROG)
378 		ctrl->index = 0;
379 
380 	switch (command) {
381 	/* READ0 read the entire buffer to use hardware ECC. */
382 	case NAND_CMD_READ0: {
383 		ifc_out32(&ifc->ifc_nand.nand_fbcr, 0);
384 		set_addr(mtd, 0, page_addr, 0);
385 
386 		ctrl->read_bytes = mtd->writesize + mtd->oobsize;
387 		ctrl->index += column;
388 
389 		if (chip->ecc.mode == NAND_ECC_HW)
390 			ctrl->eccread = 1;
391 
392 		fsl_ifc_do_read(chip, 0, mtd);
393 		fsl_ifc_run_command(mtd);
394 		return;
395 	}
396 
397 	/* READOOB reads only the OOB because no ECC is performed. */
398 	case NAND_CMD_READOOB:
399 		ifc_out32(&ifc->ifc_nand.nand_fbcr, mtd->oobsize - column);
400 		set_addr(mtd, column, page_addr, 1);
401 
402 		ctrl->read_bytes = mtd->writesize + mtd->oobsize;
403 
404 		fsl_ifc_do_read(chip, 1, mtd);
405 		fsl_ifc_run_command(mtd);
406 
407 		return;
408 
409 	/* READID must read all possible bytes while CEB is active */
410 	case NAND_CMD_READID:
411 	case NAND_CMD_PARAM: {
412 		int timing = IFC_FIR_OP_RB;
413 		if (command == NAND_CMD_PARAM)
414 			timing = IFC_FIR_OP_RBCD;
415 
416 		ifc_out32(&ifc->ifc_nand.nand_fir0,
417 			  (IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
418 			  (IFC_FIR_OP_UA  << IFC_NAND_FIR0_OP1_SHIFT) |
419 			  (timing << IFC_NAND_FIR0_OP2_SHIFT));
420 		ifc_out32(&ifc->ifc_nand.nand_fcr0,
421 			  command << IFC_NAND_FCR0_CMD0_SHIFT);
422 		ifc_out32(&ifc->ifc_nand.row3, column);
423 
424 		/*
425 		 * although currently it's 8 bytes for READID, we always read
426 		 * the maximum 256 bytes(for PARAM)
427 		 */
428 		ifc_out32(&ifc->ifc_nand.nand_fbcr, 256);
429 		ctrl->read_bytes = 256;
430 
431 		set_addr(mtd, 0, 0, 0);
432 		fsl_ifc_run_command(mtd);
433 		return;
434 	}
435 
436 	/* ERASE1 stores the block and page address */
437 	case NAND_CMD_ERASE1:
438 		set_addr(mtd, 0, page_addr, 0);
439 		return;
440 
441 	/* ERASE2 uses the block and page address from ERASE1 */
442 	case NAND_CMD_ERASE2:
443 		ifc_out32(&ifc->ifc_nand.nand_fir0,
444 			  (IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
445 			  (IFC_FIR_OP_RA0 << IFC_NAND_FIR0_OP1_SHIFT) |
446 			  (IFC_FIR_OP_CMD1 << IFC_NAND_FIR0_OP2_SHIFT));
447 
448 		ifc_out32(&ifc->ifc_nand.nand_fcr0,
449 			  (NAND_CMD_ERASE1 << IFC_NAND_FCR0_CMD0_SHIFT) |
450 			  (NAND_CMD_ERASE2 << IFC_NAND_FCR0_CMD1_SHIFT));
451 
452 		ifc_out32(&ifc->ifc_nand.nand_fbcr, 0);
453 		ctrl->read_bytes = 0;
454 		fsl_ifc_run_command(mtd);
455 		return;
456 
457 	/* SEQIN sets up the addr buffer and all registers except the length */
458 	case NAND_CMD_SEQIN: {
459 		u32 nand_fcr0;
460 		ctrl->column = column;
461 		ctrl->oob = 0;
462 
463 		if (mtd->writesize > 512) {
464 			nand_fcr0 =
465 				(NAND_CMD_SEQIN << IFC_NAND_FCR0_CMD0_SHIFT) |
466 				(NAND_CMD_STATUS << IFC_NAND_FCR0_CMD1_SHIFT) |
467 				(NAND_CMD_PAGEPROG << IFC_NAND_FCR0_CMD2_SHIFT);
468 
469 			ifc_out32(&ifc->ifc_nand.nand_fir0,
470 				  (IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
471 				  (IFC_FIR_OP_CA0 << IFC_NAND_FIR0_OP1_SHIFT) |
472 				  (IFC_FIR_OP_RA0 << IFC_NAND_FIR0_OP2_SHIFT) |
473 				  (IFC_FIR_OP_WBCD  <<
474 						IFC_NAND_FIR0_OP3_SHIFT) |
475 				  (IFC_FIR_OP_CMD2 << IFC_NAND_FIR0_OP4_SHIFT));
476 			ifc_out32(&ifc->ifc_nand.nand_fir1,
477 				  (IFC_FIR_OP_CW1 << IFC_NAND_FIR1_OP5_SHIFT) |
478 				  (IFC_FIR_OP_RDSTAT <<
479 					IFC_NAND_FIR1_OP6_SHIFT) |
480 				  (IFC_FIR_OP_NOP << IFC_NAND_FIR1_OP7_SHIFT));
481 		} else {
482 			nand_fcr0 = ((NAND_CMD_PAGEPROG <<
483 					IFC_NAND_FCR0_CMD1_SHIFT) |
484 				    (NAND_CMD_SEQIN <<
485 					IFC_NAND_FCR0_CMD2_SHIFT) |
486 				    (NAND_CMD_STATUS <<
487 					IFC_NAND_FCR0_CMD3_SHIFT));
488 
489 			ifc_out32(&ifc->ifc_nand.nand_fir0,
490 				  (IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
491 				  (IFC_FIR_OP_CMD2 << IFC_NAND_FIR0_OP1_SHIFT) |
492 				  (IFC_FIR_OP_CA0 << IFC_NAND_FIR0_OP2_SHIFT) |
493 				  (IFC_FIR_OP_RA0 << IFC_NAND_FIR0_OP3_SHIFT) |
494 				  (IFC_FIR_OP_WBCD << IFC_NAND_FIR0_OP4_SHIFT));
495 			ifc_out32(&ifc->ifc_nand.nand_fir1,
496 				  (IFC_FIR_OP_CMD1 << IFC_NAND_FIR1_OP5_SHIFT) |
497 				  (IFC_FIR_OP_CW3 << IFC_NAND_FIR1_OP6_SHIFT) |
498 				  (IFC_FIR_OP_RDSTAT <<
499 					IFC_NAND_FIR1_OP7_SHIFT) |
500 				  (IFC_FIR_OP_NOP << IFC_NAND_FIR1_OP8_SHIFT));
501 
502 			if (column >= mtd->writesize)
503 				nand_fcr0 |=
504 				NAND_CMD_READOOB << IFC_NAND_FCR0_CMD0_SHIFT;
505 			else
506 				nand_fcr0 |=
507 				NAND_CMD_READ0 << IFC_NAND_FCR0_CMD0_SHIFT;
508 		}
509 
510 		if (column >= mtd->writesize) {
511 			/* OOB area --> READOOB */
512 			column -= mtd->writesize;
513 			ctrl->oob = 1;
514 		}
515 		ifc_out32(&ifc->ifc_nand.nand_fcr0, nand_fcr0);
516 		set_addr(mtd, column, page_addr, ctrl->oob);
517 		return;
518 	}
519 
520 	/* PAGEPROG reuses all of the setup from SEQIN and adds the length */
521 	case NAND_CMD_PAGEPROG:
522 		if (ctrl->oob)
523 			ifc_out32(&ifc->ifc_nand.nand_fbcr,
524 				  ctrl->index - ctrl->column);
525 		else
526 			ifc_out32(&ifc->ifc_nand.nand_fbcr, 0);
527 
528 		fsl_ifc_run_command(mtd);
529 		return;
530 
531 	case NAND_CMD_STATUS:
532 		ifc_out32(&ifc->ifc_nand.nand_fir0,
533 			  (IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
534 			  (IFC_FIR_OP_RB << IFC_NAND_FIR0_OP1_SHIFT));
535 		ifc_out32(&ifc->ifc_nand.nand_fcr0,
536 			  NAND_CMD_STATUS << IFC_NAND_FCR0_CMD0_SHIFT);
537 		ifc_out32(&ifc->ifc_nand.nand_fbcr, 1);
538 		set_addr(mtd, 0, 0, 0);
539 		ctrl->read_bytes = 1;
540 
541 		fsl_ifc_run_command(mtd);
542 
543 		/*
544 		 * The chip always seems to report that it is
545 		 * write-protected, even when it is not.
546 		 */
547 		if (chip->options & NAND_BUSWIDTH_16)
548 			ifc_out16(ctrl->addr,
549 				  ifc_in16(ctrl->addr) | NAND_STATUS_WP);
550 		else
551 			out_8(ctrl->addr, in_8(ctrl->addr) | NAND_STATUS_WP);
552 		return;
553 
554 	case NAND_CMD_RESET:
555 		ifc_out32(&ifc->ifc_nand.nand_fir0,
556 			  IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT);
557 		ifc_out32(&ifc->ifc_nand.nand_fcr0,
558 			  NAND_CMD_RESET << IFC_NAND_FCR0_CMD0_SHIFT);
559 		fsl_ifc_run_command(mtd);
560 		return;
561 
562 	default:
563 		printf("%s: error, unsupported command 0x%x.\n",
564 			__func__, command);
565 	}
566 }
567 
568 /*
569  * Write buf to the IFC NAND Controller Data Buffer
570  */
571 static void fsl_ifc_write_buf(struct mtd_info *mtd, const u8 *buf, int len)
572 {
573 	struct nand_chip *chip = mtd_to_nand(mtd);
574 	struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
575 	struct fsl_ifc_ctrl *ctrl = priv->ctrl;
576 	unsigned int bufsize = mtd->writesize + mtd->oobsize;
577 
578 	if (len <= 0) {
579 		printf("%s of %d bytes", __func__, len);
580 		ctrl->status = 0;
581 		return;
582 	}
583 
584 	if ((unsigned int)len > bufsize - ctrl->index) {
585 		printf("%s beyond end of buffer "
586 		       "(%d requested, %u available)\n",
587 			__func__, len, bufsize - ctrl->index);
588 		len = bufsize - ctrl->index;
589 	}
590 
591 	memcpy_toio(ctrl->addr + ctrl->index, buf, len);
592 	ctrl->index += len;
593 }
594 
595 /*
596  * read a byte from either the IFC hardware buffer if it has any data left
597  * otherwise issue a command to read a single byte.
598  */
599 static u8 fsl_ifc_read_byte(struct mtd_info *mtd)
600 {
601 	struct nand_chip *chip = mtd_to_nand(mtd);
602 	struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
603 	struct fsl_ifc_ctrl *ctrl = priv->ctrl;
604 	unsigned int offset;
605 
606 	/*
607 	 * If there are still bytes in the IFC buffer, then use the
608 	 * next byte.
609 	 */
610 	if (ctrl->index < ctrl->read_bytes) {
611 		offset = ctrl->index++;
612 		return in_8(ctrl->addr + offset);
613 	}
614 
615 	printf("%s beyond end of buffer\n", __func__);
616 	return ERR_BYTE;
617 }
618 
619 /*
620  * Read two bytes from the IFC hardware buffer
621  * read function for 16-bit buswith
622  */
623 static uint8_t fsl_ifc_read_byte16(struct mtd_info *mtd)
624 {
625 	struct nand_chip *chip = mtd_to_nand(mtd);
626 	struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
627 	struct fsl_ifc_ctrl *ctrl = priv->ctrl;
628 	uint16_t data;
629 
630 	/*
631 	 * If there are still bytes in the IFC buffer, then use the
632 	 * next byte.
633 	 */
634 	if (ctrl->index < ctrl->read_bytes) {
635 		data = ifc_in16(ctrl->addr + ctrl->index);
636 		ctrl->index += 2;
637 		return (uint8_t)data;
638 	}
639 
640 	printf("%s beyond end of buffer\n", __func__);
641 	return ERR_BYTE;
642 }
643 
644 /*
645  * Read from the IFC Controller Data Buffer
646  */
647 static void fsl_ifc_read_buf(struct mtd_info *mtd, u8 *buf, int len)
648 {
649 	struct nand_chip *chip = mtd_to_nand(mtd);
650 	struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
651 	struct fsl_ifc_ctrl *ctrl = priv->ctrl;
652 	int avail;
653 
654 	if (len < 0)
655 		return;
656 
657 	avail = min((unsigned int)len, ctrl->read_bytes - ctrl->index);
658 	memcpy_fromio(buf, ctrl->addr + ctrl->index, avail);
659 	ctrl->index += avail;
660 
661 	if (len > avail)
662 		printf("%s beyond end of buffer "
663 		       "(%d requested, %d available)\n",
664 		       __func__, len, avail);
665 }
666 
667 /* This function is called after Program and Erase Operations to
668  * check for success or failure.
669  */
670 static int fsl_ifc_wait(struct mtd_info *mtd, struct nand_chip *chip)
671 {
672 	struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
673 	struct fsl_ifc_ctrl *ctrl = priv->ctrl;
674 	struct fsl_ifc_runtime *ifc = ctrl->regs.rregs;
675 	u32 nand_fsr;
676 	int status;
677 
678 	if (ctrl->status != IFC_NAND_EVTER_STAT_OPC)
679 		return NAND_STATUS_FAIL;
680 
681 	/* Use READ_STATUS command, but wait for the device to be ready */
682 	ifc_out32(&ifc->ifc_nand.nand_fir0,
683 		  (IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
684 		  (IFC_FIR_OP_RDSTAT << IFC_NAND_FIR0_OP1_SHIFT));
685 	ifc_out32(&ifc->ifc_nand.nand_fcr0, NAND_CMD_STATUS <<
686 		  IFC_NAND_FCR0_CMD0_SHIFT);
687 	ifc_out32(&ifc->ifc_nand.nand_fbcr, 1);
688 	set_addr(mtd, 0, 0, 0);
689 	ctrl->read_bytes = 1;
690 
691 	fsl_ifc_run_command(mtd);
692 
693 	if (ctrl->status != IFC_NAND_EVTER_STAT_OPC)
694 		return NAND_STATUS_FAIL;
695 
696 	nand_fsr = ifc_in32(&ifc->ifc_nand.nand_fsr);
697 	status = nand_fsr >> 24;
698 
699 	/* Chip sometimes reporting write protect even when it's not */
700 	return status | NAND_STATUS_WP;
701 }
702 
703 /*
704  * The controller does not check for bitflips in erased pages,
705  * therefore software must check instead.
706  */
707 static int
708 check_erased_page(struct nand_chip *chip, u8 *buf, struct mtd_info *mtd)
709 {
710 	u8 *ecc = chip->oob_poi;
711 	const int ecc_size = chip->ecc.bytes;
712 	const int pkt_size = chip->ecc.size;
713 	int i, res, bitflips;
714 
715 	/* IFC starts ecc bytes at offset 8 in the spare area. */
716 	ecc += 8;
717 	bitflips = 0;
718 	for (i = 0; i < chip->ecc.steps; i++) {
719 		res = nand_check_erased_ecc_chunk(buf, pkt_size, ecc, ecc_size,
720 						  NULL, 0, chip->ecc.strength);
721 
722 		if (res < 0) {
723 			printf("fsl-ifc: NAND Flash ECC Uncorrectable Error\n");
724 			mtd->ecc_stats.failed++;
725 		} else if (res > 0) {
726 			mtd->ecc_stats.corrected += res;
727 		}
728 		bitflips = max(res, bitflips);
729 		buf += pkt_size;
730 		ecc += ecc_size;
731 	}
732 
733 	return bitflips;
734 }
735 
736 static int fsl_ifc_read_page(struct mtd_info *mtd, struct nand_chip *chip,
737 			     uint8_t *buf, int oob_required, int page)
738 {
739 	struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
740 	struct fsl_ifc_ctrl *ctrl = priv->ctrl;
741 
742 	fsl_ifc_read_buf(mtd, buf, mtd->writesize);
743 	fsl_ifc_read_buf(mtd, chip->oob_poi, mtd->oobsize);
744 
745 	if (ctrl->status & IFC_NAND_EVTER_STAT_ECCER)
746 		return check_erased_page(chip, buf, mtd);
747 
748 	if (ctrl->status != IFC_NAND_EVTER_STAT_OPC)
749 		mtd->ecc_stats.failed++;
750 
751 	return 0;
752 }
753 
754 /* ECC will be calculated automatically, and errors will be detected in
755  * waitfunc.
756  */
757 static int fsl_ifc_write_page(struct mtd_info *mtd, struct nand_chip *chip,
758 			       const uint8_t *buf, int oob_required, int page)
759 {
760 	fsl_ifc_write_buf(mtd, buf, mtd->writesize);
761 	fsl_ifc_write_buf(mtd, chip->oob_poi, mtd->oobsize);
762 
763 	return 0;
764 }
765 
766 static void fsl_ifc_ctrl_init(void)
767 {
768 	uint32_t ver = 0;
769 	ifc_ctrl = kzalloc(sizeof(*ifc_ctrl), GFP_KERNEL);
770 	if (!ifc_ctrl)
771 		return;
772 
773 	ifc_ctrl->regs.gregs = IFC_FCM_BASE_ADDR;
774 
775 	ver = ifc_in32(&ifc_ctrl->regs.gregs->ifc_rev);
776 	if (ver >= FSL_IFC_V2_0_0)
777 		ifc_ctrl->regs.rregs =
778 			(void *)CONFIG_SYS_IFC_ADDR + IFC_RREGS_64KOFFSET;
779 	else
780 		ifc_ctrl->regs.rregs =
781 			(void *)CONFIG_SYS_IFC_ADDR + IFC_RREGS_4KOFFSET;
782 
783 	/* clear event registers */
784 	ifc_out32(&ifc_ctrl->regs.rregs->ifc_nand.nand_evter_stat, ~0U);
785 	ifc_out32(&ifc_ctrl->regs.rregs->ifc_nand.pgrdcmpl_evt_stat, ~0U);
786 
787 	/* Enable error and event for any detected errors */
788 	ifc_out32(&ifc_ctrl->regs.rregs->ifc_nand.nand_evter_en,
789 		  IFC_NAND_EVTER_EN_OPC_EN |
790 		  IFC_NAND_EVTER_EN_PGRDCMPL_EN |
791 		  IFC_NAND_EVTER_EN_FTOER_EN |
792 		  IFC_NAND_EVTER_EN_WPER_EN);
793 
794 	ifc_out32(&ifc_ctrl->regs.rregs->ifc_nand.ncfgr, 0x0);
795 }
796 
797 static void fsl_ifc_select_chip(struct mtd_info *mtd, int chip)
798 {
799 }
800 
801 static int fsl_ifc_sram_init(struct fsl_ifc_mtd *priv, uint32_t ver)
802 {
803 	struct fsl_ifc_runtime *ifc = ifc_ctrl->regs.rregs;
804 	uint32_t cs = 0, csor = 0, csor_8k = 0, csor_ext = 0;
805 	uint32_t ncfgr = 0;
806 	u32 timeo = (CONFIG_SYS_HZ * 10) / 1000;
807 	u32 time_start;
808 
809 	if (ver > FSL_IFC_V1_1_0) {
810 		ncfgr = ifc_in32(&ifc->ifc_nand.ncfgr);
811 		ifc_out32(&ifc->ifc_nand.ncfgr, ncfgr | IFC_NAND_SRAM_INIT_EN);
812 
813 		/* wait for  SRAM_INIT bit to be clear or timeout */
814 		time_start = get_timer(0);
815 		while (get_timer(time_start) < timeo) {
816 			ifc_ctrl->status =
817 				ifc_in32(&ifc->ifc_nand.nand_evter_stat);
818 
819 			if (!(ifc_ctrl->status & IFC_NAND_SRAM_INIT_EN))
820 				return 0;
821 		}
822 		printf("fsl-ifc: Failed to Initialise SRAM\n");
823 		return 1;
824 	}
825 
826 	cs = priv->bank;
827 
828 	/* Save CSOR and CSOR_ext */
829 	csor = ifc_in32(&ifc_ctrl->regs.gregs->csor_cs[cs].csor);
830 	csor_ext = ifc_in32(&ifc_ctrl->regs.gregs->csor_cs[cs].csor_ext);
831 
832 	/* chage PageSize 8K and SpareSize 1K*/
833 	csor_8k = (csor & ~(CSOR_NAND_PGS_MASK)) | 0x0018C000;
834 	ifc_out32(&ifc_ctrl->regs.gregs->csor_cs[cs].csor, csor_8k);
835 	ifc_out32(&ifc_ctrl->regs.gregs->csor_cs[cs].csor_ext, 0x0000400);
836 
837 	/* READID */
838 	ifc_out32(&ifc->ifc_nand.nand_fir0,
839 		  (IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
840 		  (IFC_FIR_OP_UA  << IFC_NAND_FIR0_OP1_SHIFT) |
841 		  (IFC_FIR_OP_RB << IFC_NAND_FIR0_OP2_SHIFT));
842 	ifc_out32(&ifc->ifc_nand.nand_fcr0,
843 		  NAND_CMD_READID << IFC_NAND_FCR0_CMD0_SHIFT);
844 	ifc_out32(&ifc->ifc_nand.row3, 0x0);
845 
846 	ifc_out32(&ifc->ifc_nand.nand_fbcr, 0x0);
847 
848 	/* Program ROW0/COL0 */
849 	ifc_out32(&ifc->ifc_nand.row0, 0x0);
850 	ifc_out32(&ifc->ifc_nand.col0, 0x0);
851 
852 	/* set the chip select for NAND Transaction */
853 	ifc_out32(&ifc->ifc_nand.nand_csel, priv->bank << IFC_NAND_CSEL_SHIFT);
854 
855 	/* start read seq */
856 	ifc_out32(&ifc->ifc_nand.nandseq_strt, IFC_NAND_SEQ_STRT_FIR_STRT);
857 
858 	time_start = get_timer(0);
859 
860 	while (get_timer(time_start) < timeo) {
861 		ifc_ctrl->status = ifc_in32(&ifc->ifc_nand.nand_evter_stat);
862 
863 		if (ifc_ctrl->status & IFC_NAND_EVTER_STAT_OPC)
864 			break;
865 	}
866 
867 	if (ifc_ctrl->status != IFC_NAND_EVTER_STAT_OPC) {
868 		printf("fsl-ifc: Failed to Initialise SRAM\n");
869 		return 1;
870 	}
871 
872 	ifc_out32(&ifc->ifc_nand.nand_evter_stat, ifc_ctrl->status);
873 
874 	/* Restore CSOR and CSOR_ext */
875 	ifc_out32(&ifc_ctrl->regs.gregs->csor_cs[cs].csor, csor);
876 	ifc_out32(&ifc_ctrl->regs.gregs->csor_cs[cs].csor_ext, csor_ext);
877 
878 	return 0;
879 }
880 
881 static int fsl_ifc_chip_init(int devnum, u8 *addr)
882 {
883 	struct mtd_info *mtd;
884 	struct nand_chip *nand;
885 	struct fsl_ifc_mtd *priv;
886 	struct nand_ecclayout *layout;
887 	struct fsl_ifc_fcm *gregs = NULL;
888 	uint32_t cspr = 0, csor = 0, ver = 0;
889 	int ret = 0;
890 
891 	if (!ifc_ctrl) {
892 		fsl_ifc_ctrl_init();
893 		if (!ifc_ctrl)
894 			return -1;
895 	}
896 
897 	priv = kzalloc(sizeof(*priv), GFP_KERNEL);
898 	if (!priv)
899 		return -ENOMEM;
900 
901 	priv->ctrl = ifc_ctrl;
902 	priv->vbase = addr;
903 	gregs = ifc_ctrl->regs.gregs;
904 
905 	/* Find which chip select it is connected to.
906 	 */
907 	for (priv->bank = 0; priv->bank < MAX_BANKS; priv->bank++) {
908 		phys_addr_t phys_addr = virt_to_phys(addr);
909 
910 		cspr = ifc_in32(&gregs->cspr_cs[priv->bank].cspr);
911 		csor = ifc_in32(&gregs->csor_cs[priv->bank].csor);
912 
913 		if ((cspr & CSPR_V) && (cspr & CSPR_MSEL) == CSPR_MSEL_NAND &&
914 		    (cspr & CSPR_BA) == CSPR_PHYS_ADDR(phys_addr))
915 			break;
916 	}
917 
918 	if (priv->bank >= MAX_BANKS) {
919 		printf("%s: address did not match any "
920 		       "chip selects\n", __func__);
921 		kfree(priv);
922 		return -ENODEV;
923 	}
924 
925 	nand = &priv->chip;
926 	mtd = nand_to_mtd(nand);
927 
928 	ifc_ctrl->chips[priv->bank] = priv;
929 
930 	/* fill in nand_chip structure */
931 	/* set up function call table */
932 
933 	nand->write_buf = fsl_ifc_write_buf;
934 	nand->read_buf = fsl_ifc_read_buf;
935 	nand->select_chip = fsl_ifc_select_chip;
936 	nand->cmdfunc = fsl_ifc_cmdfunc;
937 	nand->waitfunc = fsl_ifc_wait;
938 
939 	/* set up nand options */
940 	nand->bbt_td = &bbt_main_descr;
941 	nand->bbt_md = &bbt_mirror_descr;
942 
943 	/* set up nand options */
944 	nand->options = NAND_NO_SUBPAGE_WRITE;
945 	nand->bbt_options = NAND_BBT_USE_FLASH;
946 
947 	if (cspr & CSPR_PORT_SIZE_16) {
948 		nand->read_byte = fsl_ifc_read_byte16;
949 		nand->options |= NAND_BUSWIDTH_16;
950 	} else {
951 		nand->read_byte = fsl_ifc_read_byte;
952 	}
953 
954 	nand->controller = &ifc_ctrl->controller;
955 	nand_set_controller_data(nand, priv);
956 
957 	nand->ecc.read_page = fsl_ifc_read_page;
958 	nand->ecc.write_page = fsl_ifc_write_page;
959 
960 	/* Hardware generates ECC per 512 Bytes */
961 	nand->ecc.size = 512;
962 	nand->ecc.bytes = 8;
963 
964 	switch (csor & CSOR_NAND_PGS_MASK) {
965 	case CSOR_NAND_PGS_512:
966 		if (nand->options & NAND_BUSWIDTH_16) {
967 			layout = &oob_512_16bit_ecc4;
968 		} else {
969 			layout = &oob_512_8bit_ecc4;
970 
971 			/* Avoid conflict with bad block marker */
972 			bbt_main_descr.offs = 0;
973 			bbt_mirror_descr.offs = 0;
974 		}
975 
976 		nand->ecc.strength = 4;
977 		priv->bufnum_mask = 15;
978 		break;
979 
980 	case CSOR_NAND_PGS_2K:
981 		layout = &oob_2048_ecc4;
982 		nand->ecc.strength = 4;
983 		priv->bufnum_mask = 3;
984 		break;
985 
986 	case CSOR_NAND_PGS_4K:
987 		if ((csor & CSOR_NAND_ECC_MODE_MASK) ==
988 		    CSOR_NAND_ECC_MODE_4) {
989 			layout = &oob_4096_ecc4;
990 			nand->ecc.strength = 4;
991 		} else {
992 			layout = &oob_4096_ecc8;
993 			nand->ecc.strength = 8;
994 			nand->ecc.bytes = 16;
995 		}
996 
997 		priv->bufnum_mask = 1;
998 		break;
999 
1000 	case CSOR_NAND_PGS_8K:
1001 		if ((csor & CSOR_NAND_ECC_MODE_MASK) ==
1002 		    CSOR_NAND_ECC_MODE_4) {
1003 			layout = &oob_8192_ecc4;
1004 			nand->ecc.strength = 4;
1005 		} else {
1006 			layout = &oob_8192_ecc8;
1007 			nand->ecc.strength = 8;
1008 			nand->ecc.bytes = 16;
1009 		}
1010 
1011 		priv->bufnum_mask = 0;
1012 		break;
1013 
1014 
1015 	default:
1016 		printf("ifc nand: bad csor %#x: bad page size\n", csor);
1017 		return -ENODEV;
1018 	}
1019 
1020 	/* Must also set CSOR_NAND_ECC_ENC_EN if DEC_EN set */
1021 	if (csor & CSOR_NAND_ECC_DEC_EN) {
1022 		nand->ecc.mode = NAND_ECC_HW;
1023 		nand->ecc.layout = layout;
1024 	} else {
1025 		nand->ecc.mode = NAND_ECC_SOFT;
1026 	}
1027 
1028 	ver = ifc_in32(&gregs->ifc_rev);
1029 	if (ver >= FSL_IFC_V1_1_0)
1030 		ret = fsl_ifc_sram_init(priv, ver);
1031 	if (ret)
1032 		return ret;
1033 
1034 	if (ver >= FSL_IFC_V2_0_0)
1035 		priv->bufnum_mask = (priv->bufnum_mask * 2) + 1;
1036 
1037 	ret = nand_scan_ident(mtd, 1, NULL);
1038 	if (ret)
1039 		return ret;
1040 
1041 	ret = nand_scan_tail(mtd);
1042 	if (ret)
1043 		return ret;
1044 
1045 	ret = nand_register(devnum, mtd);
1046 	if (ret)
1047 		return ret;
1048 	return 0;
1049 }
1050 
1051 #ifndef CONFIG_SYS_NAND_BASE_LIST
1052 #define CONFIG_SYS_NAND_BASE_LIST { CONFIG_SYS_NAND_BASE }
1053 #endif
1054 
1055 static unsigned long base_address[CONFIG_SYS_MAX_NAND_DEVICE] =
1056 	CONFIG_SYS_NAND_BASE_LIST;
1057 
1058 void board_nand_init(void)
1059 {
1060 	int i;
1061 
1062 	for (i = 0; i < CONFIG_SYS_MAX_NAND_DEVICE; i++)
1063 		fsl_ifc_chip_init(i, (u8 *)base_address[i]);
1064 }
1065