msdc_dma.h 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  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) 2015. 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. #ifndef _MSDC_DMA_H_
  32. #define _MSDC_DMA_H_
  33. #include "mmc_core.h"
  34. /*--------------------------------------------------------------------------*/
  35. /* DMA Related Define */
  36. /*--------------------------------------------------------------------------*/
  37. #if defined(MMC_MSDC_DRV_CTP)
  38. #define MAX_GPD_POOL_SZ (512)
  39. #define MAX_BD_POOL_SZ (1024)
  40. #else
  41. #define MAX_GPD_POOL_SZ (2) /* include null gpd */
  42. #define MAX_BD_POOL_SZ (4)
  43. #endif
  44. #define MAX_DMA_CNT (8*1024*1024)
  45. #define MAX_SG_POOL_SZ (MAX_BD_POOL_SZ)
  46. #define MAX_SG_BUF_SZ (MAX_DMA_CNT)
  47. #define MAX_BD_PER_GPD (MAX_BD_POOL_SZ) /* only one gpd for all bd */
  48. #define MAX_DMA_TRAN_SIZE ((u64)MAX_SG_POOL_SZ*MAX_SG_BUF_SZ)
  49. #if MAX_SG_BUF_SZ > MAX_DMA_CNT
  50. #error "incorrect max sg buffer size"
  51. #endif
  52. /*--------------------------------------------------------------------------*/
  53. /* Descriptor Structure */
  54. /*--------------------------------------------------------------------------*/
  55. typedef struct {
  56. uint32 hwo:1; /* could be changed by hw */
  57. uint32 bdp:1;
  58. uint32 rsv0:6;
  59. uint32 chksum:8;
  60. uint32 intr:1;
  61. uint32 rsv1:7;
  62. uint32 nexth4:4;
  63. uint32 ptrh4:4;
  64. void *next;
  65. void *ptr;
  66. uint32 buflen:24;
  67. uint32 extlen:8;
  68. uint32 arg;
  69. uint32 blknum;
  70. uint32 cmd;
  71. } gpd_t;
  72. typedef struct {
  73. uint32 eol:1;
  74. uint32 rsv0:7;
  75. uint32 chksum:8;
  76. uint32 rsv1:1;
  77. uint32 blkpad:1;
  78. uint32 dwpad:1;
  79. uint32 rsv2:5;
  80. uint32 nexth4:4;
  81. uint32 ptrh4:4;
  82. void *next;
  83. void *ptr;
  84. uint32 buflen:24;
  85. uint32 rsv3:8;
  86. } bd_t;
  87. struct scatterlist {
  88. u32 addr;
  89. u32 len;
  90. };
  91. struct scatterlist_ex {
  92. u32 cmd;
  93. u32 arg;
  94. u32 sglen;
  95. struct scatterlist *sg;
  96. };
  97. struct dma_config {
  98. u32 flags; /* flags */
  99. u64 xfersz; /* xfer size in bytes */
  100. u32 sglen; /* size of scatter list */
  101. u32 blklen; /* block size */
  102. struct scatterlist *sg; /* I/O scatter list */
  103. struct scatterlist_ex *esg; /* extended I/O scatter list */
  104. u8 mode; /* dma mode */
  105. u8 burstsz; /* burst size */
  106. u8 intr; /* dma done interrupt */
  107. u8 padding; /* padding */
  108. u32 cmd; /* enhanced mode command */
  109. u32 arg; /* enhanced mode arg */
  110. u32 rsp; /* enhanced mode command response */
  111. u32 autorsp; /* auto command response */
  112. u8 inboot; /* this flag is for Basic DMA in eMMC boot mode*/
  113. };
  114. void msdc_init_gpd_bd(struct mmc_host *host);
  115. void msdc_flush_membuf(void *buf, u32 len);
  116. u8 msdc_cal_checksum(u8 *buf, u32 len);
  117. gpd_t *msdc_alloc_gpd(struct mmc_host *host, int num);
  118. bd_t *msdc_alloc_bd(struct mmc_host *host, int num);
  119. void msdc_queue_bd(struct mmc_host *host, gpd_t *gpd, bd_t *bd);
  120. void msdc_queue_buf(struct mmc_host *host, gpd_t *gpd, u8 *buf);
  121. void msdc_add_gpd(struct mmc_host *host, gpd_t *gpd, int num);
  122. void msdc_reset_gpd(struct mmc_host *host);
  123. void msdc_set_dma(struct mmc_host *host, u8 burstsz, u32 flags);
  124. int msdc_sg_init(struct scatterlist *sg, void *buf, u64 buflen);
  125. void msdc_dma_init(struct mmc_host *host, struct dma_config *cfg, void *buf, u64 buflen);
  126. int msdc_dma_cmd(struct mmc_host *host, struct dma_config *cfg, struct mmc_command *cmd);
  127. int msdc_dma_config(struct mmc_host *host, struct dma_config *cfg);
  128. void msdc_dma_resume(struct mmc_host *host);
  129. void msdc_dma_start(struct mmc_host *host);
  130. void msdc_dma_stop(struct mmc_host *host);
  131. int msdc_dma_wait_done(struct mmc_host *host, u32 timeout);
  132. #if defined(FEATURE_MMC_SDIO)
  133. int msdc_dma_iorw(struct mmc_card *card, int write, unsigned fn,
  134. unsigned addr, int incr_addr, u8 *buf, unsigned blocks, unsigned blksz);
  135. #endif
  136. //int msdc_dma_transfer(struct mmc_host *host, struct mmc_command *cmd, uchar *buf, ulong nblks);
  137. int msdc_dma_transfer(struct mmc_host *host, struct mmc_command *cmd, struct mmc_data *data);
  138. int msdc_dma_bread(struct mmc_host *host, uchar *dst, ulong src, ulong nblks);
  139. int msdc_dma_bwrite(struct mmc_host *host, ulong dst, uchar *src, ulong nblks);
  140. #endif //ifndef _MSDC_DMA_H_