mu3d_hal_qmu_drv.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. #ifndef MTK_QMU_H
  2. #define MTK_QMU_H
  3. #include "mu3d_hal_osal.h"
  4. #include "mu3d_hal_hw.h"
  5. #include "mu3d_hal_comm.h"
  6. #include "mu3d_hal_usb_drv.h"
  7. #include <linux/platform_device.h>
  8. typedef struct _TGPD {
  9. DEV_UINT8 flag;
  10. DEV_UINT8 chksum;
  11. DEV_UINT16 DataBufferLen; /*Rx Allow Length */
  12. #ifdef CONFIG_ARM64
  13. DEV_UINT32 pNext;
  14. DEV_UINT32 pBuf;
  15. #else
  16. struct _TGPD *pNext;
  17. DEV_UINT8 *pBuf;
  18. #endif
  19. DEV_UINT16 bufLen;
  20. DEV_UINT8 ExtLength;
  21. DEV_UINT8 ZTepFlag;
  22. /*} __attribute__ ((packed, aligned(4))) TGPD, *PGPD;*/
  23. } __packed __aligned(4)TGPD, *PGPD;
  24. typedef struct _TBD {
  25. DEV_UINT8 flag;
  26. DEV_UINT8 chksum;
  27. DEV_UINT16 DataBufferLen; /*Rx Allow Length */
  28. #ifdef CONFIG_ARM64
  29. DEV_UINT32 pNext;
  30. DEV_UINT32 pBuf;
  31. #else
  32. struct _TBD *pNext;
  33. DEV_UINT8 *pBuf;
  34. #endif
  35. DEV_UINT16 bufLen;
  36. DEV_UINT8 extLen;
  37. DEV_UINT8 reserved;
  38. /*} __attribute__ ((packed, aligned(4))) TBD, *PBD;*/
  39. } __packed __aligned(4) TBD, *PBD;
  40. typedef struct _GPD_RANGE {
  41. PGPD pNext;
  42. PGPD pStart;
  43. PGPD pEnd;
  44. } GPD_R, *RGPD;
  45. typedef struct _BD_RANGE {
  46. PBD pNext;
  47. PBD pStart;
  48. PBD pEnd;
  49. } BD_R, *RBD;
  50. struct qmu_desc_map {
  51. void *p_desc;
  52. dma_addr_t p_desc_dma;
  53. };
  54. /*
  55. * http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0464d/BABCFDAH.html
  56. * CA7 , CA15
  57. * The L1 data memory system has the following features:
  58. * data side cache line length of 64-bytes
  59. */
  60. #define CACHE_LINE_SIZE 64
  61. #ifdef CACHE_LINE_SIZE
  62. /*
  63. * The min size of GPD must align cache line size.
  64. * So using GPD_EXT_LEN as the dummy space.
  65. */
  66. #define AT_GPD_EXT_LEN (CACHE_LINE_SIZE-16)
  67. #else
  68. #define AT_GPD_EXT_LEN 0
  69. #endif
  70. #define AT_BD_EXT_LEN 0
  71. #define MAX_GPD_NUM 32
  72. #define MAX_BD_NUM 0
  73. /* DVT+ */
  74. #define STRESS_IOC_TH 8
  75. #define STRESS_GPD_TH 24
  76. #define RANDOM_STOP_DELAY 80
  77. #ifdef CONFIG_USBIF_COMPLIANCE
  78. #define STRESS_DATA_LENGTH 1024
  79. #else
  80. #define STRESS_DATA_LENGTH (1024*64) /* 1024*16 */
  81. #endif
  82. /* DVT- */
  83. #define GPD_BUF_SIZE 65532
  84. #define BD_BUF_SIZE 32768 /* set to half of 64K of max size */
  85. #define IS_BDP 1
  86. #define MAX_QMU_EP MAX_EP_NUM /*The better way is to read U3D_CAP_EPINFO */
  87. #define TGPD_FLAGS_HWO 0x01
  88. #define TGPD_IS_FLAGS_HWO(_pd) (((TGPD *)_pd)->flag & TGPD_FLAGS_HWO)
  89. #define TGPD_SET_FLAGS_HWO(_pd) (((TGPD *)_pd)->flag |= TGPD_FLAGS_HWO)
  90. #define TGPD_CLR_FLAGS_HWO(_pd) (((TGPD *)_pd)->flag &= (~TGPD_FLAGS_HWO))
  91. #define TGPD_FORMAT_BDP 0x02
  92. #define TGPD_IS_FORMAT_BDP(_pd) (((TGPD *)_pd)->flag & TGPD_FORMAT_BDP)
  93. #define TGPD_SET_FORMAT_BDP(_pd) (((TGPD *)_pd)->flag |= TGPD_FORMAT_BDP)
  94. #define TGPD_CLR_FORMAT_BDP(_pd) (((TGPD *)_pd)->flag &= (~TGPD_FORMAT_BDP))
  95. #define TGPD_FORMAT_BPS 0x04
  96. #define TGPD_IS_FORMAT_BPS(_pd) (((TGPD *)_pd)->flag & TGPD_FORMAT_BPS)
  97. #define TGPD_SET_FORMAT_BPS(_pd) (((TGPD *)_pd)->flag |= TGPD_FORMAT_BPS)
  98. #define TGPD_CLR_FORMAT_BPS(_pd) (((TGPD *)_pd)->flag &= (~TGPD_FORMAT_BPS))
  99. #define TGPD_SET_FLAG(_pd, _flag) (((TGPD *)_pd)->flag = (((TGPD *)_pd)->flag&(~TGPD_FLAGS_HWO))|(_flag))
  100. #define TGPD_GET_FLAG(_pd) ((((TGPD *)_pd)->flag & TGPD_FLAGS_HWO))
  101. #define TGPD_SET_CHKSUM(_pd, _n) (((TGPD *)_pd)->chksum = mu3d_hal_cal_checksum((DEV_UINT8 *)_pd, _n)-1)
  102. #define TGPD_SET_CHKSUM_HWO(_pd, _n) (((TGPD *)_pd)->chksum = mu3d_hal_cal_checksum((DEV_UINT8 *)_pd, _n)-1)
  103. #define TGPD_GET_CHKSUM(_pd) (((TGPD *)_pd)->chksum)
  104. #define TGPD_SET_FORMAT(_pd, _fmt) (((TGPD *)_pd)->flag = (((TGPD *)_pd)->flag&(~TGPD_FORMAT_BDP))|(_fmt))
  105. #define TGPD_GET_FORMAT(_pd) ((((TGPD *)_pd)->flag & TGPD_FORMAT_BDP)>>1)
  106. #define TGPD_SET_DataBUF_LEN(_pd, _len) (((TGPD *)_pd)->DataBufferLen = _len)
  107. #define TGPD_ADD_DataBUF_LEN(_pd, _len) (((TGPD *)_pd)->DataBufferLen += _len)
  108. #define TGPD_GET_DataBUF_LEN(_pd) (((TGPD *)_pd)->DataBufferLen)
  109. #ifdef CONFIG_ARM64
  110. #define TGPD_SET_NEXT(_pd, _next) (((TGPD *)_pd)->pNext = (u32)_next)
  111. #define TGPD_GET_NEXT(_pd) ((TGPD *)(uintptr_t)((TGPD *)_pd)->pNext)
  112. #define TGPD_SET_TBD(_pd, _tbd) (((TGPD *)_pd)->pBuf = (u32)_tbd; TGPD_SET_FORMAT_BDP(_pd))
  113. #define TGPD_GET_TBD(_pd) ((TBD *)(uintptr_t)((TGPD *)_pd)->pBuf)
  114. #define TGPD_SET_DATA(_pd, _data) (((TGPD *)_pd)->pBuf = (u32)_data)
  115. #define TGPD_GET_DATA(_pd) ((DEV_UINT8 *)(uintptr_t)((TGPD *)_pd)->pBuf)
  116. #else
  117. #define TGPD_SET_NEXT(_pd, _next) (((TGPD *)_pd)->pNext = (TGPD *)_next)
  118. #define TGPD_GET_NEXT(_pd) ((TGPD *)((TGPD *)_pd)->pNext)
  119. #define TGPD_SET_TBD(_pd, _tbd) (((TGPD *)_pd)->pBuf = (DEV_UINT8 *)_tbd; TGPD_SET_FORMAT_BDP(_pd))
  120. #define TGPD_GET_TBD(_pd) ((TBD *)((TGPD *)_pd)->pBuf)
  121. #define TGPD_SET_DATA(_pd, _data) (((TGPD *)_pd)->pBuf = (DEV_UINT8 *)_data)
  122. #define TGPD_GET_DATA(_pd) ((DEV_UINT8 *)((TGPD *)_pd)->pBuf)
  123. #endif
  124. #define TGPD_SET_BUF_LEN(_pd, _len) (((TGPD *)_pd)->bufLen = _len)
  125. #define TGPD_ADD_BUF_LEN(_pd, _len) (((TGPD *)_pd)->bufLen += _len)
  126. #define TGPD_GET_BUF_LEN(_pd) (((TGPD *)_pd)->bufLen)
  127. #define TGPD_SET_EXT_LEN(_pd, _len) (((TGPD *)_pd)->ExtLength = _len)
  128. #define TGPD_GET_EXT_LEN(_pd) (((TGPD *)_pd)->ExtLength)
  129. #define TGPD_SET_EPaddr(_pd, _EP) (((TGPD *)_pd)->ZTepFlag = (((TGPD *)_pd)->ZTepFlag&0xF0)|(_EP))
  130. #define TGPD_GET_EPaddr(_pd) (((TGPD *)_pd)->ZTepFlag & 0x0F)
  131. #define TGPD_FORMAT_TGL 0x10
  132. #define TGPD_IS_FORMAT_TGL(_pd) (((TGPD *)_pd)->ZTepFlag & TGPD_FORMAT_TGL)
  133. #define TGPD_SET_FORMAT_TGL(_pd) (((TGPD *)_pd)->ZTepFlag |= TGPD_FORMAT_TGL)
  134. #define TGPD_CLR_FORMAT_TGL(_pd) (((TGPD *)_pd)->ZTepFlag &= (~TGPD_FORMAT_TGL))
  135. #define TGPD_FORMAT_ZLP 0x20
  136. #define TGPD_IS_FORMAT_ZLP(_pd) (((TGPD *)_pd)->ZTepFlag & TGPD_FORMAT_ZLP)
  137. #define TGPD_SET_FORMAT_ZLP(_pd) (((TGPD *)_pd)->ZTepFlag |= TGPD_FORMAT_ZLP)
  138. #define TGPD_CLR_FORMAT_ZLP(_pd) (((TGPD *)_pd)->ZTepFlag &= (~TGPD_FORMAT_ZLP))
  139. #define TGPD_FORMAT_IOC 0x80
  140. #define TGPD_IS_FORMAT_IOC(_pd) (((TGPD *)_pd)->flag & TGPD_FORMAT_IOC)
  141. #define TGPD_SET_FORMAT_IOC(_pd) (((TGPD *)_pd)->flag |= TGPD_FORMAT_IOC)
  142. #define TGPD_CLR_FORMAT_IOC(_pd) (((TGPD *)_pd)->flag &= (~TGPD_FORMAT_IOC))
  143. #define TGPD_SET_TGL(_pd, _TGL) (((TGPD *)_pd)->ZTepFlag |= ((_TGL) ? 0x10 : 0x00))
  144. #define TGPD_GET_TGL(_pd) (((TGPD *)_pd)->ZTepFlag & 0x10 ? 1:0)
  145. #define TGPD_SET_ZLP(_pd, _ZLP) (((TGPD *)_pd)->ZTepFlag |= ((_ZLP) ? 0x20 : 0x00))
  146. #define TGPD_GET_ZLP(_pd) (((TGPD *)_pd)->ZTepFlag & 0x20 ? 1:0)
  147. #define TGPD_GET_EXT(_pd) ((DEV_UINT8 *)_pd + sizeof(TGPD))
  148. #define TBD_FLAGS_EOL 0x01
  149. #define TBD_IS_FLAGS_EOL(_bd) (((TBD *)_bd)->flag & TBD_FLAGS_EOL)
  150. #define TBD_SET_FLAGS_EOL(_bd) (((TBD *)_bd)->flag |= TBD_FLAGS_EOL)
  151. #define TBD_CLR_FLAGS_EOL(_bd) (((TBD *)_bd)->flag &= (~TBD_FLAGS_EOL))
  152. #define TBD_SET_FLAG(_bd, _flag) (((TBD *)_bd)->flag = (DEV_UINT8)_flag)
  153. #define TBD_GET_FLAG(_bd) (((TBD *)_bd)->flag)
  154. #define TBD_SET_CHKSUM(_pd, _n) (((TBD *)_pd)->chksum = mu3d_hal_cal_checksum((DEV_UINT8 *)_pd, _n))
  155. #define TBD_GET_CHKSUM(_pd) (((TBD *)_pd)->chksum)
  156. #define TBD_SET_DataBUF_LEN(_pd, _len) (((TBD *)_pd)->DataBufferLen = _len)
  157. #define TBD_GET_DataBUF_LEN(_pd) (((TBD *)_pd)->DataBufferLen)
  158. #ifdef CONFIG_ARM64
  159. #define TBD_SET_NEXT(_bd, _next) (((TBD *)_bd)->pNext = (u32)_next)
  160. #define TBD_GET_NEXT(_bd) ((TBD *)(uintptr_t)((TBD *)_bd)->pNext)
  161. #define TBD_SET_DATA(_bd, _data) (((TBD *)_bd)->pBuf = (u32)_data)
  162. #define TBD_GET_DATA(_bd) ((DEV_UINT8 *)(uintptr_t)((TBD *)_bd)->pBuf)
  163. #else
  164. #define TBD_SET_NEXT(_bd, _next) (((TBD *)_bd)->pNext = (TBD *)_next)
  165. #define TBD_GET_NEXT(_bd) ((TBD *)((TBD *)_bd)->pNext)
  166. #define TBD_SET_DATA(_bd, _data) (((TBD *)_bd)->pBuf = (DEV_UINT8 *)_data)
  167. #define TBD_GET_DATA(_bd) ((DEV_UINT8 *)((TBD *)_bd)->pBuf)
  168. #endif
  169. #define TBD_SET_BUF_LEN(_bd, _len) (((TBD *)_bd)->bufLen = _len)
  170. #define TBD_ADD_BUF_LEN(_bd, _len) (((TBD *)_bd)->bufLen += _len)
  171. #define TBD_GET_BUF_LEN(_bd) (((TBD *)_bd)->bufLen)
  172. #define TBD_SET_EXT_LEN(_bd, _len) (((TBD *)_bd)->extLen = _len)
  173. #define TBD_ADD_EXT_LEN(_bd, _len) (((TBD *)_bd)->extLen += _len)
  174. #define TBD_GET_EXT_LEN(_bd) (((TBD *)_bd)->extLen)
  175. #define TBD_GET_EXT(_bd) (((DEV_UINT8 *)_bd + sizeof(TBD)))
  176. #undef EXTERN
  177. #ifdef _MTK_QMU_DRV_EXT_
  178. #define EXTERN
  179. #else
  180. #define EXTERN \
  181. extern
  182. #endif
  183. EXTERN DEV_UINT8 is_bdp;
  184. /* DVT+ */
  185. EXTERN DEV_UINT32 gpd_buf_size;
  186. EXTERN DEV_UINT16 bd_buf_size;
  187. EXTERN DEV_UINT8 bBD_Extension;
  188. EXTERN DEV_UINT8 bGPD_Extension;
  189. EXTERN DEV_UINT32 g_dma_buffer_size;
  190. /* DVT+ */
  191. EXTERN PGPD Rx_gpd_head[15];
  192. EXTERN PGPD Tx_gpd_head[15];
  193. EXTERN PGPD Rx_gpd_end[15];
  194. EXTERN PGPD Tx_gpd_end[15];
  195. EXTERN PGPD Rx_gpd_last[15];
  196. EXTERN PGPD Tx_gpd_last[15];
  197. EXTERN GPD_R Rx_gpd_List[15];
  198. EXTERN GPD_R Tx_gpd_List[15];
  199. EXTERN BD_R Rx_bd_List[15];
  200. EXTERN BD_R Tx_bd_List[15];
  201. EXTERN struct qmu_desc_map rx_gpd_map[15];
  202. EXTERN struct qmu_desc_map tx_gpd_map[15];
  203. EXTERN struct qmu_desc_map rx_bd_map[15];
  204. EXTERN struct qmu_desc_map tx_bd_map[15];
  205. EXTERN void mu3d_hal_resume_qmu(DEV_INT32 Q_num, USB_DIR dir);
  206. EXTERN void mu3d_hal_stop_qmu(DEV_INT32 Q_num, USB_DIR dir);
  207. EXTERN TGPD *_ex_mu3d_hal_prepare_tx_gpd(TGPD *gpd, dma_addr_t pBuf, DEV_UINT32 data_length,
  208. DEV_UINT8 ep_num, DEV_UINT8 _is_bdp, DEV_UINT8 isHWO,
  209. DEV_UINT8 ioc, DEV_UINT8 bps, DEV_UINT8 zlp);
  210. EXTERN TGPD *mu3d_hal_prepare_tx_gpd(TGPD *gpd, dma_addr_t pBuf, DEV_UINT32 data_length,
  211. DEV_UINT8 ep_num, DEV_UINT8 _is_bdp, DEV_UINT8 isHWO,
  212. DEV_UINT8 ioc, DEV_UINT8 bps, DEV_UINT8 zlp);
  213. EXTERN TGPD *_ex_mu3d_hal_prepare_rx_gpd(TGPD *gpd, dma_addr_t pBuf, DEV_UINT32 data_len,
  214. DEV_UINT8 ep_num, DEV_UINT8 _is_bdp, DEV_UINT8 isHWO,
  215. DEV_UINT8 ioc, DEV_UINT8 bps, DEV_UINT32 cMaxPacketSize);
  216. EXTERN TGPD *mu3d_hal_prepare_rx_gpd(TGPD *gpd, dma_addr_t pBuf, DEV_UINT32 data_len,
  217. DEV_UINT8 ep_num, DEV_UINT8 _is_bdp, DEV_UINT8 isHWO,
  218. DEV_UINT8 ioc, DEV_UINT8 bps, DEV_UINT32 cMaxPacketSize);
  219. EXTERN void _ex_mu3d_hal_insert_transfer_gpd(DEV_INT32 ep_num, USB_DIR dir, dma_addr_t buf,
  220. DEV_UINT32 count, DEV_UINT8 isHWO, DEV_UINT8 ioc,
  221. DEV_UINT8 bps, DEV_UINT8 zlp,
  222. DEV_UINT32 cMaxPacketSize);
  223. EXTERN void mu3d_hal_insert_transfer_gpd(DEV_INT32 ep_num, USB_DIR dir, dma_addr_t buf,
  224. DEV_UINT32 count, DEV_UINT8 isHWO, DEV_UINT8 ioc,
  225. DEV_UINT8 bps, DEV_UINT8 zlp, DEV_UINT32 cMaxPacketSize);
  226. EXTERN void _ex_mu3d_hal_alloc_qmu_mem(struct device *dev);
  227. EXTERN void _ex_mu3d_hal_free_qmu_mem(struct device *dev);
  228. EXTERN void mu3d_hal_alloc_qmu_mem(void);
  229. EXTERN void mu3d_hal_free_qmu_mem(void);
  230. EXTERN void _ex_mu3d_hal_init_qmu(void);
  231. EXTERN void mu3d_hal_init_qmu(void);
  232. EXTERN void mu3d_hal_start_qmu(DEV_INT32 Q_num, USB_DIR dir);
  233. EXTERN void _ex_mu3d_hal_flush_qmu(DEV_INT32 Q_num, USB_DIR dir);
  234. EXTERN void mu3d_hal_flush_qmu(DEV_INT32 Q_num, USB_DIR dir);
  235. EXTERN void mu3d_hal_restart_qmu(DEV_INT32 Q_num, USB_DIR dir);
  236. EXTERN void mu3d_hal_send_stall(DEV_INT32 Q_num, USB_DIR dir);
  237. EXTERN DEV_UINT8 mu3d_hal_cal_checksum(DEV_UINT8 *data, DEV_INT32 len);
  238. EXTERN dma_addr_t _ex_mu3d_hal_gpd_virt_to_phys(void *vaddr, USB_DIR dir, DEV_UINT32 num);
  239. EXTERN dma_addr_t mu3d_hal_gpd_virt_to_phys(void *vaddr, USB_DIR dir, DEV_UINT32 num);
  240. EXTERN PBD _ex_get_bd(USB_DIR dir, DEV_UINT32 num);
  241. EXTERN PBD get_bd(USB_DIR dir, DEV_UINT32 num);
  242. EXTERN dma_addr_t bd_virt_to_phys(void *vaddr, USB_DIR dir, DEV_UINT32 num);
  243. EXTERN void *bd_phys_to_virt(void *paddr, USB_DIR dir, DEV_UINT32 num);
  244. EXTERN PGPD get_gpd(USB_DIR dir, DEV_UINT32 num);
  245. EXTERN void *gpd_phys_to_virt(void *paddr, USB_DIR dir, DEV_UINT32 num);
  246. EXTERN void gpd_ptr_align(USB_DIR dir, DEV_UINT32 num, PGPD ptr);
  247. #undef EXTERN
  248. #endif