sst-dsp.h 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. /*
  2. * Intel Smart Sound Technology (SST) Core
  3. *
  4. * Copyright (C) 2013, Intel Corporation. All rights reserved.
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU General Public License version
  8. * 2 as published by the Free Software Foundation.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. */
  16. #ifndef __SOUND_SOC_SST_DSP_H
  17. #define __SOUND_SOC_SST_DSP_H
  18. #include <linux/kernel.h>
  19. #include <linux/types.h>
  20. #include <linux/interrupt.h>
  21. /* SST Device IDs */
  22. #define SST_DEV_ID_LYNX_POINT 0x33C8
  23. #define SST_DEV_ID_WILDCAT_POINT 0x3438
  24. #define SST_DEV_ID_BYT 0x0F28
  25. /* Supported SST DMA Devices */
  26. #define SST_DMA_TYPE_DW 1
  27. #define SST_DMA_TYPE_MID 2
  28. /* SST Shim register map
  29. * The register naming can differ between products. Some products also
  30. * contain extra functionality.
  31. */
  32. #define SST_CSR 0x00
  33. #define SST_PISR 0x08
  34. #define SST_PIMR 0x10
  35. #define SST_ISRX 0x18
  36. #define SST_ISRD 0x20
  37. #define SST_IMRX 0x28
  38. #define SST_IMRD 0x30
  39. #define SST_IPCX 0x38 /* IPC IA -> SST */
  40. #define SST_IPCD 0x40 /* IPC SST -> IA */
  41. #define SST_ISRSC 0x48
  42. #define SST_ISRLPESC 0x50
  43. #define SST_IMRSC 0x58
  44. #define SST_IMRLPESC 0x60
  45. #define SST_IPCSC 0x68
  46. #define SST_IPCLPESC 0x70
  47. #define SST_CLKCTL 0x78
  48. #define SST_CSR2 0x80
  49. #define SST_LTRC 0xE0
  50. #define SST_HMDC 0xE8
  51. #define SST_SHIM_BEGIN SST_CSR
  52. #define SST_SHIM_END SST_HDMC
  53. #define SST_DBGO 0xF0
  54. #define SST_SHIM_SIZE 0x100
  55. #define SST_PWMCTRL 0x1000
  56. /* SST Shim Register bits
  57. * The register bit naming can differ between products. Some products also
  58. * contain extra functionality.
  59. */
  60. /* CSR / CS */
  61. #define SST_CSR_RST (0x1 << 1)
  62. #define SST_CSR_SBCS0 (0x1 << 2)
  63. #define SST_CSR_SBCS1 (0x1 << 3)
  64. #define SST_CSR_DCS(x) (x << 4)
  65. #define SST_CSR_DCS_MASK (0x7 << 4)
  66. #define SST_CSR_STALL (0x1 << 10)
  67. #define SST_CSR_S0IOCS (0x1 << 21)
  68. #define SST_CSR_S1IOCS (0x1 << 23)
  69. #define SST_CSR_LPCS (0x1 << 31)
  70. #define SST_CSR_24MHZ_LPCS (SST_CSR_SBCS0 | SST_CSR_SBCS1 | SST_CSR_LPCS)
  71. #define SST_CSR_24MHZ_NO_LPCS (SST_CSR_SBCS0 | SST_CSR_SBCS1)
  72. #define SST_BYT_CSR_RST (0x1 << 0)
  73. #define SST_BYT_CSR_VECTOR_SEL (0x1 << 1)
  74. #define SST_BYT_CSR_STALL (0x1 << 2)
  75. #define SST_BYT_CSR_PWAITMODE (0x1 << 3)
  76. /* ISRX / ISC */
  77. #define SST_ISRX_BUSY (0x1 << 1)
  78. #define SST_ISRX_DONE (0x1 << 0)
  79. #define SST_BYT_ISRX_REQUEST (0x1 << 1)
  80. /* ISRD / ISD */
  81. #define SST_ISRD_BUSY (0x1 << 1)
  82. #define SST_ISRD_DONE (0x1 << 0)
  83. /* IMRX / IMC */
  84. #define SST_IMRX_BUSY (0x1 << 1)
  85. #define SST_IMRX_DONE (0x1 << 0)
  86. #define SST_BYT_IMRX_REQUEST (0x1 << 1)
  87. /* IMRD / IMD */
  88. #define SST_IMRD_DONE (0x1 << 0)
  89. #define SST_IMRD_BUSY (0x1 << 1)
  90. #define SST_IMRD_SSP0 (0x1 << 16)
  91. #define SST_IMRD_DMAC0 (0x1 << 21)
  92. #define SST_IMRD_DMAC1 (0x1 << 22)
  93. #define SST_IMRD_DMAC (SST_IMRD_DMAC0 | SST_IMRD_DMAC1)
  94. /* IPCX / IPCC */
  95. #define SST_IPCX_DONE (0x1 << 30)
  96. #define SST_IPCX_BUSY (0x1 << 31)
  97. #define SST_BYT_IPCX_DONE ((u64)0x1 << 62)
  98. #define SST_BYT_IPCX_BUSY ((u64)0x1 << 63)
  99. /* IPCD */
  100. #define SST_IPCD_DONE (0x1 << 30)
  101. #define SST_IPCD_BUSY (0x1 << 31)
  102. #define SST_BYT_IPCD_DONE ((u64)0x1 << 62)
  103. #define SST_BYT_IPCD_BUSY ((u64)0x1 << 63)
  104. /* CLKCTL */
  105. #define SST_CLKCTL_SMOS(x) (x << 24)
  106. #define SST_CLKCTL_MASK (3 << 24)
  107. #define SST_CLKCTL_DCPLCG (1 << 18)
  108. #define SST_CLKCTL_SCOE1 (1 << 17)
  109. #define SST_CLKCTL_SCOE0 (1 << 16)
  110. /* CSR2 / CS2 */
  111. #define SST_CSR2_SDFD_SSP0 (1 << 1)
  112. #define SST_CSR2_SDFD_SSP1 (1 << 2)
  113. /* LTRC */
  114. #define SST_LTRC_VAL(x) (x << 0)
  115. /* HMDC */
  116. #define SST_HMDC_HDDA0(x) (x << 0)
  117. #define SST_HMDC_HDDA1(x) (x << 7)
  118. #define SST_HMDC_HDDA_E0_CH0 1
  119. #define SST_HMDC_HDDA_E0_CH1 2
  120. #define SST_HMDC_HDDA_E0_CH2 4
  121. #define SST_HMDC_HDDA_E0_CH3 8
  122. #define SST_HMDC_HDDA_E1_CH0 SST_HMDC_HDDA1(SST_HMDC_HDDA_E0_CH0)
  123. #define SST_HMDC_HDDA_E1_CH1 SST_HMDC_HDDA1(SST_HMDC_HDDA_E0_CH1)
  124. #define SST_HMDC_HDDA_E1_CH2 SST_HMDC_HDDA1(SST_HMDC_HDDA_E0_CH2)
  125. #define SST_HMDC_HDDA_E1_CH3 SST_HMDC_HDDA1(SST_HMDC_HDDA_E0_CH3)
  126. #define SST_HMDC_HDDA_E0_ALLCH (SST_HMDC_HDDA_E0_CH0 | SST_HMDC_HDDA_E0_CH1 | \
  127. SST_HMDC_HDDA_E0_CH2 | SST_HMDC_HDDA_E0_CH3)
  128. #define SST_HMDC_HDDA_E1_ALLCH (SST_HMDC_HDDA_E1_CH0 | SST_HMDC_HDDA_E1_CH1 | \
  129. SST_HMDC_HDDA_E1_CH2 | SST_HMDC_HDDA_E1_CH3)
  130. /* SST Vendor Defined Registers and bits */
  131. #define SST_VDRTCTL0 0xa0
  132. #define SST_VDRTCTL1 0xa4
  133. #define SST_VDRTCTL2 0xa8
  134. #define SST_VDRTCTL3 0xaC
  135. /* VDRTCTL0 */
  136. #define SST_VDRTCL0_APLLSE_MASK 1
  137. #define SST_VDRTCL0_DSRAMPGE_SHIFT 16
  138. #define SST_VDRTCL0_DSRAMPGE_MASK (0xffff << SST_VDRTCL0_DSRAMPGE_SHIFT)
  139. #define SST_VDRTCL0_ISRAMPGE_SHIFT 6
  140. #define SST_VDRTCL0_ISRAMPGE_MASK (0x3ff << SST_VDRTCL0_ISRAMPGE_SHIFT)
  141. /* PMCS */
  142. #define SST_PMCS 0x84
  143. #define SST_PMCS_PS_MASK 0x3
  144. struct sst_dsp;
  145. /*
  146. * SST Device.
  147. *
  148. * This structure is populated by the SST core driver.
  149. */
  150. struct sst_dsp_device {
  151. /* Mandatory fields */
  152. struct sst_ops *ops;
  153. irqreturn_t (*thread)(int irq, void *context);
  154. void *thread_context;
  155. };
  156. /*
  157. * SST Platform Data.
  158. */
  159. struct sst_pdata {
  160. /* ACPI data */
  161. u32 lpe_base;
  162. u32 lpe_size;
  163. u32 pcicfg_base;
  164. u32 pcicfg_size;
  165. u32 fw_base;
  166. u32 fw_size;
  167. int irq;
  168. /* Firmware */
  169. const struct firmware *fw;
  170. /* DMA */
  171. u32 dma_base;
  172. u32 dma_size;
  173. int dma_engine;
  174. struct device *dma_dev;
  175. /* DSP */
  176. u32 id;
  177. void *dsp;
  178. };
  179. /* Initialization */
  180. struct sst_dsp *sst_dsp_new(struct device *dev,
  181. struct sst_dsp_device *sst_dev, struct sst_pdata *pdata);
  182. void sst_dsp_free(struct sst_dsp *sst);
  183. /* SHIM Read / Write */
  184. void sst_dsp_shim_write(struct sst_dsp *sst, u32 offset, u32 value);
  185. u32 sst_dsp_shim_read(struct sst_dsp *sst, u32 offset);
  186. int sst_dsp_shim_update_bits(struct sst_dsp *sst, u32 offset,
  187. u32 mask, u32 value);
  188. void sst_dsp_shim_write64(struct sst_dsp *sst, u32 offset, u64 value);
  189. u64 sst_dsp_shim_read64(struct sst_dsp *sst, u32 offset);
  190. int sst_dsp_shim_update_bits64(struct sst_dsp *sst, u32 offset,
  191. u64 mask, u64 value);
  192. /* SHIM Read / Write Unlocked for callers already holding sst lock */
  193. void sst_dsp_shim_write_unlocked(struct sst_dsp *sst, u32 offset, u32 value);
  194. u32 sst_dsp_shim_read_unlocked(struct sst_dsp *sst, u32 offset);
  195. int sst_dsp_shim_update_bits_unlocked(struct sst_dsp *sst, u32 offset,
  196. u32 mask, u32 value);
  197. void sst_dsp_shim_write64_unlocked(struct sst_dsp *sst, u32 offset, u64 value);
  198. u64 sst_dsp_shim_read64_unlocked(struct sst_dsp *sst, u32 offset);
  199. int sst_dsp_shim_update_bits64_unlocked(struct sst_dsp *sst, u32 offset,
  200. u64 mask, u64 value);
  201. /* Internal generic low-level SST IO functions - can be overidden */
  202. void sst_shim32_write(void __iomem *addr, u32 offset, u32 value);
  203. u32 sst_shim32_read(void __iomem *addr, u32 offset);
  204. void sst_shim32_write64(void __iomem *addr, u32 offset, u64 value);
  205. u64 sst_shim32_read64(void __iomem *addr, u32 offset);
  206. void sst_memcpy_toio_32(struct sst_dsp *sst,
  207. void __iomem *dest, void *src, size_t bytes);
  208. void sst_memcpy_fromio_32(struct sst_dsp *sst,
  209. void *dest, void __iomem *src, size_t bytes);
  210. /* DSP reset & boot */
  211. void sst_dsp_reset(struct sst_dsp *sst);
  212. int sst_dsp_boot(struct sst_dsp *sst);
  213. /* Msg IO */
  214. void sst_dsp_ipc_msg_tx(struct sst_dsp *dsp, u32 msg);
  215. u32 sst_dsp_ipc_msg_rx(struct sst_dsp *dsp);
  216. /* Mailbox management */
  217. int sst_dsp_mailbox_init(struct sst_dsp *dsp, u32 inbox_offset,
  218. size_t inbox_size, u32 outbox_offset, size_t outbox_size);
  219. void sst_dsp_inbox_write(struct sst_dsp *dsp, void *message, size_t bytes);
  220. void sst_dsp_inbox_read(struct sst_dsp *dsp, void *message, size_t bytes);
  221. void sst_dsp_outbox_write(struct sst_dsp *dsp, void *message, size_t bytes);
  222. void sst_dsp_outbox_read(struct sst_dsp *dsp, void *message, size_t bytes);
  223. void sst_dsp_mailbox_dump(struct sst_dsp *dsp, size_t bytes);
  224. /* Debug */
  225. void sst_dsp_dump(struct sst_dsp *sst);
  226. #endif