mu3d_hal_qmu_drv.h 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. #ifndef MTK_QMU_H
  2. #define MTK_QMU_H
  3. /* #include <linux/mu3d/hal/mu3d_hal_osal.h> */
  4. /* #include <linux/mu3d/hal/mu3d_hal_comm.h> */
  5. /* #include <linux/mu3d/hal/mu3d_hal_usb_drv.h> */
  6. /* #include "mu3d_hal_osal.h" */
  7. /* #include "mu3d_hal_comm.h" */
  8. #include "mu3d_hal_usb_drv.h"
  9. #include "musb_core.h"
  10. /*
  11. * http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0464d/BABCFDAH.html
  12. * CA7 , CA15
  13. * The L1 data memory system has the following features:
  14. * data side cache line length of 64-bytes
  15. */
  16. #define CACHE_LINE_SIZE 64
  17. struct ssusb_gpd {
  18. u8 flag;
  19. u8 chksum;
  20. u16 data_buf_len; /*Rx Allow Length */
  21. u32 next_gpd; /* dma_addr_t */
  22. u32 buffer; /* dma_addr_t */
  23. u16 buf_len;
  24. u8 ext_len;
  25. u8 ext_flag;
  26. } /*__attribute__ ((packed), or (aligned(CACHE_LINE_SIZE)))*/;
  27. /**
  28. * dma: physical base address of GPD segment
  29. * start: virtual base address of GPD segment
  30. * end: the last gpd element
  31. * next: the next gpd set to @enqueue.next_gpd
  32. * enqueue: the first empty gpd to use
  33. * dequeue: the first completed gpd serviced by ISR
  34. * the ring elements of the gpd should be >= 2
  35. */
  36. struct ssusb_gpd_range {
  37. dma_addr_t dma;
  38. struct ssusb_gpd *start;
  39. struct ssusb_gpd *end;
  40. struct ssusb_gpd *next;
  41. struct ssusb_gpd *enqueue;
  42. struct ssusb_gpd *dequeue;
  43. };
  44. #define AT_BD_EXT_LEN 0
  45. #define MAX_GPD_NUM 32
  46. #define MAX_BD_NUM 0
  47. /* DVT+ */
  48. #define STRESS_IOC_TH 8
  49. #define STRESS_GPD_TH 24
  50. #define RANDOM_STOP_DELAY 80
  51. #define STRESS_DATA_LENGTH (1024*64) /* 1024*16 */
  52. /* DVT- */
  53. #define GPD_BUF_SIZE 65532
  54. #define BD_BUF_SIZE 32768 /* set to half of 64K of max size */
  55. #define IS_BDP 1
  56. #define MAX_QMU_EP MAX_EP_NUM /*The better way is to read U3D_CAP_EPINFO */
  57. #define TGPD_FLAGS_HWO 0x01
  58. #define TGPD_IS_FLAGS_HWO(_pd) (((struct ssusb_gpd *)_pd)->flag & TGPD_FLAGS_HWO)
  59. #define TGPD_SET_FLAGS_HWO(_pd) (((struct ssusb_gpd *)_pd)->flag |= TGPD_FLAGS_HWO)
  60. #define TGPD_CLR_FLAGS_HWO(_pd) (((struct ssusb_gpd *)_pd)->flag &= (~TGPD_FLAGS_HWO))
  61. #define TGPD_FORMAT_BDP 0x02
  62. #define TGPD_IS_FORMAT_BDP(_pd) (((struct ssusb_gpd *)_pd)->flag & TGPD_FORMAT_BDP)
  63. #define TGPD_SET_FORMAT_BDP(_pd) (((struct ssusb_gpd *)_pd)->flag |= TGPD_FORMAT_BDP)
  64. #define TGPD_CLR_FORMAT_BDP(_pd) (((struct ssusb_gpd *)_pd)->flag &= (~TGPD_FORMAT_BDP))
  65. #define TGPD_FORMAT_BPS 0x04
  66. #define TGPD_IS_FORMAT_BPS(_pd) (((struct ssusb_gpd *)_pd)->flag & TGPD_FORMAT_BPS)
  67. #define TGPD_SET_FORMAT_BPS(_pd) (((struct ssusb_gpd *)_pd)->flag |= TGPD_FORMAT_BPS)
  68. #define TGPD_CLR_FORMAT_BPS(_pd) (((struct ssusb_gpd *)_pd)->flag &= (~TGPD_FORMAT_BPS))
  69. #define TGPD_GET_FLAG(_pd) (((struct ssusb_gpd *)_pd)->flag)
  70. #define TGPD_SET_CHKSUM(_pd, _n) { \
  71. ((struct ssusb_gpd *)_pd)->chksum = mu3d_hal_cal_checksum((u8 *)_pd, _n) - 1;\
  72. }
  73. /* #define TGPD_SET_CHKSUM_HWO(_pd, _n) ((struct ssusb_gpd *)_pd)->chksum = mu3d_hal_cal_checksum((u8 *)_pd, _n)-1 */
  74. #define TGPD_GET_CHKSUM(_pd) (((struct ssusb_gpd *)_pd)->chksum)
  75. #define TGPD_SET_FORMAT(_pd, _fmt) {\
  76. (((struct ssusb_gpd *)_pd)->flag = (((struct ssusb_gpd *)_pd)->flag&(~TGPD_FORMAT_BDP))|(_fmt))\
  77. }
  78. #define TGPD_GET_FORMAT(_pd) ((((struct ssusb_gpd *)_pd)->flag & TGPD_FORMAT_BDP)>>1)
  79. #define TGPD_SET_DATA_BUF_LEN(_pd, _len) (((struct ssusb_gpd *)_pd)->data_buf_len = _len)
  80. #define TGPD_ADD_DATA_BUF_LEN(_pd, _len) (((struct ssusb_gpd *)_pd)->data_buf_len += _len)
  81. #define TGPD_GET_DATA_BUF_LEN(_pd) (((struct ssusb_gpd *)_pd)->data_buf_len)
  82. #define TGPD_SET_NEXT(_pd, _next) {\
  83. (((struct ssusb_gpd *)_pd)->next_gpd = (u32)_next);\
  84. }
  85. #define TGPD_GET_NEXT(_pd) ((u32)((struct ssusb_gpd *)_pd)->next_gpd)
  86. #define TGPD_GET_TBD(_pd) ((TBD *)((struct ssusb_gpd *)_pd)->buffer)
  87. #define TGPD_SET_DATA(_pd, _data) (((struct ssusb_gpd *)_pd)->buffer = (u32)_data)
  88. #define TGPD_GET_DATA(_pd) (((struct ssusb_gpd *)_pd)->buffer)
  89. #define TGPD_SET_BUF_LEN(_pd, _len) (((struct ssusb_gpd *)_pd)->buf_len = _len)
  90. #define TGPD_ADD_BUF_LEN(_pd, _len) (((struct ssusb_gpd *)_pd)->buf_len += _len)
  91. #define TGPD_GET_BUF_LEN(_pd) (((struct ssusb_gpd *)_pd)->buf_len)
  92. #define TGPD_SET_EXT_LEN(_pd, _len) (((struct ssusb_gpd *)_pd)->ext_len = _len)
  93. #define TGPD_GET_EXT_LEN(_pd) (((struct ssusb_gpd *)_pd)->ext_len)
  94. #define TGPD_SET_EPaddr(_pd, _EP) {\
  95. (((struct ssusb_gpd *)_pd)->ext_flag = (((struct ssusb_gpd *)_pd)->ext_flag&0xF0)|(_EP))\
  96. }
  97. #define TGPD_GET_EPaddr(_pd) (((struct ssusb_gpd *)_pd)->ext_flag & 0x0F)
  98. #define TGPD_FORMAT_TGL 0x10
  99. #define TGPD_IS_FORMAT_TGL(_pd) (((struct ssusb_gpd *)_pd)->ext_flag & TGPD_FORMAT_TGL)
  100. #define TGPD_SET_FORMAT_TGL(_pd) (((struct ssusb_gpd *)_pd)->ext_flag |= TGPD_FORMAT_TGL)
  101. #define TGPD_CLR_FORMAT_TGL(_pd) (((struct ssusb_gpd *)_pd)->ext_flag &= (~TGPD_FORMAT_TGL))
  102. #define TGPD_FORMAT_ZLP 0x20
  103. #define TGPD_IS_FORMAT_ZLP(_pd) (((struct ssusb_gpd *)_pd)->ext_flag & TGPD_FORMAT_ZLP)
  104. #define TGPD_SET_FORMAT_ZLP(_pd) (((struct ssusb_gpd *)_pd)->ext_flag |= TGPD_FORMAT_ZLP)
  105. #define TGPD_CLR_FORMAT_ZLP(_pd) (((struct ssusb_gpd *)_pd)->ext_flag &= (~TGPD_FORMAT_ZLP))
  106. #define TGPD_FORMAT_IOC 0x80
  107. #define TGPD_IS_FORMAT_IOC(_pd) (((struct ssusb_gpd *)_pd)->flag & TGPD_FORMAT_IOC)
  108. #define TGPD_SET_FORMAT_IOC(_pd) (((struct ssusb_gpd *)_pd)->flag |= TGPD_FORMAT_IOC)
  109. #define TGPD_CLR_FORMAT_IOC(_pd) (((struct ssusb_gpd *)_pd)->flag &= (~TGPD_FORMAT_IOC))
  110. #define TGPD_SET_TGL(_pd, _TGL) (((struct ssusb_gpd *)_pd)->ext_flag |= ((_TGL) ? 0x10 : 0x00))
  111. #define TGPD_GET_TGL(_pd) ((((struct ssusb_gpd *)_pd)->ext_flag & TGPD_FORMAT_TGL) ? 1 : 0)
  112. #define TGPD_SET_ZLP(_pd, _ZLP) {\
  113. (((struct ssusb_gpd *)_pd)->ext_flag |= ((_ZLP) ? TGPD_FORMAT_ZLP : 0x00))\
  114. }
  115. #define TGPD_GET_ZLP(_pd) ((((struct ssusb_gpd *)_pd)->ext_flag & TGPD_FORMAT_ZLP) ? 1 : 0)
  116. /* #define TGPD_GET_EXT(_pd) ((u8 *)_pd + sizeof(struct ssusb_gpd)) */
  117. void mu3d_hal_resume_qmu(struct musb *musb, int q_num, USB_DIR dir);
  118. void mu3d_hal_stop_qmu(struct musb *musb, int q_num, USB_DIR dir);
  119. #if 0
  120. struct ssusb_gpd *mu3d_hal_prepare_tx_gpd(struct ssusb_gpd *gpd, dma_addr_t pBuf, u32 data_length,
  121. u8 ep_num, u8 _is_bdp, u8 isHWO, u8 ioc, u8 bps, u8 zlp);
  122. struct ssusb_gpd *mu3d_hal_prepare_rx_gpd(struct ssusb_gpd *gpd, dma_addr_t pBuf, u32 data_len,
  123. u8 ep_num, u8 _is_bdp, u8 isHWO,
  124. u8 ioc, u8 bps, u32 cMaxPacketSize);
  125. #endif
  126. void mu3d_hal_insert_transfer_gpd(int ep_num, USB_DIR dir, dma_addr_t buf,
  127. u32 count, u8 isHWO, u8 ioc, u8 bps, u8 zlp, u32 cMaxPacketSize);
  128. void mu3d_hal_alloc_qmu_mem(struct musb *musb);
  129. void mu3d_hal_free_qmu_mem(struct musb *musb);
  130. void mu3d_hal_init_qmu(struct musb *musb);
  131. void mu3d_hal_start_qmu(struct musb *musb, int q_num, USB_DIR dir);
  132. void mu3d_hal_flush_qmu(struct musb *musb, int q_num, USB_DIR dir);
  133. void mu3d_hal_restart_qmu(struct musb *musb, int q_num, USB_DIR dir);
  134. void mu3d_hal_send_stall(struct musb *musb, int q_num, USB_DIR dir);
  135. /* u8 mu3d_hal_cal_checksum(u8 *data, int len); */
  136. /* struct ssusb_gpd *get_gpd(USB_DIR dir, u32 num); */
  137. /* void gpd_ptr_align(USB_DIR dir, u32 num, struct ssusb_gpd *ptr); */
  138. void qmu_done_tasklet(unsigned long data);
  139. void qmu_exception_interrupt(struct musb *musb, u32 wQmuVal);
  140. #endif