amd_manager.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. /* SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) */
  2. /*
  3. * Copyright (C) 2023-24 Advanced Micro Devices, Inc. All rights reserved.
  4. */
  5. #ifndef __AMD_MANAGER_H
  6. #define __AMD_MANAGER_H
  7. #include <linux/soundwire/sdw_amd.h>
  8. #define SDW_MANAGER_REG_OFFSET 0xc00
  9. #define AMD_SDW_DEFAULT_ROWS 50
  10. #define AMD_SDW_DEFAULT_COLUMNS 10
  11. #define ACP_PAD_PULLDOWN_CTRL 0x0001448
  12. #define ACP_SW_PAD_KEEPER_EN 0x0001454
  13. #define ACP_SW0_WAKE_EN 0x0001458
  14. #define ACP_EXTERNAL_INTR_CNTL0 0x0001a04
  15. #define ACP_EXTERNAL_INTR_STAT0 0x0001a0c
  16. #define ACP_EXTERNAL_INTR_CNTL(i) (ACP_EXTERNAL_INTR_CNTL0 + ((i) * 4))
  17. #define ACP_EXTERNAL_INTR_STAT(i) (ACP_EXTERNAL_INTR_STAT0 + ((i) * 4))
  18. #define ACP_SW_WAKE_EN(i) (ACP_SW0_WAKE_EN + ((i) * 8))
  19. #define ACP_SW_EN 0x0003000
  20. #define ACP_SW_EN_STATUS 0x0003004
  21. #define ACP_SW_FRAMESIZE 0x0003008
  22. #define ACP_SW_SSP_COUNTER 0x000300c
  23. #define ACP_SW_AUDIO0_TX_EN 0x0003010
  24. #define ACP_SW_AUDIO0_TX_EN_STATUS 0x0003014
  25. #define ACP_SW_AUDIO0_TX_FRAME_FORMAT 0x0003018
  26. #define ACP_SW_AUDIO0_TX_SAMPLEINTERVAL 0x000301c
  27. #define ACP_SW_AUDIO0_TX_HCTRL_DP0 0x0003020
  28. #define ACP_SW_AUDIO0_TX_HCTRL_DP1 0x0003024
  29. #define ACP_SW_AUDIO0_TX_HCTRL_DP2 0x0003028
  30. #define ACP_SW_AUDIO0_TX_HCTRL_DP3 0x000302c
  31. #define ACP_SW_AUDIO0_TX_OFFSET_DP0 0x0003030
  32. #define ACP_SW_AUDIO0_TX_OFFSET_DP1 0x0003034
  33. #define ACP_SW_AUDIO0_TX_OFFSET_DP2 0x0003038
  34. #define ACP_SW_AUDIO0_TX_OFFSET_DP3 0x000303c
  35. #define ACP_SW_AUDIO0_TX_CHANNEL_ENABLE_DP0 0x0003040
  36. #define ACP_SW_AUDIO0_TX_CHANNEL_ENABLE_DP1 0x0003044
  37. #define ACP_SW_AUDIO0_TX_CHANNEL_ENABLE_DP2 0x0003048
  38. #define ACP_SW_AUDIO0_TX_CHANNEL_ENABLE_DP3 0x000304c
  39. #define ACP_SW_AUDIO1_TX_EN 0x0003050
  40. #define ACP_SW_AUDIO1_TX_EN_STATUS 0x0003054
  41. #define ACP_SW_AUDIO1_TX_FRAME_FORMAT 0x0003058
  42. #define ACP_SW_AUDIO1_TX_SAMPLEINTERVAL 0x000305c
  43. #define ACP_SW_AUDIO1_TX_HCTRL 0x0003060
  44. #define ACP_SW_AUDIO1_TX_OFFSET 0x0003064
  45. #define ACP_SW_AUDIO1_TX_CHANNEL_ENABLE_DP0 0x0003068
  46. #define ACP_SW_AUDIO2_TX_EN 0x000306c
  47. #define ACP_SW_AUDIO2_TX_EN_STATUS 0x0003070
  48. #define ACP_SW_AUDIO2_TX_FRAME_FORMAT 0x0003074
  49. #define ACP_SW_AUDIO2_TX_SAMPLEINTERVAL 0x0003078
  50. #define ACP_SW_AUDIO2_TX_HCTRL 0x000307c
  51. #define ACP_SW_AUDIO2_TX_OFFSET 0x0003080
  52. #define ACP_SW_AUDIO2_TX_CHANNEL_ENABLE_DP0 0x0003084
  53. #define ACP_SW_AUDIO0_RX_EN 0x0003088
  54. #define ACP_SW_AUDIO0_RX_EN_STATUS 0x000308c
  55. #define ACP_SW_AUDIO0_RX_FRAME_FORMAT 0x0003090
  56. #define ACP_SW_AUDIO0_RX_SAMPLEINTERVAL 0x0003094
  57. #define ACP_SW_AUDIO0_RX_HCTRL_DP0 0x0003098
  58. #define ACP_SW_AUDIO0_RX_HCTRL_DP1 0x000309c
  59. #define ACP_SW_AUDIO0_RX_HCTRL_DP2 0x0003100
  60. #define ACP_SW_AUDIO0_RX_HCTRL_DP3 0x0003104
  61. #define ACP_SW_AUDIO0_RX_OFFSET_DP0 0x0003108
  62. #define ACP_SW_AUDIO0_RX_OFFSET_DP1 0x000310c
  63. #define ACP_SW_AUDIO0_RX_OFFSET_DP2 0x0003110
  64. #define ACP_SW_AUDIO0_RX_OFFSET_DP3 0x0003114
  65. #define ACP_SW_AUDIO0_RX_CHANNEL_ENABLE_DP0 0x0003118
  66. #define ACP_SW_AUDIO0_RX_CHANNEL_ENABLE_DP1 0x000311c
  67. #define ACP_SW_AUDIO0_RX_CHANNEL_ENABLE_DP2 0x0003120
  68. #define ACP_SW_AUDIO0_RX_CHANNEL_ENABLE_DP3 0x0003124
  69. #define ACP_SW_AUDIO1_RX_EN 0x0003128
  70. #define ACP_SW_AUDIO1_RX_EN_STATUS 0x000312c
  71. #define ACP_SW_AUDIO1_RX_FRAME_FORMAT 0x0003130
  72. #define ACP_SW_AUDIO1_RX_SAMPLEINTERVAL 0x0003134
  73. #define ACP_SW_AUDIO1_RX_HCTRL 0x0003138
  74. #define ACP_SW_AUDIO1_RX_OFFSET 0x000313c
  75. #define ACP_SW_AUDIO1_RX_CHANNEL_ENABLE_DP0 0x0003140
  76. #define ACP_SW_AUDIO2_RX_EN 0x0003144
  77. #define ACP_SW_AUDIO2_RX_EN_STATUS 0x0003148
  78. #define ACP_SW_AUDIO2_RX_FRAME_FORMAT 0x000314c
  79. #define ACP_SW_AUDIO2_RX_SAMPLEINTERVAL 0x0003150
  80. #define ACP_SW_AUDIO2_RX_HCTRL 0x0003154
  81. #define ACP_SW_AUDIO2_RX_OFFSET 0x0003158
  82. #define ACP_SW_AUDIO2_RX_CHANNEL_ENABLE_DP0 0x000315c
  83. #define ACP_SW_BPT_PORT_EN 0x0003160
  84. #define ACP_SW_BPT_PORT_EN_STATUS 0x0003164
  85. #define ACP_SW_BPT_PORT_FRAME_FORMAT 0x0003168
  86. #define ACP_SW_BPT_PORT_SAMPLEINTERVAL 0x000316c
  87. #define ACP_SW_BPT_PORT_HCTRL 0x0003170
  88. #define ACP_SW_BPT_PORT_OFFSET 0x0003174
  89. #define ACP_SW_BPT_PORT_CHANNEL_ENABLE 0x0003178
  90. #define ACP_SW_BPT_PORT_FIRST_BYTE_ADDR 0x000317c
  91. #define ACP_SW_CLK_RESUME_CTRL 0x0003180
  92. #define ACP_SW_CLK_RESUME_DELAY_CNTR 0x0003184
  93. #define ACP_SW_BUS_RESET_CTRL 0x0003188
  94. #define ACP_SW_PRBS_ERR_STATUS 0x000318c
  95. #define ACP_SW_IMM_CMD_UPPER_WORD 0x0003230
  96. #define ACP_SW_IMM_CMD_LOWER_QWORD 0x0003234
  97. #define ACP_SW_IMM_RESP_UPPER_WORD 0x0003238
  98. #define ACP_SW_IMM_RESP_LOWER_QWORD 0x000323c
  99. #define ACP_SW_IMM_CMD_STS 0x0003240
  100. #define ACP_SW_BRA_BASE_ADDRESS 0x0003244
  101. #define ACP_SW_BRA_TRANSFER_SIZE 0x0003248
  102. #define ACP_SW_BRA_DMA_BUSY 0x000324c
  103. #define ACP_SW_BRA_RESP 0x0003250
  104. #define ACP_SW_BRA_RESP_FRAME_ADDR 0x0003254
  105. #define ACP_SW_BRA_CURRENT_TRANSFER_SIZE 0x0003258
  106. #define ACP_SW_STATE_CHANGE_STATUS_0TO7 0x000325c
  107. #define ACP_SW_STATE_CHANGE_STATUS_8TO11 0x0003260
  108. #define ACP_SW_STATE_CHANGE_STATUS_MASK_0TO7 0x0003264
  109. #define ACP_SW_STATE_CHANGE_STATUS_MASK_8TO11 0x0003268
  110. #define ACP_SW_CLK_FREQUENCY_CTRL 0x000326c
  111. #define ACP_SW_ERROR_INTR_MASK 0x0003270
  112. #define ACP_SW_PHY_TEST_MODE_DATA_OFF 0x0003274
  113. #define ACP_DELAY_US 10
  114. #define AMD_SDW_TIMEOUT 1000
  115. #define AMD_SDW_DEFAULT_CLK_FREQ 12000000
  116. #define AMD_SDW_MCP_RESP_ACK BIT(0)
  117. #define AMD_SDW_MCP_RESP_NACK BIT(1)
  118. #define AMD_SDW_MCP_RESP_RDATA GENMASK(14, 7)
  119. #define AMD_SDW_MCP_CMD_SSP_TAG BIT(31)
  120. #define AMD_SDW_MCP_CMD_COMMAND GENMASK(14, 12)
  121. #define AMD_SDW_MCP_CMD_DEV_ADDR GENMASK(11, 8)
  122. #define AMD_SDW_MCP_CMD_REG_ADDR_HIGH GENMASK(7, 0)
  123. #define AMD_SDW_MCP_CMD_REG_ADDR_LOW GENMASK(31, 24)
  124. #define AMD_SDW_MCP_CMD_REG_DATA GENMASK(14, 7)
  125. #define AMD_SDW_MCP_SLAVE_STAT_0_3 GENMASK(14, 7)
  126. #define AMD_SDW_MCP_SLAVE_STAT_4_11 GENMASK_ULL(39, 24)
  127. #define AMD_SDW_MCP_SLAVE_STATUS_MASK GENMASK(1, 0)
  128. #define AMD_SDW_MCP_SLAVE_STATUS_BITS GENMASK(3, 2)
  129. #define AMD_SDW_MCP_SLAVE_STATUS_8TO_11 GENMASK_ULL(15, 0)
  130. #define AMD_SDW_MCP_SLAVE_STATUS_VALID_MASK(x) BIT(((x) * 4))
  131. #define AMD_SDW_MCP_SLAVE_STAT_SHIFT_MASK(x) (((x) * 4) + 1)
  132. #define AMD_SDW_MASTER_SUSPEND_DELAY_MS 2000
  133. #define AMD_SDW_QUIRK_MASK_BUS_ENABLE BIT(0)
  134. #define AMD_SDW_IMM_RES_VALID 1
  135. #define AMD_SDW_IMM_CMD_BUSY 2
  136. #define AMD_SDW_ENABLE 1
  137. #define AMD_SDW_DISABLE 0
  138. #define AMD_SDW_BUS_RESET_CLEAR_REQ 0
  139. #define AMD_SDW_BUS_RESET_REQ 1
  140. #define AMD_SDW_BUS_RESET_DONE 2
  141. #define AMD_SDW_BUS_BASE_FREQ 24000000
  142. #define AMD_SDW0_EXT_INTR_MASK 0x200000
  143. #define AMD_SDW1_EXT_INTR_MASK 4
  144. #define AMD_SDW_IRQ_MASK_0TO7 0x77777777
  145. #define AMD_SDW_IRQ_MASK_8TO11 0x000c7777
  146. #define AMD_SDW_IRQ_ERROR_MASK 0xff
  147. #define AMD_SDW_MAX_FREQ_NUM 1
  148. #define AMD_SDW0_MAX_TX_PORTS 3
  149. #define AMD_SDW0_MAX_RX_PORTS 3
  150. #define AMD_SDW1_MAX_TX_PORTS 1
  151. #define AMD_SDW1_MAX_RX_PORTS 1
  152. #define AMD_SDW0_MAX_DAI 6
  153. #define AMD_SDW1_MAX_DAI 2
  154. #define AMD_SDW_SLAVE_0_ATTACHED 5
  155. #define AMD_SDW_SSP_COUNTER_VAL 3
  156. #define AMD_DPN_FRAME_FMT_PFM GENMASK(1, 0)
  157. #define AMD_DPN_FRAME_FMT_PDM GENMASK(3, 2)
  158. #define AMD_DPN_FRAME_FMT_BLK_PKG_MODE BIT(4)
  159. #define AMD_DPN_FRAME_FMT_BLK_GRP_CTRL GENMASK(6, 5)
  160. #define AMD_DPN_FRAME_FMT_WORD_LEN GENMASK(12, 7)
  161. #define AMD_DPN_FRAME_FMT_PCM_OR_PDM BIT(13)
  162. #define AMD_DPN_HCTRL_HSTOP GENMASK(3, 0)
  163. #define AMD_DPN_HCTRL_HSTART GENMASK(7, 4)
  164. #define AMD_DPN_OFFSET_CTRL_1 GENMASK(7, 0)
  165. #define AMD_DPN_OFFSET_CTRL_2 GENMASK(15, 8)
  166. #define AMD_DPN_CH_EN_LCTRL GENMASK(2, 0)
  167. #define AMD_DPN_CH_EN_CHMASK GENMASK(10, 3)
  168. #define AMD_SDW_STAT_MAX_RETRY_COUNT 100
  169. #define AMD_SDW0_PAD_PULLDOWN_CTRL_ENABLE_MASK 0x7f9f
  170. #define AMD_SDW1_PAD_PULLDOWN_CTRL_ENABLE_MASK 0x7ffa
  171. #define AMD_SDW0_PAD_PULLDOWN_CTRL_DISABLE_MASK 0x60
  172. #define AMD_SDW1_PAD_PULLDOWN_CTRL_DISABLE_MASK 5
  173. #define AMD_SDW0_PAD_KEEPER_EN_MASK 1
  174. #define AMD_SDW1_PAD_KEEPER_EN_MASK 0x10
  175. #define AMD_SDW0_PAD_KEEPER_DISABLE_MASK 0x1e
  176. #define AMD_SDW1_PAD_KEEPER_DISABLE_MASK 0xf
  177. #define AMD_SDW_PREQ_INTR_STAT BIT(19)
  178. #define AMD_SDW_CLK_STOP_DONE 1
  179. #define AMD_SDW_CLK_RESUME_REQ 2
  180. #define AMD_SDW_CLK_RESUME_DONE 3
  181. #define AMD_SDW_WAKE_STAT_MASK BIT(16)
  182. #define AMD_SDW_WAKE_INTR_MASK BIT(16)
  183. static u32 amd_sdw_freq_tbl[AMD_SDW_MAX_FREQ_NUM] = {
  184. AMD_SDW_DEFAULT_CLK_FREQ,
  185. };
  186. struct sdw_manager_dp_reg {
  187. u32 frame_fmt_reg;
  188. u32 sample_int_reg;
  189. u32 hctrl_dp0_reg;
  190. u32 offset_reg;
  191. u32 lane_ctrl_ch_en_reg;
  192. };
  193. /*
  194. * SDW0 Manager instance registers 6 CPU DAI (3 TX & 3 RX Ports)
  195. * whereas SDW1 Manager Instance registers 2 CPU DAI (one TX & one RX port)
  196. * Below is the CPU DAI <->Manager port number mapping
  197. * i.e SDW0 Pin0 -> port number 0 -> AUDIO0 TX
  198. * SDW0 Pin1 -> Port number 1 -> AUDIO1 TX
  199. * SDW0 Pin2 -> Port number 2 -> AUDIO2 TX
  200. * SDW0 Pin3 -> port number 3 -> AUDIO0 RX
  201. * SDW0 Pin4 -> Port number 4 -> AUDIO1 RX
  202. * SDW0 Pin5 -> Port number 5 -> AUDIO2 RX
  203. * Whereas for SDW1 instance
  204. * SDW1 Pin0 -> port number 0 -> AUDIO1 TX
  205. * SDW1 Pin1 -> Port number 1 -> AUDIO1 RX
  206. * Same mapping should be used for programming DMA controller registers in SoundWire DMA driver.
  207. * i.e if AUDIO0 TX channel is selected then we need to use AUDIO0 TX registers for DMA programming
  208. * in SoundWire DMA driver.
  209. */
  210. static struct sdw_manager_dp_reg sdw0_manager_dp_reg[AMD_SDW0_MAX_DAI] = {
  211. {ACP_SW_AUDIO0_TX_FRAME_FORMAT, ACP_SW_AUDIO0_TX_SAMPLEINTERVAL, ACP_SW_AUDIO0_TX_HCTRL_DP0,
  212. ACP_SW_AUDIO0_TX_OFFSET_DP0, ACP_SW_AUDIO0_TX_CHANNEL_ENABLE_DP0},
  213. {ACP_SW_AUDIO1_TX_FRAME_FORMAT, ACP_SW_AUDIO1_TX_SAMPLEINTERVAL, ACP_SW_AUDIO1_TX_HCTRL,
  214. ACP_SW_AUDIO1_TX_OFFSET, ACP_SW_AUDIO1_TX_CHANNEL_ENABLE_DP0},
  215. {ACP_SW_AUDIO2_TX_FRAME_FORMAT, ACP_SW_AUDIO2_TX_SAMPLEINTERVAL, ACP_SW_AUDIO2_TX_HCTRL,
  216. ACP_SW_AUDIO2_TX_OFFSET, ACP_SW_AUDIO2_TX_CHANNEL_ENABLE_DP0},
  217. {ACP_SW_AUDIO0_RX_FRAME_FORMAT, ACP_SW_AUDIO0_RX_SAMPLEINTERVAL, ACP_SW_AUDIO0_RX_HCTRL_DP0,
  218. ACP_SW_AUDIO0_RX_OFFSET_DP0, ACP_SW_AUDIO0_RX_CHANNEL_ENABLE_DP0},
  219. {ACP_SW_AUDIO1_RX_FRAME_FORMAT, ACP_SW_AUDIO1_RX_SAMPLEINTERVAL, ACP_SW_AUDIO1_RX_HCTRL,
  220. ACP_SW_AUDIO1_RX_OFFSET, ACP_SW_AUDIO1_RX_CHANNEL_ENABLE_DP0},
  221. {ACP_SW_AUDIO2_RX_FRAME_FORMAT, ACP_SW_AUDIO2_RX_SAMPLEINTERVAL, ACP_SW_AUDIO2_RX_HCTRL,
  222. ACP_SW_AUDIO2_RX_OFFSET, ACP_SW_AUDIO2_RX_CHANNEL_ENABLE_DP0},
  223. };
  224. static struct sdw_manager_dp_reg sdw1_manager_dp_reg[AMD_SDW1_MAX_DAI] = {
  225. {ACP_SW_AUDIO1_TX_FRAME_FORMAT, ACP_SW_AUDIO1_TX_SAMPLEINTERVAL, ACP_SW_AUDIO1_TX_HCTRL,
  226. ACP_SW_AUDIO1_TX_OFFSET, ACP_SW_AUDIO1_TX_CHANNEL_ENABLE_DP0},
  227. {ACP_SW_AUDIO1_RX_FRAME_FORMAT, ACP_SW_AUDIO1_RX_SAMPLEINTERVAL, ACP_SW_AUDIO1_RX_HCTRL,
  228. ACP_SW_AUDIO1_RX_OFFSET, ACP_SW_AUDIO1_RX_CHANNEL_ENABLE_DP0}
  229. };
  230. static u32 sdw_manager_reg_mask_array[AMD_SDW_MAX_MANAGER_COUNT] = {
  231. AMD_SDW0_EXT_INTR_MASK,
  232. AMD_SDW1_EXT_INTR_MASK
  233. };
  234. #endif