msdc.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425
  1. /* Copyright Statement:
  2. *
  3. * This software/firmware and related documentation ("MediaTek Software") are
  4. * protected under relevant copyright laws. The information contained herein
  5. * is confidential and proprietary to MediaTek Inc. and/or its licensors.
  6. * Without the prior written permission of MediaTek inc. and/or its licensors,
  7. * any reproduction, modification, use or disclosure of MediaTek Software,
  8. * and information contained herein, in whole or in part, shall be strictly prohibited.
  9. */
  10. /* MediaTek Inc. (C) 2018. All rights reserved.
  11. *
  12. * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  13. * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
  14. * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
  15. * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
  16. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
  17. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
  18. * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
  19. * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
  20. * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
  21. * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
  22. * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
  23. * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
  24. * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
  25. * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
  26. * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
  27. * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
  28. * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
  29. * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
  30. *
  31. * The following software/firmware and/or related documentation ("MediaTek Software")
  32. * have been modified by MediaTek Inc. All revisions are subject to any receiver\'s
  33. * applicable license agreements with MediaTek Inc.
  34. */
  35. #ifndef _MSDC_H_
  36. #define _MSDC_H_
  37. #include "cust_msdc.h"
  38. #include "msdc_cfg.h"
  39. #include "msdc_utils.h"
  40. #include "mmc_core.h"
  41. #include "msdc_irq.h"
  42. #include "mmc_test.h"
  43. #if defined(MMC_MSDC_DRV_PRELOADER)
  44. #include "platform.h"
  45. #include "pll.h"
  46. #include "sync_write.h"
  47. #endif
  48. #if defined(MMC_MSDC_DRV_LK)
  49. #include "sync_write.h"
  50. #include "mt_reg_base.h"
  51. #endif
  52. #if defined(MMC_MSDC_DRV_CTP)
  53. #include "reg_base.H"
  54. #include "intrCtrl.h"
  55. #endif
  56. #include "msdc_dma.h"
  57. #if defined(FEATURE_MMC_SW_CMDQ)
  58. #include "mmc_cmdq.h"
  59. #endif
  60. //#define MTK_MSDC_DUMP_FIFO
  61. /*--------------------------------------------------------------------------*/
  62. /* Common Definition */
  63. /*--------------------------------------------------------------------------*/
  64. #define MSDC_FIFO_SZ (128)
  65. #define MSDC_FIFO_THD (64)
  66. #define MSDC_MS (0)
  67. #define MSDC_SDMMC (1)
  68. #define MSDC_MODE_UNKNOWN (0)
  69. #define MSDC_MODE_PIO (1)
  70. #define MSDC_MODE_DMA_BASIC (2)
  71. #define MSDC_MODE_DMA_DESC (3)
  72. #define MSDC_MODE_DMA_ENHANCED (4)
  73. #if defined(MSDC_MODE_DEFAULT_PIO)
  74. #define MSDC_MODE_DEFAULT MSDC_MODE_PIO
  75. #elif defined(MSDC_MODE_DEFAULT_DMA_BASIC)
  76. #define MSDC_MODE_DEFAULT MSDC_MODE_DMA_BASIC
  77. #elif defined(MSDC_MODE_DEFAULT_DMA_DESC)
  78. #define MSDC_MODE_DEFAULT MSDC_MODE_DMA_DESC
  79. #elif defined(MSDC_MODE_DEFAULT_DMA_ENHANCED)
  80. #define MSDC_MODE_DEFAULT MSDC_MODE_DMA_ENHANCED
  81. #else
  82. #define MSDC_MODE_DEFAULT MSDC_MODE_UNKNOWN
  83. #endif
  84. #define MSDC_BUS_1BITS (0)
  85. #define MSDC_BUS_4BITS (1)
  86. #define MSDC_BUS_8BITS (2)
  87. #define MSDC_BRUST_8B (3)
  88. #define MSDC_BRUST_16B (4)
  89. #define MSDC_BRUST_32B (5)
  90. #define MSDC_BRUST_64B (6)
  91. #define MSDC_AUTOCMD12 (0x0001)
  92. #define MSDC_AUTOCMD23 (0x0002)
  93. #define MSDC_AUTOCMD19 (0x0003)
  94. #define MSDC_PATH_USE_DELAY_LINE (0)
  95. #define MSDC_PATH_USE_ASYNC_FIFO (1)
  96. #define TYPE_CMD_RESP_EDGE (0)
  97. #define TYPE_WRITE_CRC_EDGE (1)
  98. #define TYPE_READ_DATA_EDGE (2)
  99. #define TYPE_WRITE_DATA_EDGE (3)
  100. #define START_AT_RISING (0x0)
  101. #define START_AT_FALLING (0x1)
  102. #define START_AT_RISING_AND_FALLING (0x2)
  103. #define START_AT_RISING_OR_FALLING (0x3)
  104. /* Tuning Parameter */
  105. #define DEFAULT_DEBOUNCE (8) /* 8 cycles */
  106. #define DEFAULT_DTOC (40) /* data timeout counter. 65536x40 sclk. */
  107. #define DEFAULT_WDOD (0) /* write data output delay. no delay. */
  108. #define DEFAULT_BSYDLY (8) /* card busy delay. 8 extend sclk */
  109. /* Timeout Parameter */
  110. #define TMO_IN_CLK_2POWER 20 /* 2^20=1048576 */
  111. #define EMMC_BOOT_TMO_IN_CLK_2POWER 16 /* 2^16=65536 */
  112. #include "msdc_reg.h"
  113. #include "msdc_io.h"
  114. typedef struct {
  115. int pio_bits; /* PIO width: 32, 16, or 8bits */
  116. int autocmd;
  117. int cmd23_flags;
  118. struct dma_config cfg;
  119. struct scatterlist sg[MAX_SG_POOL_SZ];
  120. int alloc_gpd;
  121. int alloc_bd;
  122. int rdsmpl;
  123. int wdsmpl;
  124. int rsmpl;
  125. int start_bit;
  126. int tuning_mode;
  127. gpd_t *active_head;
  128. gpd_t *active_tail;
  129. gpd_t *gpd_pool;
  130. bd_t *bd_pool;
  131. } msdc_priv_t;
  132. #define DMA_FLAG_NONE (0x00000000)
  133. #define DMA_FLAG_EN_CHKSUM (0x00000001)
  134. #define DMA_FLAG_PAD_BLOCK (0x00000002)
  135. #define DMA_FLAG_PAD_DWORD (0x00000004)
  136. #define MSDC_WRITE32(addr, data) (*(volatile uint32*)(addr) = (uint32)(data))
  137. #define MSDC_READ32(addr) (*(volatile uint32*)(addr))
  138. #define MSDC_WRITE16(addr, data) (*(volatile uint16*)(addr) = (uint16)(data))
  139. #define MSDC_READ16(addr) (*(volatile uint16*)(addr))
  140. #define MSDC_WRITE8(addr, data) (*(volatile uint8*)(addr) = (uint8)(data))
  141. #define MSDC_READ8(addr) (*(volatile uint8*)(addr))
  142. #define MSDC_SET_BIT32(addr, mask) \
  143. do { \
  144. unsigned int tv = MSDC_READ32(addr); \
  145. tv |=((u32)(mask)); \
  146. MSDC_WRITE32(addr, tv); \
  147. } while(0)
  148. #define MSDC_CLR_BIT32(addr, mask) \
  149. do { \
  150. unsigned int tv = MSDC_READ32(addr); \
  151. tv &= ~((u32)(mask)); \
  152. MSDC_WRITE32(addr, tv); \
  153. } while(0)
  154. #define MSDC_SET_BIT16(addr, mask) \
  155. do { \
  156. unsigned short tv = MSDC_READ16(addr); \
  157. tv |= ((u16)(mask)); \
  158. MSDC_WRITE16(addr, tv); \
  159. } while(0)
  160. #define MSDC_CLR_BIT16(addr, mask) \
  161. do { \
  162. unsigned short tv = MSDC_READ16(addr); \
  163. tv &= ~((u16)(mask)); \
  164. MSDC_WRITE16(addr, tv); \
  165. } while(0)
  166. #define MSDC_SET_FIELD(reg, field, val) \
  167. do { \
  168. volatile uint32 tv = MSDC_READ32(reg); \
  169. tv &= ~(field); \
  170. tv |= ((val) << (uffs(field) - 1)); \
  171. MSDC_WRITE32(reg, tv); \
  172. } while(0)
  173. #define MSDC_GET_FIELD(reg, field, val) \
  174. do { \
  175. volatile uint32 tv = MSDC_READ32(reg); \
  176. val = ((tv & (field)) >> (uffs(field) - 1)); \
  177. } while(0)
  178. #define MSDC_SET_FIELD_16(reg, field, val) \
  179. do { \
  180. volatile uint16 tv = MSDC_READ16(reg); \
  181. tv &= ~(field); \
  182. tv |= ((val) << (uffs(field) - 1)); \
  183. MSDC_WRITE16(reg, tv); \
  184. } while(0)
  185. #define MSDC_GET_FIELD_16(reg, field, val) \
  186. do { \
  187. volatile uint16 tv = MSDC_READ16(reg); \
  188. val = ((tv & (field)) >> (uffs(field) - 1)); \
  189. } while(0)
  190. #define MSDC_RETRY(expr, retry, cnt) \
  191. do { \
  192. uint32 t = cnt; \
  193. uint32 r = retry; \
  194. uint32 c = cnt; \
  195. while (r) { \
  196. if (!(expr)) break; \
  197. if (c-- == 0) { \
  198. r--; udelay(200); c = t; \
  199. } \
  200. } \
  201. BUG_ON(r == 0); \
  202. } while(0)
  203. /*sd card change voltage wait time= (1/freq) * SDC_VOL_CHG_CNT(default 0x145)*/
  204. #define msdc_set_vol_change_wait_count(count) \
  205. do { \
  206. MSDC_SET_FIELD(SDC_VOL_CHG,SDC_VOL_CHG_CNT, (count)); \
  207. } while(0)
  208. #define MSDC_RESET() \
  209. do { \
  210. MSDC_SET_BIT32(MSDC_CFG, MSDC_CFG_RST); \
  211. MSDC_RETRY(MSDC_READ32(MSDC_CFG) & MSDC_CFG_RST, 5, 1000); \
  212. } while(0)
  213. #define MSDC_CLR_INT() \
  214. do { \
  215. volatile uint32 val = MSDC_READ32(MSDC_INT); \
  216. MSDC_WRITE32(MSDC_INT, val); \
  217. if (MSDC_READ32(MSDC_INT)) { \
  218. MSG(ERR, "[ASSERT] MSDC_INT is NOT clear\n"); \
  219. } \
  220. } while(0)
  221. #define MSDC_CLR_FIFO() \
  222. do { \
  223. MSDC_SET_BIT32(MSDC_FIFOCS, MSDC_FIFOCS_CLR); \
  224. MSDC_RETRY(MSDC_READ32(MSDC_FIFOCS) & MSDC_FIFOCS_CLR, 5, 1000); \
  225. } while(0)
  226. #define MSDC_FIFO_WRITE32(val) MSDC_WRITE32(MSDC_TXDATA, val)
  227. #define MSDC_FIFO_READ32() MSDC_READ32(MSDC_RXDATA)
  228. #define MSDC_FIFO_WRITE16(val) MSDC_WRITE16(MSDC_TXDATA, val)
  229. #define MSDC_FIFO_READ16() MSDC_READ16(MSDC_RXDATA)
  230. #define MSDC_FIFO_WRITE8(val) MSDC_WRITE8(MSDC_TXDATA, val)
  231. #define MSDC_FIFO_READ8() MSDC_READ8(MSDC_RXDATA)
  232. #define MSDC_FIFO_WRITE(val) MSDC_FIFO_WRITE32(val)
  233. #define MSDC_FIFO_READ() MSDC_FIFO_READ32()
  234. #define MSDC_TXFIFOCNT() \
  235. ((MSDC_READ32(MSDC_FIFOCS) & MSDC_FIFOCS_TXCNT) >> 16)
  236. #define MSDC_RXFIFOCNT() \
  237. ((MSDC_READ32(MSDC_FIFOCS) & MSDC_FIFOCS_RXCNT) >> 0)
  238. #define MSDC_CARD_DETECTION_ON() MSDC_SET_BIT32(MSDC_PS, MSDC_PS_CDEN)
  239. #define MSDC_CARD_DETECTION_OFF() MSDC_CLR_BIT32(MSDC_PS, MSDC_PS_CDEN)
  240. #define MSDC_DMA_ON() MSDC_CLR_BIT32(MSDC_CFG, MSDC_CFG_PIO)
  241. #define MSDC_DMA_OFF() MSDC_SET_BIT32(MSDC_CFG, MSDC_CFG_PIO)
  242. #define SDC_IS_BUSY() (MSDC_READ32(SDC_STS) & SDC_STS_SDCBUSY)
  243. #define SDC_IS_CMD_BUSY() (MSDC_READ32(SDC_STS) & SDC_STS_CMDBUSY)
  244. #define SDC_SEND_CMD(cmd,arg) \
  245. do { \
  246. MSDC_WRITE32(SDC_ARG, (arg)); \
  247. MSDC_WRITE32(SDC_CMD, (cmd)); \
  248. } while(0)
  249. #define MSDC_INIT_GPD_EX(gpd,extlen,cmd,arg,blknum) \
  250. do { \
  251. ((gpd_t*)gpd)->extlen = extlen; \
  252. ((gpd_t*)gpd)->cmd = cmd; \
  253. ((gpd_t*)gpd)->arg = arg; \
  254. ((gpd_t*)gpd)->blknum = blknum; \
  255. }while(0)
  256. #define MSDC_INIT_BD(bd, blkpad, dwpad, dptr, dlen) \
  257. do { \
  258. BUG_ON(dlen > 0xFFFFFFUL); \
  259. ((bd_t*)bd)->blkpad = blkpad; \
  260. ((bd_t*)bd)->dwpad = dwpad; \
  261. ((bd_t*)bd)->ptr = (void*)dptr; \
  262. ((bd_t*)bd)->buflen = dlen; \
  263. }while(0)
  264. #define MSDC_UNUSED(x) (void)(x)
  265. typedef struct msdc_reg_control {
  266. u32 addr;
  267. u32 mask;
  268. u32 value;
  269. u32 default_value;
  270. int (*restore_func)(int restore);
  271. } MSDC_REG_CONTROL_T;
  272. #ifdef MMC_PROFILING
  273. static inline void msdc_timer_init(void)
  274. {
  275. /* clear. CLR[1]=1, EN[0]=0 */
  276. MSDC_WRITE32(GPT_BASE + 0x30, 0x0);
  277. MSDC_WRITE32(GPT_BASE + 0x30, 0x2);
  278. MSDC_WRITE32(GPT_BASE + 0x38, 0);
  279. MSDC_WRITE32(GPT_BASE + 0x3C, 32768);
  280. /* 32678HZ RTC free run */
  281. MSDC_WRITE32(GPT_BASE + 0x34, 0x30);
  282. MSDC_WRITE32(GPT_BASE + 0x30, 0x32);
  283. }
  284. static inline void msdc_timer_start(void)
  285. {
  286. *(volatile unsigned int*)(GPT_BASE + 0x30) |= (1 << 0);
  287. }
  288. static inline void msdc_timer_stop(void)
  289. {
  290. *(volatile unsigned int*)(GPT_BASE + 0x30) &= ~(1 << 0);
  291. }
  292. static inline void msdc_timer_stop_clear(void)
  293. {
  294. *(volatile unsigned int*)(GPT_BASE + 0x30) &= ~(1 << 0); /* stop */
  295. *(volatile unsigned int*)(GPT_BASE + 0x30) |= (1 << 1); /* clear */
  296. }
  297. static inline unsigned int msdc_timer_get_count(void)
  298. {
  299. return MSDC_READ32(GPT_BASE + 0x38);
  300. }
  301. #else
  302. #define msdc_timer_init() do{}while(0)
  303. #define msdc_timer_start() do{}while(0)
  304. #define msdc_timer_stop() do{}while(0)
  305. #define msdc_timer_stop_clear() do{}while(0)
  306. #define msdc_timer_get_count() 0
  307. #endif
  308. #define MSDC_RELIABLE_WRITE (0x1 << 0)
  309. #define MSDC_PACKED (0x1 << 1)
  310. #define MSDC_TAG_REQUEST (0x1 << 2)
  311. #define MSDC_CONTEXT_ID (0x1 << 3)
  312. #define MSDC_FORCED_PROG (0x1 << 4)
  313. extern void msdc_dump_card_status(u32 card_status);
  314. extern void msdc_dump_ocr_reg(u32 resp);
  315. extern void msdc_dump_rca_resp(u32 resp);
  316. extern void msdc_set_reliable_write(struct mmc_host *host, int on);
  317. extern void msdc_set_autocmd23_feature(struct mmc_host *host, int on);
  318. extern void msdc_set_autocmd(struct mmc_host *host, int cmd, int on);
  319. extern void msdc_set_pio_bits(struct mmc_host *host, int bits);
  320. extern void msdc_clr_fifo(struct mmc_host *host);
  321. extern void msdc_intr_unmask(struct mmc_host *host, u32 bits);
  322. extern void msdc_intr_mask(struct mmc_host *host, u32 bits);
  323. extern int msdc_send_cmd(struct mmc_host *host, struct mmc_command *cmd);
  324. extern int msdc_wait_rsp(struct mmc_host *host, struct mmc_command *cmd);
  325. extern void msdc_abort(struct mmc_host *host);
  326. extern void msdc_irq_deinit(struct mmc_host *host);
  327. extern int msdc_init(int id, struct mmc_host *host, int clksrc, int mode);
  328. extern int msdc_pio_bread(struct mmc_host *host, uchar *dst, ulong src, ulong nblks);
  329. extern int msdc_pio_bwrite(struct mmc_host *host, ulong dst, uchar *src, ulong nblks);
  330. extern int msdc_dma_bread(struct mmc_host *host, uchar *dst, ulong src, ulong nblks);
  331. extern int msdc_dma_bwrite(struct mmc_host *host, ulong dst, uchar *src, ulong nblks);
  332. extern int msdc_tune_bwrite(struct mmc_host *host, ulong dst, uchar *src, ulong nblks);
  333. extern int msdc_tune_bread(struct mmc_host *host, uchar *dst, ulong src, ulong nblks);
  334. extern int msdc_tune_cmdrsp(struct mmc_host *host, struct mmc_command *cmd);
  335. extern void msdc_reset_tune_counter(struct mmc_host *host);
  336. extern int msdc_abort_handler(struct mmc_host *host, int abort_card);
  337. extern int msdc_tune_read(struct mmc_host *host);
  338. extern void msdc_intr_sdio(struct mmc_host *host, int enable);
  339. extern void msdc_intr_sdio_gap(struct mmc_host * host, int enable);
  340. extern void msdc_config_clock(struct mmc_host *host, int ddr, u32 hz, u32 hs_timing);
  341. extern int msdc_cmd_stop(struct mmc_host *host, struct mmc_command *cmd);
  342. extern int msdc_pio_send_sandisk_fwid(struct mmc_host *host,uchar *src);
  343. extern int msdc_pio_get_sandisk_fwid(struct mmc_host * host,uchar * src);
  344. extern int msdc_dma_send_sandisk_fwid(struct mmc_host *host, uchar *buf,u32 opcode, ulong nblks);
  345. extern void msdc_set_startbit(struct mmc_host *host, u8 start_bit);
  346. extern void msdc_set_axi_burst_len(struct mmc_host *host, u8 len);
  347. extern void msdc_set_axi_outstanding(struct mmc_host *host, u8 rw, u8 num);
  348. extern void msdc_enable_dcm(struct mmc_host *host, int on, u8 div1, u8 div2);
  349. extern void msdc_set_blklen(struct mmc_host *host, u32 blklen);
  350. extern void msdc_set_timeout(struct mmc_host *host, u64 ns, u32 clks);
  351. extern int msdc_pio_read(struct mmc_host *host, u32 *ptr, u32 size);
  352. extern void msdc_set_dmode(struct mmc_host *host, int mode);
  353. extern int msdc_tune_rw_hs400(struct mmc_host *host, uchar *dst, ulong src, ulong nblks, unsigned int rw);
  354. extern int msdc_cmd(struct mmc_host *host, struct mmc_command *cmd);
  355. extern void msdc_set_blknum(struct mmc_host *host, u32 blknum);
  356. extern void msdc_config_bus(struct mmc_host *host, u32 width);
  357. extern int msdc_get_dmode(struct mmc_host *host);
  358. extern void msdc_dump_register(struct mmc_host *host);
  359. extern void msdc_emmc_hard_reset(struct mmc_host *host);
  360. #if defined(MMC_MSDC_DRV_CTP) || defined(MMC_MSDC_DRV_LK)
  361. extern void msdc_hard_reset(struct mmc_host *host);
  362. #endif
  363. #if defined(MMC_MSDC_DRV_CTP)
  364. extern int msdc_register_partial_backup_and_reset(struct mmc_host* host);
  365. extern int msdc_register_partial_restore(struct mmc_host* host);
  366. #endif
  367. #if defined(FEATURE_MMC_POWER_ON_WP)
  368. extern int msdc_get_err_from_card_status(struct mmc_host *host);
  369. #endif
  370. #endif /* end of _MSDC_H_ */