Lines Matching defs:nand
19 struct nand_info *nand);
21 static int nand_wait(struct nand_info *nand)
31 neesr = read_reg(nand, NAND_EVTER_STAT);
33 write_reg(nand, NAND_EVTER_STAT, neesr);
63 static uint32_t nand_get_port_size(struct nand_info *nand)
71 port_size = (read_reg(nand, cs_reg) & CSPR_PS) >> CSPR_PS_SHIFT;
89 static uint32_t nand_get_page_size(struct nand_info *nand)
97 pg_size = read_reg(nand, cs_reg) & CSOR_NAND_PGS;
118 static uint32_t nand_get_pages_per_blk(struct nand_info *nand)
126 pages_per_blk = (read_reg(nand, cs_reg) & CSOR_NAND_PB);
178 static void nand_get_params(struct nand_info *nand)
180 nand->port_size = nand_get_port_size(nand);
182 nand->page_size = nand_get_page_size(nand);
190 nand->bad_marker_loc = (nand->page_size == 512) ?
191 ((nand->port_size == 8) ? 0x5 : 0xa) : 0;
194 nand->onfi_dev_flag =
195 (read_reg(nand, NAND_EVTER_STAT) & NAND_EVTER_STAT_BBI_SRCH_SEL)
199 nand->bbs = 0;
202 nand->ppb = nand_get_pages_per_blk(nand);
205 nand->blk_size = nand->page_size * nand->ppb;
208 nand->pi_width = get_page_index_width(nand->ppb);
211 nand->lgb = 0;
212 nand->bbt_max = 0;
213 nand->bzero_good = 0;
214 memset(nand->bbt, EMPTY_VAL, BBT_SIZE * sizeof(nand->bbt[0]));
217 static int nand_init(struct nand_info *nand)
221 /* Get nand Parameters from IFC */
222 nand_get_params(nand);
225 write_reg(nand, NAND_EVTER_STAT, U(0xffffffff));
231 ncfgr = read_reg(nand, NCFGR);
232 write_reg(nand, NCFGR, (ncfgr & ~NCFGR_BOOT));
244 struct nand_info *nand)
255 write_reg(nand, NAND_BC, byte_cnt);
257 write_reg(nand, ROW0, row_add);
258 write_reg(nand, COL0, col_val);
261 if (nand->page_size == U(512)) {
264 write_reg(nand, NAND_FCR0,
267 write_reg(nand, NAND_FCR0,
270 write_reg(nand, NAND_FCR0,
276 write_reg(nand, NAND_FCR0, (NAND_CMD_READ0 << FCR_CMD0_SHIFT) |
279 if (nand->page_size == U(512)) {
280 write_reg(nand, NAND_FIR0, ((FIR_OP_CW0 << FIR_OP0_SHIFT) |
285 write_reg(nand, NAND_FIR1, U(0x00000000));
287 write_reg(nand, NAND_FIR0, ((FIR_OP_CW0 << FIR_OP0_SHIFT) |
293 write_reg(nand, NAND_FIR1, (FIR_OP_NOP << FIR_OP5_SHIFT));
295 write_reg(nand, NANDSEQ_STRT, NAND_SEQ_STRT_FIR_STRT);
297 ret = nand_wait(nand);
305 if (nand->page_size == U(512))
307 else if (nand->page_size == U(2048))
309 else if (nand->page_size == U(4096))
311 else if (nand->page_size == U(8192))
313 else if (nand->page_size == U(16384))
328 (col_add + nand->page_size);
333 nand->page_size);
340 static int nand_read(struct nand_info *nand, int32_t src_addr,
359 log_blk = (src_addr / nand->blk_size);
360 pg_no = ((src_addr - (log_blk * nand->blk_size)) /
361 nand->page_size);
365 for (i = 0; i <= nand->bbt_max; i++) {
366 if (nand->bbt[i] == EMPTY_VAL_CHECK) {
367 ret = update_bbt(i, pblk, &updated, nand);
379 if (pblk < nand->bbt[i])
381 else if (pblk >= nand->bbt[i])
385 col_off = (src_addr % nand->page_size);
387 if ((col_off + size) < nand->page_size)
390 byte_cnt = nand->page_size - col_off;
392 row_off = (pblk << nand->pi_width) | pg_no;
395 nand->ifc_region_addr,
398 byte_cnt, out, MAIN, nand);
408 if (size < nand->page_size) {
412 byte_cnt = nand->page_size;
415 row_off = (pblk << nand->pi_width) | pg_no;
418 nand->ifc_region_addr,
421 read_cnt, out, MAIN, nand);
424 ERROR("Error from nand-read_data %d\n", ret);
435 static int isgoodblock(uint32_t blk, uint32_t *gb, struct nand_info *nand)
445 nand->ifc_region_addr,
446 blk << nand->pi_width,
447 nand->bad_marker_loc,
448 0x2, buf, 1, nand);
456 row_add = (blk << nand->pi_width);
457 if (nand->port_size == 8) {
462 if (nand->onfi_dev_flag)
464 nand->ifc_region_addr,
465 row_add | (nand->ppb - 1),
466 nand->bad_marker_loc,
467 0x2, buf, SPARE, nand);
470 nand->ifc_region_addr,
472 nand->bad_marker_loc,
473 0x2, buf, SPARE, nand);
492 if (nand->onfi_dev_flag) {
494 nand->ifc_region_addr,
495 row_add | (nand->ppb - 1),
496 nand->bad_marker_loc,
497 0x2, buf, SPARE, nand);
500 nand->ifc_region_addr,
502 nand->bad_marker_loc,
503 0x2, buf, SPARE, nand);
524 uint32_t *updated, struct nand_info *nand)
530 if (nand->bzero_good && blk == 0)
535 if (nand->lgb != 0 && blk <= nand->lgb)
544 if (nand->lgb < blk)
545 sblk = nand->lgb;
551 lgb = nand->lgb;
558 ret = isgoodblock(lgb, &gb, nand);
564 nand->bzero_good = 1;
572 nand->bbt[idx] = lgb;
576 if (idx > nand->bbt_max)
577 nand->bbt_max = idx;
584 nand->lgb = blk;
598 struct nand_info *nand = &nand_drv_data;
600 page_size = nand_get_page_size(nand);
602 ret = nand_read(nand, src_addr, buf, size);
628 struct nand_info *nand = NULL;
631 nand = &nand_drv_data;
632 memset(nand, 0, sizeof(struct nand_info));
634 nand->ifc_region_addr = ifc_region_addr;
635 nand->ifc_register_addr = ifc_register_addr;
638 ret = nand_init(nand);
640 ERROR("nand init failed\n");
647 ifc_nand_spec.block_size = nand_get_page_size(nand);