skl-sst-cldma.h 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Intel Code Loader DMA support
  4. *
  5. * Copyright (C) 2015, Intel Corporation.
  6. */
  7. #ifndef SKL_SST_CLDMA_H_
  8. #define SKL_SST_CLDMA_H_
  9. #define FW_CL_STREAM_NUMBER 0x1
  10. #define DMA_ADDRESS_128_BITS_ALIGNMENT 7
  11. #define BDL_ALIGN(x) (x >> DMA_ADDRESS_128_BITS_ALIGNMENT)
  12. #define SKL_ADSPIC_CL_DMA 0x2
  13. #define SKL_ADSPIS_CL_DMA 0x2
  14. #define SKL_CL_DMA_SD_INT_DESC_ERR 0x10 /* Descriptor error interrupt */
  15. #define SKL_CL_DMA_SD_INT_FIFO_ERR 0x08 /* FIFO error interrupt */
  16. #define SKL_CL_DMA_SD_INT_COMPLETE 0x04 /* Buffer completion interrupt */
  17. /* Intel HD Audio Code Loader DMA Registers */
  18. #define HDA_ADSP_LOADER_BASE 0x80
  19. /* Stream Registers */
  20. #define SKL_ADSP_REG_CL_SD_CTL (HDA_ADSP_LOADER_BASE + 0x00)
  21. #define SKL_ADSP_REG_CL_SD_STS (HDA_ADSP_LOADER_BASE + 0x03)
  22. #define SKL_ADSP_REG_CL_SD_LPIB (HDA_ADSP_LOADER_BASE + 0x04)
  23. #define SKL_ADSP_REG_CL_SD_CBL (HDA_ADSP_LOADER_BASE + 0x08)
  24. #define SKL_ADSP_REG_CL_SD_LVI (HDA_ADSP_LOADER_BASE + 0x0c)
  25. #define SKL_ADSP_REG_CL_SD_FIFOW (HDA_ADSP_LOADER_BASE + 0x0e)
  26. #define SKL_ADSP_REG_CL_SD_FIFOSIZE (HDA_ADSP_LOADER_BASE + 0x10)
  27. #define SKL_ADSP_REG_CL_SD_FORMAT (HDA_ADSP_LOADER_BASE + 0x12)
  28. #define SKL_ADSP_REG_CL_SD_FIFOL (HDA_ADSP_LOADER_BASE + 0x14)
  29. #define SKL_ADSP_REG_CL_SD_BDLPL (HDA_ADSP_LOADER_BASE + 0x18)
  30. #define SKL_ADSP_REG_CL_SD_BDLPU (HDA_ADSP_LOADER_BASE + 0x1c)
  31. /* CL: Software Position Based FIFO Capability Registers */
  32. #define SKL_ADSP_REG_CL_SPBFIFO (HDA_ADSP_LOADER_BASE + 0x20)
  33. #define SKL_ADSP_REG_CL_SPBFIFO_SPBFCH (SKL_ADSP_REG_CL_SPBFIFO + 0x0)
  34. #define SKL_ADSP_REG_CL_SPBFIFO_SPBFCCTL (SKL_ADSP_REG_CL_SPBFIFO + 0x4)
  35. #define SKL_ADSP_REG_CL_SPBFIFO_SPIB (SKL_ADSP_REG_CL_SPBFIFO + 0x8)
  36. #define SKL_ADSP_REG_CL_SPBFIFO_MAXFIFOS (SKL_ADSP_REG_CL_SPBFIFO + 0xc)
  37. /* CL: Stream Descriptor x Control */
  38. /* Stream Reset */
  39. #define CL_SD_CTL_SRST_SHIFT 0
  40. #define CL_SD_CTL_SRST_MASK (1 << CL_SD_CTL_SRST_SHIFT)
  41. #define CL_SD_CTL_SRST(x) \
  42. ((x << CL_SD_CTL_SRST_SHIFT) & CL_SD_CTL_SRST_MASK)
  43. /* Stream Run */
  44. #define CL_SD_CTL_RUN_SHIFT 1
  45. #define CL_SD_CTL_RUN_MASK (1 << CL_SD_CTL_RUN_SHIFT)
  46. #define CL_SD_CTL_RUN(x) \
  47. ((x << CL_SD_CTL_RUN_SHIFT) & CL_SD_CTL_RUN_MASK)
  48. /* Interrupt On Completion Enable */
  49. #define CL_SD_CTL_IOCE_SHIFT 2
  50. #define CL_SD_CTL_IOCE_MASK (1 << CL_SD_CTL_IOCE_SHIFT)
  51. #define CL_SD_CTL_IOCE(x) \
  52. ((x << CL_SD_CTL_IOCE_SHIFT) & CL_SD_CTL_IOCE_MASK)
  53. /* FIFO Error Interrupt Enable */
  54. #define CL_SD_CTL_FEIE_SHIFT 3
  55. #define CL_SD_CTL_FEIE_MASK (1 << CL_SD_CTL_FEIE_SHIFT)
  56. #define CL_SD_CTL_FEIE(x) \
  57. ((x << CL_SD_CTL_FEIE_SHIFT) & CL_SD_CTL_FEIE_MASK)
  58. /* Descriptor Error Interrupt Enable */
  59. #define CL_SD_CTL_DEIE_SHIFT 4
  60. #define CL_SD_CTL_DEIE_MASK (1 << CL_SD_CTL_DEIE_SHIFT)
  61. #define CL_SD_CTL_DEIE(x) \
  62. ((x << CL_SD_CTL_DEIE_SHIFT) & CL_SD_CTL_DEIE_MASK)
  63. /* FIFO Limit Change */
  64. #define CL_SD_CTL_FIFOLC_SHIFT 5
  65. #define CL_SD_CTL_FIFOLC_MASK (1 << CL_SD_CTL_FIFOLC_SHIFT)
  66. #define CL_SD_CTL_FIFOLC(x) \
  67. ((x << CL_SD_CTL_FIFOLC_SHIFT) & CL_SD_CTL_FIFOLC_MASK)
  68. /* Stripe Control */
  69. #define CL_SD_CTL_STRIPE_SHIFT 16
  70. #define CL_SD_CTL_STRIPE_MASK (0x3 << CL_SD_CTL_STRIPE_SHIFT)
  71. #define CL_SD_CTL_STRIPE(x) \
  72. ((x << CL_SD_CTL_STRIPE_SHIFT) & CL_SD_CTL_STRIPE_MASK)
  73. /* Traffic Priority */
  74. #define CL_SD_CTL_TP_SHIFT 18
  75. #define CL_SD_CTL_TP_MASK (1 << CL_SD_CTL_TP_SHIFT)
  76. #define CL_SD_CTL_TP(x) \
  77. ((x << CL_SD_CTL_TP_SHIFT) & CL_SD_CTL_TP_MASK)
  78. /* Bidirectional Direction Control */
  79. #define CL_SD_CTL_DIR_SHIFT 19
  80. #define CL_SD_CTL_DIR_MASK (1 << CL_SD_CTL_DIR_SHIFT)
  81. #define CL_SD_CTL_DIR(x) \
  82. ((x << CL_SD_CTL_DIR_SHIFT) & CL_SD_CTL_DIR_MASK)
  83. /* Stream Number */
  84. #define CL_SD_CTL_STRM_SHIFT 20
  85. #define CL_SD_CTL_STRM_MASK (0xf << CL_SD_CTL_STRM_SHIFT)
  86. #define CL_SD_CTL_STRM(x) \
  87. ((x << CL_SD_CTL_STRM_SHIFT) & CL_SD_CTL_STRM_MASK)
  88. /* CL: Stream Descriptor x Status */
  89. /* Buffer Completion Interrupt Status */
  90. #define CL_SD_STS_BCIS(x) CL_SD_CTL_IOCE(x)
  91. /* FIFO Error */
  92. #define CL_SD_STS_FIFOE(x) CL_SD_CTL_FEIE(x)
  93. /* Descriptor Error */
  94. #define CL_SD_STS_DESE(x) CL_SD_CTL_DEIE(x)
  95. /* FIFO Ready */
  96. #define CL_SD_STS_FIFORDY(x) CL_SD_CTL_FIFOLC(x)
  97. /* CL: Stream Descriptor x Last Valid Index */
  98. #define CL_SD_LVI_SHIFT 0
  99. #define CL_SD_LVI_MASK (0xff << CL_SD_LVI_SHIFT)
  100. #define CL_SD_LVI(x) ((x << CL_SD_LVI_SHIFT) & CL_SD_LVI_MASK)
  101. /* CL: Stream Descriptor x FIFO Eviction Watermark */
  102. #define CL_SD_FIFOW_SHIFT 0
  103. #define CL_SD_FIFOW_MASK (0x7 << CL_SD_FIFOW_SHIFT)
  104. #define CL_SD_FIFOW(x) \
  105. ((x << CL_SD_FIFOW_SHIFT) & CL_SD_FIFOW_MASK)
  106. /* CL: Stream Descriptor x Buffer Descriptor List Pointer Lower Base Address */
  107. /* Protect Bits */
  108. #define CL_SD_BDLPLBA_PROT_SHIFT 0
  109. #define CL_SD_BDLPLBA_PROT_MASK (1 << CL_SD_BDLPLBA_PROT_SHIFT)
  110. #define CL_SD_BDLPLBA_PROT(x) \
  111. ((x << CL_SD_BDLPLBA_PROT_SHIFT) & CL_SD_BDLPLBA_PROT_MASK)
  112. /* Buffer Descriptor List Lower Base Address */
  113. #define CL_SD_BDLPLBA_SHIFT 7
  114. #define CL_SD_BDLPLBA_MASK (0x1ffffff << CL_SD_BDLPLBA_SHIFT)
  115. #define CL_SD_BDLPLBA(x) \
  116. ((BDL_ALIGN(lower_32_bits(x)) << CL_SD_BDLPLBA_SHIFT) & CL_SD_BDLPLBA_MASK)
  117. /* Buffer Descriptor List Upper Base Address */
  118. #define CL_SD_BDLPUBA_SHIFT 0
  119. #define CL_SD_BDLPUBA_MASK (0xffffffff << CL_SD_BDLPUBA_SHIFT)
  120. #define CL_SD_BDLPUBA(x) \
  121. ((upper_32_bits(x) << CL_SD_BDLPUBA_SHIFT) & CL_SD_BDLPUBA_MASK)
  122. /*
  123. * Code Loader - Software Position Based FIFO
  124. * Capability Registers x Software Position Based FIFO Header
  125. */
  126. /* Next Capability Pointer */
  127. #define CL_SPBFIFO_SPBFCH_PTR_SHIFT 0
  128. #define CL_SPBFIFO_SPBFCH_PTR_MASK (0xff << CL_SPBFIFO_SPBFCH_PTR_SHIFT)
  129. #define CL_SPBFIFO_SPBFCH_PTR(x) \
  130. ((x << CL_SPBFIFO_SPBFCH_PTR_SHIFT) & CL_SPBFIFO_SPBFCH_PTR_MASK)
  131. /* Capability Identifier */
  132. #define CL_SPBFIFO_SPBFCH_ID_SHIFT 16
  133. #define CL_SPBFIFO_SPBFCH_ID_MASK (0xfff << CL_SPBFIFO_SPBFCH_ID_SHIFT)
  134. #define CL_SPBFIFO_SPBFCH_ID(x) \
  135. ((x << CL_SPBFIFO_SPBFCH_ID_SHIFT) & CL_SPBFIFO_SPBFCH_ID_MASK)
  136. /* Capability Version */
  137. #define CL_SPBFIFO_SPBFCH_VER_SHIFT 28
  138. #define CL_SPBFIFO_SPBFCH_VER_MASK (0xf << CL_SPBFIFO_SPBFCH_VER_SHIFT)
  139. #define CL_SPBFIFO_SPBFCH_VER(x) \
  140. ((x << CL_SPBFIFO_SPBFCH_VER_SHIFT) & CL_SPBFIFO_SPBFCH_VER_MASK)
  141. /* Software Position in Buffer Enable */
  142. #define CL_SPBFIFO_SPBFCCTL_SPIBE_SHIFT 0
  143. #define CL_SPBFIFO_SPBFCCTL_SPIBE_MASK (1 << CL_SPBFIFO_SPBFCCTL_SPIBE_SHIFT)
  144. #define CL_SPBFIFO_SPBFCCTL_SPIBE(x) \
  145. ((x << CL_SPBFIFO_SPBFCCTL_SPIBE_SHIFT) & CL_SPBFIFO_SPBFCCTL_SPIBE_MASK)
  146. /* SST IPC SKL defines */
  147. #define SKL_WAIT_TIMEOUT 500 /* 500 msec */
  148. #define SKL_MAX_BUFFER_SIZE (32 * PAGE_SIZE)
  149. enum skl_cl_dma_wake_states {
  150. SKL_CL_DMA_STATUS_NONE = 0,
  151. SKL_CL_DMA_BUF_COMPLETE,
  152. SKL_CL_DMA_ERR, /* TODO: Expand the error states */
  153. };
  154. struct sst_dsp;
  155. struct skl_cl_dev_ops {
  156. void (*cl_setup_bdle)(struct sst_dsp *ctx,
  157. struct snd_dma_buffer *dmab_data,
  158. __le32 **bdlp, int size, int with_ioc);
  159. void (*cl_setup_controller)(struct sst_dsp *ctx,
  160. struct snd_dma_buffer *dmab_bdl,
  161. unsigned int max_size, u32 page_count);
  162. void (*cl_setup_spb)(struct sst_dsp *ctx,
  163. unsigned int size, bool enable);
  164. void (*cl_cleanup_spb)(struct sst_dsp *ctx);
  165. void (*cl_trigger)(struct sst_dsp *ctx, bool enable);
  166. void (*cl_cleanup_controller)(struct sst_dsp *ctx);
  167. int (*cl_copy_to_dmabuf)(struct sst_dsp *ctx,
  168. const void *bin, u32 size, bool wait);
  169. void (*cl_stop_dma)(struct sst_dsp *ctx);
  170. };
  171. /**
  172. * skl_cl_dev - holds information for code loader dma transfer
  173. *
  174. * @dmab_data: buffer pointer
  175. * @dmab_bdl: buffer descriptor list
  176. * @bufsize: ring buffer size
  177. * @frags: Last valid buffer descriptor index in the BDL
  178. * @curr_spib_pos: Current position in ring buffer
  179. * @dma_buffer_offset: dma buffer offset
  180. * @ops: operations supported on CL dma
  181. * @wait_queue: wait queue to wake for wake event
  182. * @wake_status: DMA wake status
  183. * @wait_condition: condition to wait on wait queue
  184. * @cl_dma_lock: for synchronized access to cldma
  185. */
  186. struct skl_cl_dev {
  187. struct snd_dma_buffer dmab_data;
  188. struct snd_dma_buffer dmab_bdl;
  189. unsigned int bufsize;
  190. unsigned int frags;
  191. unsigned int curr_spib_pos;
  192. unsigned int dma_buffer_offset;
  193. struct skl_cl_dev_ops ops;
  194. wait_queue_head_t wait_queue;
  195. int wake_status;
  196. bool wait_condition;
  197. };
  198. #endif /* SKL_SST_CLDMA_H_ */