mtk_nand.h 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593
  1. #ifndef __MTK_NAND_H__
  2. #define __MTK_NAND_H__
  3. #include <platform/mt_typedefs.h>
  4. #include <sys/types.h>
  5. #include <platform/mt_reg_base.h>
  6. #ifndef MTK_EMMC_SUPPORT
  7. #include <platform/nand_device_list.h>
  8. #endif
  9. typedef volatile unsigned char *P_U8;
  10. typedef volatile signed char *P_S8;
  11. typedef volatile unsigned short *P_U16;
  12. typedef volatile signed short *P_S16;
  13. typedef volatile unsigned int *P_U32;
  14. typedef volatile signed int *P_S32;
  15. typedef unsigned long long *P_U64;
  16. typedef signed long long *P_S64;
  17. /*******************************************************************************
  18. * NFI Register Definition
  19. *******************************************************************************/
  20. #define NFI_CNFG_REG16 ((volatile P_U16)(NFI_BASE+0x0000))
  21. #define NFI_PAGEFMT_REG16 ((volatile P_U16)(NFI_BASE+0x0004))
  22. #define NFI_CON_REG16 ((volatile P_U16)(NFI_BASE+0x0008))
  23. #define NFI_ACCCON_REG32 ((volatile P_U32)(NFI_BASE+0x000C))
  24. #define NFI_INTR_EN_REG16 ((volatile P_U16)(NFI_BASE+0x0010))
  25. #define NFI_INTR_REG16 ((volatile P_U16)(NFI_BASE+0x0014))
  26. #define NFI_CMD_REG16 ((volatile P_U16)(NFI_BASE+0x0020))
  27. #define NFI_ADDRNOB_REG16 ((volatile P_U16)(NFI_BASE+0x0030))
  28. #define NFI_COLADDR_REG32 ((volatile P_U32)(NFI_BASE+0x0034))
  29. #define NFI_ROWADDR_REG32 ((volatile P_U32)(NFI_BASE+0x0038))
  30. #define NFI_STRDATA_REG16 ((volatile P_U16)(NFI_BASE+0x0040))
  31. #define NFI_CNRNB_REG16 ((volatile P_U16)(NFI_BASE+0x0044))
  32. #define NFI_DATAW_REG32 ((volatile P_U32)(NFI_BASE+0x0050))
  33. #define NFI_DATAR_REG32 ((volatile P_U32)(NFI_BASE+0x0054))
  34. #define NFI_PIO_DIRDY_REG16 ((volatile P_U16)(NFI_BASE+0x0058))
  35. #define NFI_STA_REG32 ((volatile P_U32)(NFI_BASE+0x0060))
  36. #define NFI_FIFOSTA_REG16 ((volatile P_U16)(NFI_BASE+0x0064))
  37. #define NFI_LOCKSTA_REG16 ((volatile P_U16)(NFI_BASE+0x0068))
  38. #define NFI_ADDRCNTR_REG16 ((volatile P_U16)(NFI_BASE+0x0070))
  39. #define NFI_STRADDR_REG32 ((volatile P_U32)(NFI_BASE+0x0080))
  40. #define NFI_BYTELEN_REG16 ((volatile P_U16)(NFI_BASE+0x0084))
  41. #define NFI_CSEL_REG16 ((volatile P_U16)(NFI_BASE+0x0090))
  42. #define NFI_IOCON_REG16 ((volatile P_U16)(NFI_BASE+0x0094))
  43. #define NFI_FDM0L_REG32 ((volatile P_U32)(NFI_BASE+0x00A0))
  44. #define NFI_FDM0M_REG32 ((volatile P_U32)(NFI_BASE+0x00A4))
  45. #define NFI_LOCK_REG16 ((volatile P_U16)(NFI_BASE+0x0100))
  46. #define NFI_LOCKCON_REG32 ((volatile P_U32)(NFI_BASE+0x0104))
  47. #define NFI_LOCKANOB_REG16 ((volatile P_U16)(NFI_BASE+0x0108))
  48. #define NFI_LOCK00ADD_REG32 ((volatile P_U32)(NFI_BASE+0x0110))
  49. #define NFI_LOCK00FMT_REG32 ((volatile P_U32)(NFI_BASE+0x0114))
  50. #define NFI_LOCK01ADD_REG32 ((volatile P_U32)(NFI_BASE+0x0118))
  51. #define NFI_LOCK01FMT_REG32 ((volatile P_U32)(NFI_BASE+0x011C))
  52. #define NFI_LOCK02ADD_REG32 ((volatile P_U32)(NFI_BASE+0x0120))
  53. #define NFI_LOCK02FMT_REG32 ((volatile P_U32)(NFI_BASE+0x0124))
  54. #define NFI_LOCK03ADD_REG32 ((volatile P_U32)(NFI_BASE+0x0128))
  55. #define NFI_LOCK03FMT_REG32 ((volatile P_U32)(NFI_BASE+0x012C))
  56. #define NFI_LOCK04ADD_REG32 ((volatile P_U32)(NFI_BASE+0x0130))
  57. #define NFI_LOCK04FMT_REG32 ((volatile P_U32)(NFI_BASE+0x0134))
  58. #define NFI_LOCK05ADD_REG32 ((volatile P_U32)(NFI_BASE+0x0138))
  59. #define NFI_LOCK05FMT_REG32 ((volatile P_U32)(NFI_BASE+0x013C))
  60. #define NFI_LOCK06ADD_REG32 ((volatile P_U32)(NFI_BASE+0x0140))
  61. #define NFI_LOCK06FMT_REG32 ((volatile P_U32)(NFI_BASE+0x0144))
  62. #define NFI_LOCK07ADD_REG32 ((volatile P_U32)(NFI_BASE+0x0148))
  63. #define NFI_LOCK07FMT_REG32 ((volatile P_U32)(NFI_BASE+0x014C))
  64. #define NFI_LOCK08ADD_REG32 ((volatile P_U32)(NFI_BASE+0x0150))
  65. #define NFI_LOCK08FMT_REG32 ((volatile P_U32)(NFI_BASE+0x0154))
  66. #define NFI_LOCK09ADD_REG32 ((volatile P_U32)(NFI_BASE+0x0158))
  67. #define NFI_LOCK09FMT_REG32 ((volatile P_U32)(NFI_BASE+0x015C))
  68. #define NFI_LOCK10ADD_REG32 ((volatile P_U32)(NFI_BASE+0x0160))
  69. #define NFI_LOCK10FMT_REG32 ((volatile P_U32)(NFI_BASE+0x0164))
  70. #define NFI_LOCK11ADD_REG32 ((volatile P_U32)(NFI_BASE+0x0168))
  71. #define NFI_LOCK11FMT_REG32 ((volatile P_U32)(NFI_BASE+0x016C))
  72. #define NFI_LOCK12ADD_REG32 ((volatile P_U32)(NFI_BASE+0x0170))
  73. #define NFI_LOCK12FMT_REG32 ((volatile P_U32)(NFI_BASE+0x0174))
  74. #define NFI_LOCK13ADD_REG32 ((volatile P_U32)(NFI_BASE+0x0178))
  75. #define NFI_LOCK13FMT_REG32 ((volatile P_U32)(NFI_BASE+0x017C))
  76. #define NFI_LOCK14ADD_REG32 ((volatile P_U32)(NFI_BASE+0x0180))
  77. #define NFI_LOCK14FMT_REG32 ((volatile P_U32)(NFI_BASE+0x0184))
  78. #define NFI_LOCK15ADD_REG32 ((volatile P_U32)(NFI_BASE+0x0188))
  79. #define NFI_LOCK15FMT_REG32 ((volatile P_U32)(NFI_BASE+0x018C))
  80. #define NFI_FIFODATA0_REG32 ((volatile P_U32)(NFI_BASE+0x0190))
  81. #define NFI_FIFODATA1_REG32 ((volatile P_U32)(NFI_BASE+0x0194))
  82. #define NFI_FIFODATA2_REG32 ((volatile P_U32)(NFI_BASE+0x0198))
  83. #define NFI_FIFODATA3_REG32 ((volatile P_U32)(NFI_BASE+0x019C))
  84. #define NFI_MASTERSTA_REG16 ((volatile P_U16)(NFI_BASE+0x0210))
  85. /*******************************************************************************
  86. * NFI Register Field Definition
  87. *******************************************************************************/
  88. /* NFI_CNFG */
  89. #define CNFG_AHB (0x0001)
  90. #define CNFG_READ_EN (0x0002)
  91. #define CNFG_DMA_BURST_EN (0x0004)
  92. #define CNFG_BYTE_RW (0x0040)
  93. #define CNFG_HW_ECC_EN (0x0100)
  94. #define CNFG_AUTO_FMT_EN (0x0200)
  95. #define CNFG_OP_IDLE (0x0000)
  96. #define CNFG_OP_READ (0x1000)
  97. #define CNFG_OP_SRD (0x2000)
  98. #define CNFG_OP_PRGM (0x3000)
  99. #define CNFG_OP_ERASE (0x4000)
  100. #define CNFG_OP_RESET (0x5000)
  101. #define CNFG_OP_CUST (0x6000)
  102. #define CNFG_OP_MODE_MASK (0x7000)
  103. #define CNFG_OP_MODE_SHIFT (12)
  104. /* NFI_PAGEFMT */
  105. #define PAGEFMT_512 (0x0000)
  106. #define PAGEFMT_2K (0x0001)
  107. #define PAGEFMT_4K (0x0002)
  108. #define PAGEFMT_PAGE_MASK (0x0003)
  109. #define PAGEFMT_DBYTE_EN (0x0008)
  110. #define PAGEFMT_SPARE_16 (0x0000)
  111. #define PAGEFMT_SPARE_26 (0x0001)
  112. #define PAGEFMT_SPARE_27 (0x0002)
  113. #define PAGEFMT_SPARE_28 (0x0003)
  114. #define PAGEFMT_SPARE_MASK (0x0030)
  115. #define PAGEFMT_SPARE_SHIFT (4)
  116. #define PAGEFMT_FDM_MASK (0x0F00)
  117. #define PAGEFMT_FDM_SHIFT (8)
  118. #define PAGEFMT_FDM_ECC_MASK (0xF000)
  119. #define PAGEFMT_FDM_ECC_SHIFT (12)
  120. /* NFI_CON */
  121. #define CON_FIFO_FLUSH (0x0001)
  122. #define CON_NFI_RST (0x0002)
  123. #define CON_NFI_SRD (0x0010)
  124. #define CON_NFI_NOB_MASK (0x0060)
  125. #define CON_NFI_NOB_SHIFT (5)
  126. #define CON_NFI_BRD (0x0100)
  127. #define CON_NFI_BWR (0x0200)
  128. #define CON_NFI_SEC_MASK (0xF000)
  129. #define CON_NFI_SEC_SHIFT (12)
  130. /* NFI_ACCCON */
  131. #define ACCCON_SETTING ()
  132. /* NFI_INTR_EN */
  133. #define INTR_RD_DONE_EN (0x0001)
  134. #define INTR_WR_DONE_EN (0x0002)
  135. #define INTR_RST_DONE_EN (0x0004)
  136. #define INTR_ERASE_DONE_EN (0x0008)
  137. #define INTR_BSY_RTN_EN (0x0010)
  138. #define INTR_ACC_LOCK_EN (0x0020)
  139. #define INTR_AHB_DONE_EN (0x0040)
  140. #define INTR_ALL_INTR_DE (0x0000)
  141. #define INTR_ALL_INTR_EN (0x007F)
  142. /* NFI_INTR */
  143. #define INTR_RD_DONE (0x0001)
  144. #define INTR_WR_DONE (0x0002)
  145. #define INTR_RST_DONE (0x0004)
  146. #define INTR_ERASE_DONE (0x0008)
  147. #define INTR_BSY_RTN (0x0010)
  148. #define INTR_ACC_LOCK (0x0020)
  149. #define INTR_AHB_DONE (0x0040)
  150. /* NFI_ADDRNOB */
  151. #define ADDR_COL_NOB_MASK (0x0003)
  152. #define ADDR_COL_NOB_SHIFT (0)
  153. #define ADDR_ROW_NOB_MASK (0x0030)
  154. #define ADDR_ROW_NOB_SHIFT (4)
  155. /* NFI_STA */
  156. #define STA_READ_EMPTY (0x00001000)
  157. #define STA_ACC_LOCK (0x00000010)
  158. #define STA_CMD_STATE (0x00000001)
  159. #define STA_ADDR_STATE (0x00000002)
  160. #define STA_DATAR_STATE (0x00000004)
  161. #define STA_DATAW_STATE (0x00000008)
  162. #define STA_NAND_FSM_MASK (0x1F000000)
  163. #define STA_NAND_BUSY (0x00000100)
  164. #define STA_NAND_BUSY_RETURN (0x00000200)
  165. #define STA_NFI_FSM_MASK (0x000F0000)
  166. #define STA_NFI_OP_MASK (0x0000000F)
  167. /* NFI_FIFOSTA */
  168. #define FIFO_RD_EMPTY (0x0040)
  169. #define FIFO_RD_FULL (0x0080)
  170. #define FIFO_WR_FULL (0x8000)
  171. #define FIFO_WR_EMPTY (0x4000)
  172. #define FIFO_RD_REMAIN(x) (0x1F&(x))
  173. #define FIFO_WR_REMAIN(x) ((0x1F00&(x))>>8)
  174. /* NFI_ADDRCNTR */
  175. #define ADDRCNTR_CNTR(x) ((0xF000&(x))>>12)
  176. #define ADDRCNTR_OFFSET(x) (0x03FF&(x))
  177. /* NFI_LOCK */
  178. #define NFI_LOCK_ON (0x0001)
  179. /* NFI_LOCKANOB */
  180. #define PROG_RADD_NOB_MASK (0x7000)
  181. #define PROG_RADD_NOB_SHIFT (12)
  182. #define PROG_CADD_NOB_MASK (0x0300)
  183. #define PROG_CADD_NOB_SHIFT (8)
  184. #define ERASE_RADD_NOB_MASK (0x0070)
  185. #define ERASE_RADD_NOB_SHIFT (4)
  186. #define ERASE_CADD_NOB_MASK (0x0007)
  187. #define ERASE_CADD_NOB_SHIFT (0)
  188. /*******************************************************************************
  189. * ECC Register Definition
  190. *******************************************************************************/
  191. #define ECC_ENCCON_REG16 ((volatile P_U16)(NFIECC_BASE+0x0000))
  192. #define ECC_ENCCNFG_REG32 ((volatile P_U32)(NFIECC_BASE+0x0004))
  193. #define ECC_ENCDIADDR_REG32 ((volatile P_U32)(NFIECC_BASE+0x0008))
  194. #define ECC_ENCIDLE_REG32 ((volatile P_U32)(NFIECC_BASE+0x000C))
  195. #define ECC_ENCPAR0_REG32 ((volatile P_U32)(NFIECC_BASE+0x0010))
  196. #define ECC_ENCPAR1_REG32 ((volatile P_U32)(NFIECC_BASE+0x0014))
  197. #define ECC_ENCPAR2_REG32 ((volatile P_U32)(NFIECC_BASE+0x0018))
  198. #define ECC_ENCPAR3_REG32 ((volatile P_U32)(NFIECC_BASE+0x001C))
  199. #define ECC_ENCPAR4_REG32 ((volatile P_U32)(NFIECC_BASE+0x0020))
  200. #define ECC_ENCPAR5_REG32 ((volatile P_U32)(NFIECC_BASE+0x0024))
  201. #define ECC_ENCPAR6_REG32 ((volatile P_U32)(NFIECC_BASE+0x0028))
  202. #define ECC_ENCSTA_REG32 ((volatile P_U32)(NFIECC_BASE+0x002C))
  203. #define ECC_ENCIRQEN_REG16 ((volatile P_U16)(NFIECC_BASE+0x0030))
  204. #define ECC_ENCIRQSTA_REG16 ((volatile P_U16)(NFIECC_BASE+0x0034))
  205. #define ECC_DECCON_REG16 ((volatile P_U16)(NFIECC_BASE+0x0100))
  206. #define ECC_DECCNFG_REG32 ((volatile P_U32)(NFIECC_BASE+0x0104))
  207. #define ECC_DECDIADDR_REG32 ((volatile P_U32)(NFIECC_BASE+0x0108))
  208. #define ECC_DECIDLE_REG16 ((volatile P_U16)(NFIECC_BASE+0x010C))
  209. #define ECC_DECFER_REG16 ((volatile P_U16)(NFIECC_BASE+0x0110))
  210. #define ECC_DECENUM0_REG32 ((volatile P_U32)(NFIECC_BASE+0x0114))
  211. #define ECC_DECENUM1_REG32 ((volatile P_U32)(NFIECC_BASE+0x0118))
  212. #define ECC_DECDONE_REG16 ((volatile P_U16)(NFIECC_BASE+0x011C))
  213. #define ECC_DECEL0_REG32 ((volatile P_U32)(NFIECC_BASE+0x0120))
  214. #define ECC_DECEL1_REG32 ((volatile P_U32)(NFIECC_BASE+0x012C))
  215. #define ECC_DECEL2_REG32 ((volatile P_U32)(NFIECC_BASE+0x0128))
  216. #define ECC_DECEL3_REG32 ((volatile P_U32)(NFIECC_BASE+0x012C))
  217. #define ECC_DECEL4_REG32 ((volatile P_U32)(NFIECC_BASE+0x0130))
  218. #define ECC_DECEL5_REG32 ((volatile P_U32)(NFIECC_BASE+0x0134))
  219. #define ECC_DECEL6_REG32 ((volatile P_U32)(NFIECC_BASE+0x0138))
  220. #define ECC_DECEL7_REG32 ((volatile P_U32)(NFIECC_BASE+0x013C))
  221. #define ECC_DECIRQEN_REG16 ((volatile P_U16)(NFIECC_BASE+0x0140))
  222. #define ECC_DECIRQSTA_REG16 ((volatile P_U16)(NFIECC_BASE+0x0144))
  223. #define ECC_FDMADDR_REG32 ((volatile P_U32)(NFIECC_BASE+0x0148))
  224. #define ECC_DECFSM_REG32 ((volatile P_U32)(NFIECC_BASE+0x014C))
  225. #define ECC_SYNSTA_REG32 ((volatile P_U32)(NFIECC_BASE+0x0150))
  226. #define ECC_DECNFIDI_REG32 ((volatile P_U32)(NFIECC_BASE+0x0154))
  227. #define ECC_SYN0_REG32 ((volatile P_U32)(NFIECC_BASE+0x0158))
  228. /*******************************************************************************
  229. * ECC register definition
  230. *******************************************************************************/
  231. /* ECC_ENCON */
  232. #define ENC_EN (0x0001)
  233. #define ENC_DE (0x0000)
  234. /* ECC_ENCCNFG */
  235. #define ECC_CNFG_ECC4 (0x0000)
  236. #define ECC_CNFG_ECC6 (0x0001)
  237. #define ECC_CNFG_ECC8 (0x0002)
  238. #define ECC_CNFG_ECC10 (0x0003)
  239. #define ECC_CNFG_ECC12 (0x0004)
  240. #define ECC_CNFG_ECC_MASK (0x00000007)
  241. #define ENC_CNFG_NFI (0x0010)
  242. #define ENC_CNFG_MODE_MASK (0x0010)
  243. #define ENC_CNFG_META6 (0x10300000)
  244. #define ENC_CNFG_META8 (0x10400000)
  245. #define ENC_CNFG_MSG_MASK (0x1FFF0000)
  246. #define ENC_CNFG_MSG_SHIFT (0x10)
  247. /* ECC_ENCIDLE */
  248. #define ENC_IDLE (0x0001)
  249. /* ECC_ENCSTA */
  250. #define STA_FSM (0x001F)
  251. #define STA_COUNT_PS (0xFF10)
  252. #define STA_COUNT_MS (0x3FFF0000)
  253. /* ECC_ENCIRQEN */
  254. #define ENC_IRQEN (0x0001)
  255. /* ECC_ENCIRQSTA */
  256. #define ENC_IRQSTA (0x0001)
  257. /* ECC_DECCON */
  258. #define DEC_EN (0x0001)
  259. #define DEC_DE (0x0000)
  260. /* ECC_ENCCNFG */
  261. #define DEC_CNFG_ECC4 (0x0000)
  262. //#define DEC_CNFG_ECC6 (0x0001)
  263. //#define DEC_CNFG_ECC12 (0x0002)
  264. #define DEC_CNFG_NFI (0x0010)
  265. //#define DEC_CNFG_META6 (0x10300000)
  266. //#define DEC_CNFG_META8 (0x10400000)
  267. #define DEC_CNFG_FER (0x01000)
  268. #define DEC_CNFG_EL (0x02000)
  269. #define DEC_CNFG_CORRECT (0x03000)
  270. #define DEC_CNFG_TYPE_MASK (0x03000)
  271. #define DEC_CNFG_EMPTY_EN (0x80000000)
  272. #define DEC_CNFG_CODE_MASK (0x1FFF0000)
  273. #define DEC_CNFG_CODE_SHIFT (0x10)
  274. /* ECC_DECIDLE */
  275. #define DEC_IDLE (0x0001)
  276. /* ECC_DECFER */
  277. #define DEC_FER0 (0x0001)
  278. #define DEC_FER1 (0x0002)
  279. #define DEC_FER2 (0x0004)
  280. #define DEC_FER3 (0x0008)
  281. #define DEC_FER4 (0x0010)
  282. #define DEC_FER5 (0x0020)
  283. #define DEC_FER6 (0x0040)
  284. #define DEC_FER7 (0x0080)
  285. /* ECC_DECENUM */
  286. #define ERR_NUM0 (0x0000000F)
  287. #define ERR_NUM1 (0x000000F0)
  288. #define ERR_NUM2 (0x00000F00)
  289. #define ERR_NUM3 (0x0000F000)
  290. #define ERR_NUM4 (0x000F0000)
  291. #define ERR_NUM5 (0x00F00000)
  292. #define ERR_NUM6 (0x0F000000)
  293. #define ERR_NUM7 (0xF0000000)
  294. /* ECC_DECDONE */
  295. #define DEC_DONE0 (0x0001)
  296. #define DEC_DONE1 (0x0002)
  297. #define DEC_DONE2 (0x0004)
  298. #define DEC_DONE3 (0x0008)
  299. #define DEC_DONE4 (0x0010)
  300. #define DEC_DONE5 (0x0020)
  301. #define DEC_DONE6 (0x0040)
  302. #define DEC_DONE7 (0x0080)
  303. /* ECC_DECIRQEN */
  304. #define DEC_IRQEN (0x0001)
  305. /* ECC_DECIRQSTA */
  306. #define DEC_IRQSTA (0x0001)
  307. #define OOB_PER_SECTOR (8)
  308. #define _DEBUG_
  309. /* Debug message event */
  310. #define DBG_EVT_NONE 0x00000000 /* No event */
  311. #define DBG_EVT_ERR 0x00000001 /* DMA related event */
  312. #define DBG_EVT_CMD 0x00000002 /* MSDC CMD related event */
  313. #define DBG_EVT_RSP 0x00000004 /* MSDC CMD RSP related event */
  314. #define DBG_EVT_INT 0x00000008 /* MSDC INT event */
  315. #define DBG_EVT_CFG 0x00000010 /* MSDC CFG event */
  316. #define DBG_EVT_FUC 0x00000020 /* Function event */
  317. #define DBG_EVT_OPS 0x00000040 /* Read/Write operation event */
  318. #define DBG_EVT_INIT 0x00000080 /* */
  319. #define DBG_EVT_INFO 0x00000009
  320. #define DBG_EVT_ALL 0xffffffff
  321. #define DBG_EVT_MASK (DBG_EVT_INFO|DBG_EVT_ERR)
  322. #ifdef _DEBUG_
  323. #define MSG(evt, fmt, args...) \
  324. do { \
  325. if ((DBG_EVT_##evt) & DBG_EVT_MASK) { \
  326. printf(fmt, ##args); \
  327. } \
  328. } while(0)
  329. #define MSG_FUNC_ENTRY(f) MSG(FUC, "<FUN_ENT>: %s\n", __FUNCTION__)
  330. #else
  331. #define MSG(evt, fmt, args...) do{}while(0)
  332. #define MSG_FUNC_ENTRY(f) do{}while(0)
  333. #define printf(a,...)
  334. #endif
  335. #define NAND_MAX_OOBSIZE 218
  336. #define NAND_MAX_PAGESIZE 4096
  337. /* Select the chip by setting nCE to low */
  338. #define NAND_NCE 0x01
  339. /* Select the command latch by setting CLE to high */
  340. #define NAND_CLE 0x02
  341. /* Select the address latch by setting ALE to high */
  342. #define NAND_ALE 0x04
  343. #define NAND_CTRL_CLE (NAND_NCE | NAND_CLE)
  344. #define NAND_CTRL_ALE (NAND_NCE | NAND_ALE)
  345. #define NAND_CTRL_CHANGE 0x80
  346. /*
  347. * Standard NAND flash commands
  348. */
  349. #define NAND_CMD_READ0 0
  350. #define NAND_CMD_READ1 1
  351. #define NAND_CMD_RNDOUT 5
  352. #define NAND_CMD_PAGEPROG 0x10
  353. #define NAND_CMD_READOOB 0x50
  354. #define NAND_CMD_ERASE1 0x60
  355. #define NAND_CMD_STATUS 0x70
  356. #define NAND_CMD_STATUS_MULTI 0x71
  357. #define NAND_CMD_SEQIN 0x80
  358. #define NAND_CMD_RNDIN 0x85
  359. #define NAND_CMD_READID 0x90
  360. #define NAND_CMD_ERASE2 0xd0
  361. #define NAND_CMD_RESET 0xff
  362. /* Extended commands for large page devices */
  363. #define NAND_CMD_READSTART 0x30
  364. #define NAND_CMD_RNDOUTSTART 0xE0
  365. #define NAND_CMD_CACHEDPROG 0x15
  366. /* Extended commands for AG-AND device */
  367. /*
  368. * Note: the command for NAND_CMD_DEPLETE1 is really 0x00 but
  369. * there is no way to distinguish that from NAND_CMD_READ0
  370. * until the remaining sequence of commands has been completed
  371. * so add a high order bit and mask it off in the command.
  372. */
  373. #define NAND_CMD_DEPLETE1 0x100
  374. #define NAND_CMD_DEPLETE2 0x38
  375. #define NAND_CMD_STATUS_MULTI 0x71
  376. #define NAND_CMD_STATUS_ERROR 0x72
  377. /* multi-bank error status (banks 0-3) */
  378. #define NAND_CMD_STATUS_ERROR0 0x73
  379. #define NAND_CMD_STATUS_ERROR1 0x74
  380. #define NAND_CMD_STATUS_ERROR2 0x75
  381. #define NAND_CMD_STATUS_ERROR3 0x76
  382. #define NAND_CMD_STATUS_RESET 0x7f
  383. #define NAND_CMD_STATUS_CLEAR 0xff
  384. #define NAND_CMD_NONE -1
  385. /* Status bits */
  386. #define NAND_STATUS_FAIL 0x01
  387. #define NAND_STATUS_FAIL_N1 0x02
  388. #define NAND_STATUS_TRUE_READY 0x20
  389. #define NAND_STATUS_READY 0x40
  390. #define NAND_STATUS_WP 0x80
  391. #define NAND_BUSWIDTH_16 0x00000002
  392. #define MTD_MAX_OOBFREE_ENTRIES 8
  393. #ifndef min
  394. #define min(x, y) (x < y ? x : y)
  395. #endif
  396. #ifndef max
  397. #define max(x, y) (x > y ? x : y)
  398. #endif
  399. #define __raw_readb(addr) (*(volatile kal_uint8 *)(addr))
  400. #define __raw_readw(addr) (*(volatile kal_uint16 *)(addr))
  401. #define __raw_readl(addr) (*(volatile kal_uint32 *)(addr))
  402. #define __raw_writeb(data, addr) ((*(volatile kal_uint8 *)(addr)) = (kal_uint8)data)
  403. #define __raw_writew(data, addr) ((*(volatile kal_uint16 *)(addr)) = (kal_uint16)data)
  404. #define __raw_writel(data, addr) ((*(volatile kal_uint32 *)(addr)) = (kal_uint32)data)
  405. #define NFI_SET_REG32(reg, value) (DRV_WriteReg32(reg, DRV_Reg32(reg) | (value)))
  406. #define NFI_SET_REG16(reg, value) (DRV_WriteReg16(reg, DRV_Reg16(reg) | (value)))
  407. #define NFI_CLN_REG32(reg, value) (DRV_WriteReg32(reg, DRV_Reg32(reg) & (~(value))))
  408. #define NFI_CLN_REG16(reg, value) (DRV_WriteReg16(reg, DRV_Reg16(reg) & (~(value))))
  409. #define NFI_WAIT_STATE_DONE(state) do{;}while (__raw_readl(NFI_STA_REG32) & state)
  410. #define NFI_WAIT_TO_READY() do{;}while (!(__raw_readl(NFI_STA_REG32) & STA_BUSY2READY))
  411. #define FIFO_PIO_READY(x) (0x1 & x)
  412. #define WAIT_NFI_PIO_READY(timeout) \
  413. do {\
  414. while( (!FIFO_PIO_READY(DRV_Reg(NFI_PIO_DIRDY_REG16))) && (--timeout) );\
  415. if(timeout == 0)\
  416. {\
  417. MSG(ERR, "Error: FIFO_PIO_READY timeout at line=%d, file =%s\n", __LINE__, __FILE__);\
  418. }\
  419. } while(0);
  420. #define TIMEOUT_1 0x1fff
  421. #define TIMEOUT_2 0x8ff
  422. #define TIMEOUT_3 0xffff
  423. #define TIMEOUT_4 5000
  424. #ifndef PART_SIZE_BMTPOOL
  425. #define BMT_POOL_SIZE (80)
  426. #else
  427. #define BMT_POOL_SIZE (PART_SIZE_BMTPOOL)
  428. #endif
  429. #define PMT_POOL_SIZE (2)
  430. #define NAND_SECTOR_SIZE (512)
  431. #define NAND_SPARE_PER_SECTOR (16)
  432. #define NAND_FDM_PER_SECTOR (8)
  433. #define IO_WIDTH_8 8
  434. #define IO_WIDTH_16 16
  435. #define OOB_AVAIL_PER_SECTOR 8
  436. typedef enum {
  437. NAND_ECC_NONE,
  438. NAND_ECC_SOFT,
  439. NAND_ECC_HW,
  440. NAND_ECC_HW_SYNDROME,
  441. NAND_ECC_HW_OOB_FIRST,
  442. } nand_ecc_modes_t;
  443. typedef enum {
  444. NAND_ECC_4_BIT = 4,
  445. NAND_ECC_6_BIT = 6,
  446. NAND_ECC_8_BIT = 8,
  447. NAND_ECC_10_BIT = 10,
  448. NAND_ECC_12_BIT = 12,
  449. NAND_ECC_14_BIT = 14,
  450. NAND_ECC_16_BIT = 16,
  451. } nand_ecc_level;
  452. struct nand_oobfree {
  453. u32 offset;
  454. u32 length;
  455. };
  456. struct nand_ecclayout {
  457. u32 eccbytes;
  458. u32 eccpos[128];
  459. u32 oobavail;
  460. struct nand_oobfree oobfree[MTD_MAX_OOBFREE_ENTRIES];
  461. };
  462. struct nand_buffers {
  463. u8 ecccalc[NAND_MAX_OOBSIZE];
  464. u8 ecccode[NAND_MAX_OOBSIZE];
  465. u8 databuf[NAND_MAX_PAGESIZE + NAND_MAX_OOBSIZE];
  466. };
  467. struct CMD {
  468. u32 u4ColAddr;
  469. u32 u4RowAddr;
  470. u32 u4OOBRowAddr;
  471. u8 au1OOB[64];
  472. u8 *pDataBuf;
  473. };
  474. #ifndef MTK_EMMC_SUPPORT
  475. struct nand_chip {
  476. u32 page_shift;
  477. u32 phys_erase_shift;
  478. u32 page_size;
  479. u32 writesize;
  480. u32 chipsize;
  481. u32 erasesize;
  482. u8 id[NAND_MAX_ID];
  483. u8 id_length;
  484. u8 *name;
  485. u32 oobblock; /* page size */
  486. u32 oobsize; /* Amount of OOB data per block (e.g. 64) */
  487. u32 bus16;
  488. u32 options;
  489. nand_ecc_modes_t nand_ecc_mode;
  490. struct nand_ecclayout *ecclayout;
  491. struct nand_buffers *buffers;
  492. };
  493. #endif
  494. extern void nand_init(void);
  495. extern void nand_driver_test(void);
  496. extern int nand_erase(u64 offset, u64 size);
  497. static u32 find_next_good_block(u32 start_block);
  498. static bool block_replace(u32 src_block, u32 dst_block, u32 error_page);
  499. #endif