1 /* 2 * (C) Copyright 2005 3 * 2N Telekomunikace, a.s. <www.2n.cz> 4 * Ladislav Michl <michl@2n.cz> 5 * 6 * SPDX-License-Identifier: GPL-2.0 7 */ 8 9 #ifndef _NAND_H_ 10 #define _NAND_H_ 11 12 #include <config.h> 13 14 /* 15 * All boards using a given driver must convert to self-init 16 * at the same time, so do it here. When all drivers are 17 * converted, this will go away. 18 */ 19 #ifdef CONFIG_SPL_BUILD 20 #if defined(CONFIG_NAND_FSL_ELBC) || defined(CONFIG_NAND_FSL_IFC) 21 #define CONFIG_SYS_NAND_SELF_INIT 22 #endif 23 #else 24 #if defined(CONFIG_NAND_FSL_ELBC) || defined(CONFIG_NAND_ATMEL)\ 25 || defined(CONFIG_NAND_FSL_IFC) 26 #define CONFIG_SYS_NAND_SELF_INIT 27 #endif 28 #endif 29 30 extern void nand_init(void); 31 32 #include <linux/compat.h> 33 #include <linux/mtd/mtd.h> 34 #include <linux/mtd/nand.h> 35 36 #ifdef CONFIG_SYS_NAND_SELF_INIT 37 void board_nand_init(void); 38 int nand_register(int devnum); 39 #else 40 extern int board_nand_init(struct nand_chip *nand); 41 #endif 42 43 typedef struct mtd_info nand_info_t; 44 45 extern int nand_curr_device; 46 extern nand_info_t nand_info[]; 47 48 static inline int nand_read(nand_info_t *info, loff_t ofs, size_t *len, u_char *buf) 49 { 50 return mtd_read(info, ofs, *len, (size_t *)len, buf); 51 } 52 53 static inline int nand_write(nand_info_t *info, loff_t ofs, size_t *len, u_char *buf) 54 { 55 return mtd_write(info, ofs, *len, (size_t *)len, buf); 56 } 57 58 static inline int nand_block_isbad(nand_info_t *info, loff_t ofs) 59 { 60 return mtd_block_isbad(info, ofs); 61 } 62 63 static inline int nand_erase(nand_info_t *info, loff_t off, size_t size) 64 { 65 struct erase_info instr; 66 67 instr.mtd = info; 68 instr.addr = off; 69 instr.len = size; 70 instr.callback = 0; 71 72 return mtd_erase(info, &instr); 73 } 74 75 76 /***************************************************************************** 77 * declarations from nand_util.c 78 ****************************************************************************/ 79 80 typedef struct mtd_oob_ops mtd_oob_ops_t; 81 82 struct nand_erase_options { 83 loff_t length; /* number of bytes to erase */ 84 loff_t offset; /* first address in NAND to erase */ 85 int quiet; /* don't display progress messages */ 86 int jffs2; /* if true: format for jffs2 usage 87 * (write appropriate cleanmarker blocks) */ 88 int scrub; /* if true, really clean NAND by erasing 89 * bad blocks (UNSAFE) */ 90 91 /* Don't include skipped bad blocks in size to be erased */ 92 int spread; 93 /* maximum size that actual may be in order to not exceed the buf */ 94 loff_t lim; 95 }; 96 97 typedef struct nand_erase_options nand_erase_options_t; 98 99 int nand_read_skip_bad(nand_info_t *nand, loff_t offset, size_t *length, 100 size_t *actual, loff_t lim, u_char *buffer); 101 102 #define WITH_DROP_FFS (1 << 0) /* drop trailing all-0xff pages */ 103 #define WITH_WR_VERIFY (1 << 1) /* verify data was written correctly */ 104 105 int nand_write_skip_bad(nand_info_t *nand, loff_t offset, size_t *length, 106 size_t *actual, loff_t lim, u_char *buffer, int flags); 107 int nand_erase_opts(nand_info_t *meminfo, const nand_erase_options_t *opts); 108 int nand_torture(nand_info_t *nand, loff_t offset); 109 int nand_verify_page_oob(nand_info_t *nand, struct mtd_oob_ops *ops, 110 loff_t ofs); 111 int nand_verify(nand_info_t *nand, loff_t ofs, size_t len, u_char *buf); 112 113 #define NAND_LOCK_STATUS_TIGHT 0x01 114 #define NAND_LOCK_STATUS_UNLOCK 0x04 115 116 int nand_lock(nand_info_t *meminfo, int tight); 117 int nand_unlock(nand_info_t *meminfo, loff_t start, size_t length, 118 int allexcept); 119 int nand_get_lock_status(nand_info_t *meminfo, loff_t offset); 120 121 int nand_spl_load_image(uint32_t offs, unsigned int size, void *dst); 122 void nand_deselect(void); 123 124 #ifdef CONFIG_SYS_NAND_SELECT_DEVICE 125 void board_nand_select_device(struct nand_chip *nand, int chip); 126 #endif 127 128 __attribute__((noreturn)) void nand_boot(void); 129 130 #endif 131 132 #ifdef CONFIG_ENV_OFFSET_OOB 133 #define ENV_OOB_MARKER 0x30425645 /*"EVB0" in little-endian -- offset is stored 134 as block number*/ 135 #define ENV_OOB_MARKER_OLD 0x30564e45 /*"ENV0" in little-endian -- offset is 136 stored as byte number */ 137 #define ENV_OFFSET_SIZE 8 138 int get_nand_env_oob(nand_info_t *nand, unsigned long *result); 139 #endif 140 int spl_nand_erase_one(int block, int page); 141