mt_mu3d_hal_qmu_drv.h 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. /*
  2. * Copyright (c) 2013 MediaTek Inc.
  3. *
  4. * Permission is hereby granted, free of charge, to any person obtaining
  5. * a copy of this software and associated documentation files
  6. * (the "Software"), to deal in the Software without restriction,
  7. * including without limitation the rights to use, copy, modify, merge,
  8. * publish, distribute, sublicense, and/or sell copies of the Software,
  9. * and to permit persons to whom the Software is furnished to do so,
  10. * subject to the following conditions:
  11. *
  12. * The above copyright notice and this permission notice shall be
  13. * included in all copies or substantial portions of the Software.
  14. *
  15. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  16. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  17. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
  18. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
  19. * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  20. * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  21. * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  22. */
  23. #ifndef MTK_QMU_H
  24. #define MTK_QMU_H
  25. struct tgpd {
  26. u8 flag;
  27. u8 chksum;
  28. u16 databuf_len; /*Rx Allow Length*/
  29. struct tgpd *pnext;
  30. u8 *pBuf;
  31. u16 bufLen;
  32. u8 ExtLength;
  33. u8 ZTepFlag;
  34. };
  35. struct tbd {
  36. u8 flag;
  37. u8 chksum;
  38. u16 databuf_len; /* Rx Allow Length */
  39. struct tbd *pnext;
  40. u8 *pBuf;
  41. u16 bufLen;
  42. u8 extLen;
  43. u8 reserved;
  44. };
  45. struct gpd_range {
  46. struct tbd *pnext;
  47. struct tbd *pstart;
  48. struct tbd *pend;
  49. };
  50. #define AT_GPD_EXT_LEN 256
  51. #define AT_BD_EXT_LEN 256
  52. //#define MAX_GPD_NUM 30 /* we've got problem when gpd is larger */
  53. #define MAX_GPD_NUM 4
  54. //#define MAX_BD_NUM 500
  55. #define MAX_BD_NUM 3
  56. #define STRESS_IOC_TH 8
  57. #define STRESS_GPD_TH 24
  58. #define RANDOM_STOP_DELAY 80
  59. #define STRESS_DATA_LENGTH 1024*64 //1024*16
  60. #define NO_ZLP 0
  61. #define HW_MODE 1
  62. #define GPD_MODE 2
  63. #define TXZLP GPD_MODE
  64. //#define MAX_QMU_EP 4
  65. #define MAX_QMU_EP 1
  66. #define TGPD_FLAGS_HWO 0x01
  67. #define TGPD_IS_FLAGS_HWO(_pd) (((struct tgpd *)_pd)->flag & TGPD_FLAGS_HWO)
  68. #define TGPD_SET_FLAGS_HWO(_pd) (((struct tgpd *)_pd)->flag |= TGPD_FLAGS_HWO)
  69. #define TGPD_CLR_FLAGS_HWO(_pd) (((struct tgpd *)_pd)->flag &= (~TGPD_FLAGS_HWO))
  70. #define TGPD_FORMAT_BDP 0x02
  71. #define TGPD_IS_FORMAT_BDP(_pd) (((struct tgpd *)_pd)->flag & TGPD_FORMAT_BDP)
  72. #define TGPD_SET_FORMAT_BDP(_pd) (((struct tgpd *)_pd)->flag |= TGPD_FORMAT_BDP)
  73. #define TGPD_CLR_FORMAT_BDP(_pd) (((struct tgpd *)_pd)->flag &= (~TGPD_FORMAT_BDP))
  74. #define TGPD_FORMAT_BPS 0x04
  75. #define TGPD_IS_FORMAT_BPS(_pd) (((struct tgpd *)_pd)->flag & TGPD_FORMAT_BPS)
  76. #define TGPD_SET_FORMAT_BPS(_pd) (((struct tgpd *)_pd)->flag |= TGPD_FORMAT_BPS)
  77. #define TGPD_CLR_FORMAT_BPS(_pd) (((struct tgpd *)_pd)->flag &= (~TGPD_FORMAT_BPS))
  78. #define TGPD_SET_FLAG(_pd, _flag) ((struct tgpd *)_pd)->flag = (((struct tgpd *)_pd)->flag&(~TGPD_FLAGS_HWO))|(_flag)
  79. #define TGPD_GET_FLAG(_pd) (((struct tgpd *)_pd)->flag & TGPD_FLAGS_HWO)
  80. #define TGPD_SET_CHKSUM(_pd, _n) ((struct tgpd *)_pd)->chksum = mu3d_hal_cal_checksum((u8 *)_pd, _n)-1
  81. #define TGPD_SET_CHKSUM_HWO(_pd, _n) ((struct tgpd *)_pd)->chksum = mu3d_hal_cal_checksum((u8 *)_pd, _n)-1
  82. #define TGPD_GET_CHKSUM(_pd) ((struct tgpd *)_pd)->chksum
  83. #define TGPD_SET_FORMAT(_pd, _fmt) ((struct tgpd *)_pd)->flag = (((struct tgpd *)_pd)->flag&(~TGPD_FORMAT_BDP))|(_fmt)
  84. #define TGPD_GET_FORMAT(_pd) ((((struct tgpd *)_pd)->flag & TGPD_FORMAT_BDP)>>1)
  85. #define TGPD_SET_DATABUF_LEN(_pd, _len) ((struct tgpd *)_pd)->databuf_len = _len
  86. #define TGPD_ADD_DATABUF_LEN(_pd, _len) ((struct tgpd *)_pd)->databuf_len += _len
  87. #define TGPD_GET_DATABUF_LEN(_pd) ((struct tgpd *)_pd)->databuf_len
  88. #define TGPD_SET_NEXT(_pd, _next) ((struct tgpd *)_pd)->pnext = (struct tgpd *)_next;
  89. #define TGPD_GET_NEXT(_pd) (struct tgpd *)((struct tgpd *)_pd)->pnext
  90. #define TGPD_SET_TBD(_pd, _tbd) ((struct tgpd *)_pd)->pBuf = (u8 *)_tbd;\
  91. TGPD_SET_FORMAT_BDP(_pd)
  92. #define TGPD_GET_TBD(_pd) (struct tbd *)((struct tgpd *)_pd)->pBuf
  93. #define TGPD_SET_DATA(_pd, _data) ((struct tgpd *)_pd)->pBuf = (u8 *)_data
  94. #define TGPD_GET_DATA(_pd) (u8*)((struct tgpd *)_pd)->pBuf
  95. #define TGPD_SET_BUF_LEN(_pd, _len) ((struct tgpd *)_pd)->bufLen = _len
  96. #define TGPD_ADD_BUF_LEN(_pd, _len) ((struct tgpd *)_pd)->bufLen += _len
  97. #define TGPD_GET_BUF_LEN(_pd) ((struct tgpd *)_pd)->bufLen
  98. #define TGPD_SET_EXT_LEN(_pd, _len) ((struct tgpd *)_pd)->ExtLength = _len
  99. #define TGPD_GET_EXT_LEN(_pd) ((struct tgpd *)_pd)->ExtLength
  100. #define TGPD_SET_EPaddr(_pd, _EP) ((struct tgpd *)_pd)->ZTepFlag =(((struct tgpd *)_pd)->ZTepFlag&0xF0)|(_EP)
  101. #define TGPD_GET_EPaddr(_pd) ((struct tgpd *)_pd)->ZTepFlag & 0x0F
  102. #define TGPD_FORMAT_TGL 0x10
  103. #define TGPD_IS_FORMAT_TGL(_pd) (((struct tgpd *)_pd)->ZTepFlag & TGPD_FORMAT_TGL)
  104. #define TGPD_SET_FORMAT_TGL(_pd) (((struct tgpd *)_pd)->ZTepFlag |=TGPD_FORMAT_TGL)
  105. #define TGPD_CLR_FORMAT_TGL(_pd) (((struct tgpd *)_pd)->ZTepFlag &= (~TGPD_FORMAT_TGL))
  106. #define TGPD_FORMAT_ZLP 0x20
  107. #define TGPD_IS_FORMAT_ZLP(_pd) (((struct tgpd *)_pd)->ZTepFlag & TGPD_FORMAT_ZLP)
  108. #define TGPD_SET_FORMAT_ZLP(_pd) (((struct tgpd *)_pd)->ZTepFlag |=TGPD_FORMAT_ZLP)
  109. #define TGPD_CLR_FORMAT_ZLP(_pd) (((struct tgpd *)_pd)->ZTepFlag &= (~TGPD_FORMAT_ZLP))
  110. #define TGPD_FORMAT_IOC 0x80
  111. #define TGPD_IS_FORMAT_IOC(_pd) (((struct tgpd *)_pd)->flag & TGPD_FORMAT_IOC)
  112. #define TGPD_SET_FORMAT_IOC(_pd) (((struct tgpd *)_pd)->flag |=TGPD_FORMAT_IOC)
  113. #define TGPD_CLR_FORMAT_IOC(_pd) (((struct tgpd *)_pd)->flag &= (~TGPD_FORMAT_IOC))
  114. #define TGPD_SET_TGL(_pd, _TGL) ((struct tgpd *)_pd)->ZTepFlag |=(( _TGL) ? 0x10: 0x00)
  115. #define TGPD_GET_TGL(_pd) ((struct tgpd *)_pd)->ZTepFlag & 0x10 ? 1:0
  116. #define TGPD_SET_ZLP(_pd, _ZLP) ((struct tgpd *)_pd)->ZTepFlag |= ((_ZLP) ? 0x20: 0x00)
  117. #define TGPD_GET_ZLP(_pd) ((struct tgpd *)_pd)->ZTepFlag & 0x20 ? 1:0
  118. #define TGPD_GET_EXT(_pd) ((u8 *)_pd + sizeof(struct tgpd))
  119. #define TBD_FLAGS_EOL 0x01
  120. #define TBD_IS_FLAGS_EOL(_bd) (((struct tbd *)_bd)->flag & TBD_FLAGS_EOL)
  121. #define TBD_SET_FLAGS_EOL(_bd) (((struct tbd *)_bd)->flag |= TBD_FLAGS_EOL)
  122. #define TBD_CLR_FLAGS_EOL(_bd) (((struct tbd *)_bd)->flag &= (~TBD_FLAGS_EOL))
  123. #define TBD_SET_FLAG(_bd, _flag) ((struct tbd *)_bd)->flag = (u8)_flag
  124. #define TBD_GET_FLAG(_bd) ((struct tbd *)_bd)->flag
  125. #define TBD_SET_CHKSUM(_pd, _n) ((struct tbd *)_pd)->chksum = mu3d_hal_cal_checksum((u8 *)_pd, _n)
  126. #define TBD_GET_CHKSUM(_pd) ((struct tbd *)_pd)->chksum
  127. #define TBD_SET_DATABUF_LEN(_pd, _len) ((struct tbd *)_pd)->databuf_len = _len
  128. #define TBD_GET_DATABUF_LEN(_pd) ((struct tbd *)_pd)->databuf_len
  129. #define TBD_SET_NEXT(_bd, _next) ((struct tbd *)_bd)->pnext = (struct tbd *)_next
  130. #define TBD_GET_NEXT(_bd) (struct tbd *)((struct tbd *)_bd)->pnext
  131. #define TBD_SET_DATA(_bd, _data) ((struct tbd *)_bd)->pBuf = (u8 *)_data
  132. #define TBD_GET_DATA(_bd) (u8*)((struct tbd *)_bd)->pBuf
  133. #define TBD_SET_BUF_LEN(_bd, _len) ((struct tbd *)_bd)->bufLen = _len
  134. #define TBD_ADD_BUF_LEN(_bd, _len) ((struct tbd *)_bd)->bufLen += _len
  135. #define TBD_GET_BUF_LEN(_bd) ((struct tbd *)_bd)->bufLen
  136. #define TBD_SET_EXT_LEN(_bd, _len) ((struct tbd *)_bd)->extLen = _len
  137. #define TBD_ADD_EXT_LEN(_bd, _len) ((struct tbd *)_bd)->extLen += _len
  138. #define TBD_GET_EXT_LEN(_bd) ((struct tbd *)_bd)->extLen
  139. #define TBD_GET_EXT(_bd) ((u8 *)_bd + sizeof(struct tbd))
  140. #ifdef MTK_QMU_DRV_EXT
  141. #define EXTERN
  142. #else
  143. #define EXTERN extern
  144. #endif
  145. #if 0
  146. EXTERN u8 is_bdp;
  147. EXTERN u32 gpd_buf_size;
  148. EXTERN u16 bd_buf_size;
  149. EXTERN u8 bd_extension;
  150. EXTERN u8 gpd_extension;
  151. EXTERN u32 g_dma_buffer_size;
  152. EXTERN struct tgpd *rx_gpd_head[15];
  153. EXTERN struct tgpd *tx_gpd_head[15];
  154. EXTERN struct tgpd *rx_gpd_end[15];
  155. EXTERN struct tgpd *tx_gpd_end[15];
  156. EXTERN struct tgpd *rx_gpd_last[15];
  157. EXTERN struct tgpd *tx_gpd_last[15];
  158. EXTERN struct gpd_range rx_gpd_list[15];
  159. EXTERN struct gpd_range tx_gpd_list[15];
  160. EXTERN struct gpd_range rx_bd_list[15];
  161. EXTERN struct gpd_range tx_bd_list[15];
  162. EXTERN u32 rx_gpd_offset[15];
  163. EXTERN u32 tx_gpd_offset[15];
  164. EXTERN u32 rx_bd_offset[15];
  165. EXTERN u32 tx_bd_offset[15];
  166. #else
  167. u8 is_bdp;
  168. u32 gpd_buf_size;
  169. u16 bd_buf_size;
  170. u8 bd_extension;
  171. u8 gpd_extension;
  172. u32 g_dma_buffer_size;
  173. struct tgpd *rx_gpd_head[15];
  174. struct tgpd *tx_gpd_head[15];
  175. struct tgpd *rx_gpd_end[15];
  176. struct tgpd *tx_gpd_end[15];
  177. struct tgpd *rx_gpd_last[15];
  178. struct tgpd *tx_gpd_last[15];
  179. struct gpd_range rx_gpd_list[15] __attribute__((aligned(64)));
  180. struct gpd_range tx_gpd_list[15] __attribute__((aligned(64)));
  181. struct gpd_range rx_bd_list[15] __attribute__((aligned(64)));
  182. struct gpd_range tx_bd_list[15] __attribute__((aligned(64)));
  183. u32 rx_gpd_offset[15];
  184. u32 tx_gpd_offset[15];
  185. u32 rx_bd_offset[15];
  186. u32 tx_bd_offset[15];
  187. #endif
  188. EXTERN void mu3d_hal_resume_qmu(int q_ep_num, u8 dir);
  189. EXTERN void mu3d_hal_stop_qmu(int q_ep_num, u8 dir);
  190. EXTERN struct tgpd* mu3d_hal_prepare_tx_gpd(struct tgpd* gpd, u8 *pBuf, u32 data_length, u8 ep_num, u8 _is_bdp, u8 isHWO,u8 ioc, u8 bps,u8 zlp);
  191. EXTERN struct tgpd* mu3d_hal_prepare_rx_gpd(struct tgpd* gpd, u8 *pBuf, u32 data_len, u8 ep_num, u8 _is_bdp, u8 isHWO, u8 ioc, u8 bps,u32 c_maxpktsz);
  192. EXTERN void mu3d_hal_insert_transfer_gpd(int ep_num,u8 dir, u8 *buf, u32 count, u8 isHWO, u8 ioc, u8 bps,u8 zlp, u32 c_maxpktsz);
  193. EXTERN void mu3d_hal_alloc_qmu_mem(void);
  194. EXTERN void mu3d_hal_init_qmu(void);
  195. EXTERN void mu3d_hal_start_qmu(int q_ep_num, u8 dir);
  196. EXTERN void mu3d_hal_flush_qmu(int q_ep_num, u8 dir);
  197. EXTERN void mu3d_hal_restart_qmu(int q_ep_num, u8 dir);
  198. EXTERN void mu3d_hal_reset_qmu_ep(int q_ep_num, u8 dir);
  199. EXTERN void mu3d_hal_send_stall(int q_ep_num, u8 dir);
  200. EXTERN u8 mu3d_hal_cal_checksum(u8 *data, int len);
  201. EXTERN void *mu3d_hal_gpd_virt_to_phys(void *vaddr, u8 dir, u32 num);
  202. #endif