msdc_dma.h 6.2 KB

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