mtk_nand_util.h 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. /*
  2. * Copyright (C) 2015 MediaTek Inc.
  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.
  12. */
  13. #ifndef __MTK_NAND_UTIL_H
  14. #define __MTK_NAND_UTIL_H
  15. #include <linux/mtd/mtd.h>
  16. #include <linux/mtd/nand.h>
  17. #include <linux/mtd/partitions.h>
  18. #include <linux/mtd/nand_ecc.h>
  19. #include <nand_device_list.h>
  20. #if defined(CONFIG_MTK_TLC_NAND_SUPPORT)
  21. #include "partition_define_tlc.h"
  22. #else
  23. #include "partition_define_mlc.h"
  24. #endif
  25. #ifndef FALSE
  26. #define FALSE (0)
  27. #endif
  28. #ifndef TRUE
  29. #define TRUE (1)
  30. #endif
  31. #ifndef NULL
  32. #define NULL (0)
  33. #endif
  34. #ifndef ASSERT
  35. #define ASSERT(expr) BUG_ON(!(expr))
  36. #endif
  37. #define DRV_Reg8(x) __raw_readb(x)
  38. #define DRV_Reg16(x) __raw_readw(x)
  39. #define DRV_Reg32(x) __raw_readl(x)
  40. #define DRV_WriteReg8(x, y) __raw_writeb(y, x)
  41. #define DRV_WriteReg16(x, y) __raw_writew(y, x)
  42. #define DRV_WriteReg32(x, y) __raw_writel(y, x)
  43. extern bool init_pmt_done;
  44. /*******************************************************************************
  45. * Data Structure Definition
  46. *******************************************************************************/
  47. struct nfi_saved_para {
  48. u8 suspend_flag;
  49. u16 sNFI_CNFG_REG16;
  50. u32 sNFI_PAGEFMT_REG16;
  51. u32 sNFI_CON_REG16;
  52. u32 sNFI_ACCCON_REG32;
  53. u16 sNFI_INTR_EN_REG16;
  54. u16 sNFI_IOCON_REG16;
  55. u16 sNFI_CSEL_REG16;
  56. u16 sNFI_DEBUG_CON1_REG16;
  57. u32 sECC_ENCCNFG_REG32;
  58. u32 sECC_FDMADDR_REG32;
  59. u32 sECC_DECCNFG_REG32;
  60. u32 sSNAND_MISC_CTL;
  61. u32 sSNAND_MISC_CTL2;
  62. u32 sSNAND_DLY_CTL1;
  63. u32 sSNAND_DLY_CTL2;
  64. u32 sSNAND_DLY_CTL3;
  65. u32 sSNAND_DLY_CTL4;
  66. u32 sSNAND_CNFG;
  67. };
  68. struct mtk_nand_pl_test {
  69. suseconds_t last_erase_time;
  70. suseconds_t last_prog_time;
  71. u32 nand_program_wdt_enable;
  72. u32 nand_erase_wdt_enable;
  73. };
  74. struct mtk_nand_host {
  75. struct nand_chip nand_chip;
  76. struct mtd_info mtd;
  77. struct mtk_nand_host_hw *hw;
  78. #ifdef CONFIG_PM
  79. struct nfi_saved_para saved_para;
  80. #endif
  81. #ifdef CONFIG_PWR_LOSS_MTK_SPOH
  82. struct mtk_nand_pl_test pl;
  83. #endif
  84. struct mtd_erase_region_info erase_region[20];
  85. };
  86. struct NAND_CMD {
  87. u32 u4ColAddr;
  88. u32 u4RowAddr;
  89. u32 u4OOBRowAddr;
  90. u8 au1OOB[128];
  91. u8 *pDataBuf;
  92. #ifdef NAND_PFM
  93. u32 pureReadOOB;
  94. u32 pureReadOOBNum;
  95. #endif
  96. };
  97. enum readCommand {
  98. NORMAL_READ = 0,
  99. AD_CACHE_READ,
  100. AD_CACHE_FINAL
  101. };
  102. extern struct flashdev_info_t gn_devinfo;
  103. extern void mt_irq_set_sens(unsigned int irq, unsigned int sens);
  104. extern void mt_irq_set_polarity(unsigned int irq, unsigned int polarity);
  105. bool mtk_nand_SetFeature(struct mtd_info *mtd, u16 cmd, u32 addr, u8 *value, u8 bytes);
  106. bool mtk_nand_GetFeature(struct mtd_info *mtd, u16 cmd, u32 addr, u8 *value, u8 bytes);
  107. extern void part_init_pmt(struct mtd_info *mtd, u8 *buf);
  108. extern u64 part_get_startaddress(u64 byte_address, u32 *idx);
  109. extern bool raw_partition(u32 index);
  110. extern struct mtd_perf_log g_MtdPerfLog;
  111. extern struct mtd_partition g_pasStatic_Partition[];
  112. extern int part_num;
  113. extern struct mtd_partition g_exist_Partition[];
  114. extern struct mtd_partition g_pasStatic_Partition[PART_MAX_COUNT];
  115. #if defined(CONFIG_MTK_TLC_NAND_SUPPORT)
  116. extern u64 OFFSET(u32 block);
  117. extern void mtk_pmt_reset(void);
  118. extern bool mtk_nand_IsBMTPOOL(loff_t logical_address);
  119. #endif
  120. extern bool mtk_block_istlc(u64 addr);
  121. extern void mtk_slc_blk_addr(u64 addr, u32 *blk_num, u32 *page_in_block);
  122. bool mtk_is_normal_tlc_nand(void);
  123. int mtk_nand_tlc_block_mark(struct mtd_info *mtd, struct nand_chip *chip, u32 mapped_block);
  124. extern int mtk_nand_write_tlc_block_hw(struct mtd_info *mtd, struct nand_chip *chip,
  125. uint8_t *buf, u32 mapped_block);
  126. void show_stack(struct task_struct *tsk, unsigned long *sp);
  127. extern int mtk_nand_interface_async(void);
  128. extern int mtk_nand_exec_read_page(struct mtd_info *mtd, u32 u4RowAddr, u32 u4PageSize, u8 *pPageBuf, u8 *pFDMBuf);
  129. extern int mtk_nand_block_bad_hw(struct mtd_info *mtd, loff_t ofs);
  130. extern int mtk_nand_erase_hw(struct mtd_info *mtd, int page);
  131. extern int mtk_nand_block_markbad_hw(struct mtd_info *mtd, loff_t offset);
  132. extern int mtk_nand_exec_write_page(struct mtd_info *mtd, u32 u4RowAddr, u32 u4PageSize, u8 *pPageBuf, u8 *pFDMBuf);
  133. u32 MICRON_TRANSFER(u32 pageNo);
  134. u32 SANDISK_TRANSFER(u32 pageNo);
  135. u32 HYNIX_TRANSFER(u32 pageNo);
  136. u32 hynix_pairpage_mapping(u32 page, bool high_to_low);
  137. u32 micron_pairpage_mapping(u32 page, bool high_to_low);
  138. u32 sandisk_pairpage_mapping(u32 page, bool high_to_low);
  139. /* NAND driver */
  140. struct mtk_nand_host_hw {
  141. unsigned int nfi_bus_width; /* NFI_BUS_WIDTH */
  142. unsigned int nfi_access_timing; /* NFI_ACCESS_TIMING */
  143. unsigned int nfi_cs_num; /* NFI_CS_NUM */
  144. unsigned int nand_sec_size; /* NAND_SECTOR_SIZE */
  145. unsigned int nand_sec_shift; /* NAND_SECTOR_SHIFT */
  146. unsigned int nand_ecc_size;
  147. unsigned int nand_ecc_bytes;
  148. unsigned int nand_ecc_mode;
  149. unsigned int nand_fdm_size; /*FDM size, for 8163 tlc*/
  150. };
  151. extern struct mtk_nand_host_hw mtk_nand_hw;
  152. #define NFI_DEFAULT_ACCESS_TIMING (0x44333)
  153. /* uboot only support 1 cs */
  154. #define NFI_CS_NUM (2)
  155. #define NFI_DEFAULT_CS (0)
  156. /*
  157. * ECC layout control structure. Exported to userspace for
  158. * diagnosis and to allow creation of raw images
  159. struct nand_ecclayout {
  160. uint32_t eccbytes;
  161. uint32_t eccpos[64];
  162. uint32_t oobavail;
  163. struct nand_oobfree oobfree[MTD_MAX_OOBFREE_ENTRIES];
  164. };
  165. */
  166. #define __DEBUG_NAND 1 /* Debug information on/off */
  167. /* Debug message event */
  168. #define DBG_EVT_NONE 0x00000000 /* No event */
  169. #define DBG_EVT_INIT 0x00000001 /* Initial related event */
  170. #define DBG_EVT_VERIFY 0x00000002 /* Verify buffer related event */
  171. #define DBG_EVT_PERFORMANCE 0x00000004 /* Performance related event */
  172. #define DBG_EVT_READ 0x00000008 /* Read related event */
  173. #define DBG_EVT_WRITE 0x00000010 /* Write related event */
  174. #define DBG_EVT_ERASE 0x00000020 /* Erase related event */
  175. #define DBG_EVT_BADBLOCK 0x00000040 /* Badblock related event */
  176. #define DBG_EVT_POWERCTL 0x00000080 /* Suspend/Resume related event */
  177. #define DBG_EVT_OTP 0x00000100 /* OTP related event */
  178. #define DBG_EVT_ALL 0xffffffff
  179. #define DBG_EVT_MASK (DBG_EVT_INIT|DBG_EVT_POWERCTL)
  180. #if __DEBUG_NAND
  181. #define MSG(evt, fmt, args...) \
  182. do { \
  183. if ((DBG_EVT_##evt) & DBG_EVT_MASK) { \
  184. pr_warn(fmt, ##args); \
  185. } \
  186. } while (0)
  187. #define MSG_FUNC_ENTRY(f) MSG(FUC, "<FUN_ENT>: %s\n", __func__)
  188. #else
  189. #define MSG(evt, fmt, args...) do {} while (0)
  190. #define MSG_FUNC_ENTRY(f) do {} while (0)
  191. #endif
  192. #endif