xref: /openbmc/linux/sound/soc/amd/ps/acp63.h (revision c900529f3d9161bfde5cca0754f83b4d3c3e0220)
14b192114Ssyed saba kareem /* SPDX-License-Identifier: GPL-2.0+ */
24b192114Ssyed saba kareem /*
34b192114Ssyed saba kareem  * AMD ALSA SoC PDM Driver
44b192114Ssyed saba kareem  *
5501c2825SCarlos Bilbao  * Copyright (C) 2022, 2023 Advanced Micro Devices, Inc. All rights reserved.
64b192114Ssyed saba kareem  */
74b192114Ssyed saba kareem 
84b192114Ssyed saba kareem #include <sound/acp63_chip_offset_byte.h>
94b192114Ssyed saba kareem 
104b192114Ssyed saba kareem #define ACP_DEVICE_ID 0x15E2
11d25ec74cSSyed Saba Kareem #define ACP63_REG_START		0x1240000
12d25ec74cSSyed Saba Kareem #define ACP63_REG_END		0x1250200
13d1351c30SVijendar Mukunda #define ACP63_DEVS		5
144b192114Ssyed saba kareem 
154b192114Ssyed saba kareem #define ACP_SOFT_RESET_SOFTRESET_AUDDONE_MASK	0x00010001
164b192114Ssyed saba kareem #define ACP_PGFSM_CNTL_POWER_ON_MASK	1
174b192114Ssyed saba kareem #define ACP_PGFSM_CNTL_POWER_OFF_MASK	0
184b192114Ssyed saba kareem #define ACP_PGFSM_STATUS_MASK		3
194b192114Ssyed saba kareem #define ACP_POWERED_ON			0
204b192114Ssyed saba kareem #define ACP_POWER_ON_IN_PROGRESS	1
214b192114Ssyed saba kareem #define ACP_POWERED_OFF		2
224b192114Ssyed saba kareem #define ACP_POWER_OFF_IN_PROGRESS	3
234b192114Ssyed saba kareem 
244b192114Ssyed saba kareem #define ACP_ERROR_MASK 0x20000000
254b192114Ssyed saba kareem #define ACP_EXT_INTR_STAT_CLEAR_MASK 0xFFFFFFFF
264b192114Ssyed saba kareem #define PDM_DMA_STAT 0x10
274b192114Ssyed saba kareem 
284b192114Ssyed saba kareem #define PDM_DMA_INTR_MASK	0x10000
294b192114Ssyed saba kareem #define ACP_ERROR_STAT	29
304b192114Ssyed saba kareem #define PDM_DECIMATION_FACTOR	2
314b192114Ssyed saba kareem #define ACP_PDM_CLK_FREQ_MASK	7
325579a966SMario Limonciello #define ACP_WOV_GAIN_CONTROL	GENMASK(4, 3)
334b192114Ssyed saba kareem #define ACP_PDM_ENABLE		1
344b192114Ssyed saba kareem #define ACP_PDM_DISABLE		0
354b192114Ssyed saba kareem #define ACP_PDM_DMA_EN_STATUS	2
364b192114Ssyed saba kareem #define TWO_CH		2
374b192114Ssyed saba kareem #define DELAY_US	5
384b192114Ssyed saba kareem #define ACP_COUNTER	20000
394b192114Ssyed saba kareem 
404b192114Ssyed saba kareem #define ACP_SRAM_PTE_OFFSET	0x03800000
414b192114Ssyed saba kareem #define PAGE_SIZE_4K_ENABLE	2
424b192114Ssyed saba kareem #define PDM_PTE_OFFSET		0
434b192114Ssyed saba kareem #define PDM_MEM_WINDOW_START	0x4000000
444b192114Ssyed saba kareem 
454b192114Ssyed saba kareem #define CAPTURE_MIN_NUM_PERIODS     4
464b192114Ssyed saba kareem #define CAPTURE_MAX_NUM_PERIODS     4
474b192114Ssyed saba kareem #define CAPTURE_MAX_PERIOD_SIZE     8192
484b192114Ssyed saba kareem #define CAPTURE_MIN_PERIOD_SIZE     4096
494b192114Ssyed saba kareem 
504b192114Ssyed saba kareem #define MAX_BUFFER (CAPTURE_MAX_PERIOD_SIZE * CAPTURE_MAX_NUM_PERIODS)
514b192114Ssyed saba kareem #define MIN_BUFFER MAX_BUFFER
524b192114Ssyed saba kareem 
534b192114Ssyed saba kareem /* time in ms for runtime suspend delay */
544b192114Ssyed saba kareem #define ACP_SUSPEND_DELAY_MS	2000
554b192114Ssyed saba kareem 
562cdabbdeSVijendar Mukunda #define ACP_DMIC_DEV	2
572cdabbdeSVijendar Mukunda 
58d1351c30SVijendar Mukunda /* ACP63_PDM_MODE_DEVS corresponds to platform devices count for ACP PDM configuration */
59d1351c30SVijendar Mukunda #define ACP63_PDM_MODE_DEVS		3
60d1351c30SVijendar Mukunda 
61d1351c30SVijendar Mukunda /*
62d1351c30SVijendar Mukunda  * ACP63_SDW0_MODE_DEVS corresponds to platform devices count for
63d1351c30SVijendar Mukunda  * SW0 SoundWire manager instance configuration
64d1351c30SVijendar Mukunda  */
65d1351c30SVijendar Mukunda #define ACP63_SDW0_MODE_DEVS		2
66d1351c30SVijendar Mukunda 
67d1351c30SVijendar Mukunda /*
68d1351c30SVijendar Mukunda  * ACP63_SDW0_SDW1_MODE_DEVS corresponds to platform devices count for SW0 + SW1 SoundWire manager
69d1351c30SVijendar Mukunda  * instances configuration
70d1351c30SVijendar Mukunda  */
71d1351c30SVijendar Mukunda #define ACP63_SDW0_SDW1_MODE_DEVS	3
72d1351c30SVijendar Mukunda 
73d1351c30SVijendar Mukunda /*
74d1351c30SVijendar Mukunda  * ACP63_SDW0_PDM_MODE_DEVS corresponds to platform devices count for SW0 manager
75d1351c30SVijendar Mukunda  * instance + ACP PDM controller configuration
76d1351c30SVijendar Mukunda  */
77d1351c30SVijendar Mukunda #define ACP63_SDW0_PDM_MODE_DEVS	4
78d1351c30SVijendar Mukunda 
79d1351c30SVijendar Mukunda /*
80d1351c30SVijendar Mukunda  * ACP63_SDW0_SDW1_PDM_MODE_DEVS corresponds to platform devices count for
81d1351c30SVijendar Mukunda  * SW0 + SW1 SoundWire manager instances + ACP PDM controller configuration
82d1351c30SVijendar Mukunda  */
83d1351c30SVijendar Mukunda #define ACP63_SDW0_SDW1_PDM_MODE_DEVS   5
84d1351c30SVijendar Mukunda #define ACP63_DMIC_ADDR			2
85d1351c30SVijendar Mukunda #define ACP63_SDW_ADDR			5
86d1351c30SVijendar Mukunda #define AMD_SDW_MAX_MANAGERS		2
87d1351c30SVijendar Mukunda 
88ea79b0a6SSyed Saba Kareem /* time in ms for acp timeout */
89ea79b0a6SSyed Saba Kareem #define ACP_TIMEOUT		500
90ea79b0a6SSyed Saba Kareem 
91d1351c30SVijendar Mukunda /* ACP63_PDM_DEV_CONFIG corresponds to platform device configuration for ACP PDM controller */
92d1351c30SVijendar Mukunda #define ACP63_PDM_DEV_CONFIG		BIT(0)
93d1351c30SVijendar Mukunda 
94d1351c30SVijendar Mukunda /* ACP63_SDW_DEV_CONFIG corresponds to platform device configuration for SDW manager instances */
95d1351c30SVijendar Mukunda #define ACP63_SDW_DEV_CONFIG		BIT(1)
96d1351c30SVijendar Mukunda 
97d1351c30SVijendar Mukunda /*
98d1351c30SVijendar Mukunda  * ACP63_SDW_PDM_DEV_CONFIG corresponds to platform device configuration for ACP PDM + SoundWire
99d1351c30SVijendar Mukunda  * manager instance combination.
100d1351c30SVijendar Mukunda  */
101d1351c30SVijendar Mukunda #define ACP63_SDW_PDM_DEV_CONFIG	GENMASK(1, 0)
102e1cb3506SVijendar Mukunda #define ACP_SDW0_STAT			BIT(21)
103e1cb3506SVijendar Mukunda #define ACP_SDW1_STAT			BIT(2)
104e1cb3506SVijendar Mukunda #define ACP_ERROR_IRQ			BIT(29)
105d1351c30SVijendar Mukunda 
106f7229173SVijendar Mukunda #define ACP_AUDIO0_TX_THRESHOLD		0x1c
107f7229173SVijendar Mukunda #define ACP_AUDIO1_TX_THRESHOLD		0x1a
108f7229173SVijendar Mukunda #define ACP_AUDIO2_TX_THRESHOLD		0x18
109f7229173SVijendar Mukunda #define ACP_AUDIO0_RX_THRESHOLD		0x1b
110f7229173SVijendar Mukunda #define ACP_AUDIO1_RX_THRESHOLD		0x19
111f7229173SVijendar Mukunda #define ACP_AUDIO2_RX_THRESHOLD		0x17
112f7229173SVijendar Mukunda #define ACP_P1_AUDIO1_TX_THRESHOLD	BIT(6)
113f7229173SVijendar Mukunda #define ACP_P1_AUDIO1_RX_THRESHOLD	BIT(5)
114f7229173SVijendar Mukunda #define ACP_SDW_DMA_IRQ_MASK		0x1F800000
115f7229173SVijendar Mukunda #define ACP_P1_SDW_DMA_IRQ_MASK		0x60
116f7229173SVijendar Mukunda #define ACP63_SDW0_DMA_MAX_STREAMS	6
117f7229173SVijendar Mukunda #define ACP63_SDW1_DMA_MAX_STREAMS	2
118f7229173SVijendar Mukunda #define ACP_P1_AUDIO_TX_THRESHOLD	6
1197beda6a2SVijendar Mukunda 
1207beda6a2SVijendar Mukunda /*
1217beda6a2SVijendar Mukunda  * Below entries describes SDW0 instance DMA stream id and DMA irq bit mapping
1227beda6a2SVijendar Mukunda  * in ACP_EXTENAL_INTR_CNTL register.
1237beda6a2SVijendar Mukunda  * Stream id		IRQ Bit
1247beda6a2SVijendar Mukunda  * 0 (SDW0_AUDIO0_TX)	28
1257beda6a2SVijendar Mukunda  * 1 (SDW0_AUDIO1_TX)	26
1267beda6a2SVijendar Mukunda  * 2 (SDW0_AUDIO2_TX)	24
1277beda6a2SVijendar Mukunda  * 3 (SDW0_AUDIO0_RX)	27
1287beda6a2SVijendar Mukunda  * 4 (SDW0_AUDIO1_RX)	25
1297beda6a2SVijendar Mukunda  * 5 (SDW0_AUDIO2_RX)	23
1307beda6a2SVijendar Mukunda  */
131f7229173SVijendar Mukunda #define SDW0_DMA_TX_IRQ_MASK(i)	(ACP_AUDIO0_TX_THRESHOLD - (2 * (i)))
132*322a163eSVijendar Mukunda #define SDW0_DMA_RX_IRQ_MASK(i)	(ACP_AUDIO0_RX_THRESHOLD - (2 * ((i) - 3)))
1337beda6a2SVijendar Mukunda 
1347beda6a2SVijendar Mukunda /*
1357beda6a2SVijendar Mukunda  * Below entries describes SDW1 instance DMA stream id and DMA irq bit mapping
1367beda6a2SVijendar Mukunda  * in ACP_EXTENAL_INTR_CNTL1 register.
1377beda6a2SVijendar Mukunda  * Stream id		IRQ Bit
1387beda6a2SVijendar Mukunda  * 0 (SDW1_AUDIO1_TX)	6
1397beda6a2SVijendar Mukunda  * 1 (SDW1_AUDIO1_RX)	5
1407beda6a2SVijendar Mukunda  */
141f7229173SVijendar Mukunda #define SDW1_DMA_IRQ_MASK(i)	(ACP_P1_AUDIO_TX_THRESHOLD - (i))
142f7229173SVijendar Mukunda 
143f7229173SVijendar Mukunda #define ACP_DELAY_US		5
144f7229173SVijendar Mukunda #define ACP_SDW_RING_BUFF_ADDR_OFFSET (128 * 1024)
145f7229173SVijendar Mukunda #define SDW0_MEM_WINDOW_START	0x4800000
146f7229173SVijendar Mukunda #define ACP_SDW_SRAM_PTE_OFFSET	0x03800400
147f7229173SVijendar Mukunda #define SDW0_PTE_OFFSET		0x400
148f7229173SVijendar Mukunda #define SDW_FIFO_SIZE		0x100
149f7229173SVijendar Mukunda #define SDW_DMA_SIZE		0x40
150f7229173SVijendar Mukunda #define ACP_SDW0_FIFO_OFFSET	0x100
151f7229173SVijendar Mukunda #define ACP_SDW_PTE_OFFSET	0x100
152f7229173SVijendar Mukunda #define SDW_FIFO_OFFSET		0x100
153f7229173SVijendar Mukunda #define SDW_PTE_OFFSET(i)	(SDW0_PTE_OFFSET + ((i) * 0x600))
154f7229173SVijendar Mukunda #define ACP_SDW_FIFO_OFFSET(i)	(ACP_SDW0_FIFO_OFFSET + ((i) * 0x500))
155f7229173SVijendar Mukunda #define SDW_MEM_WINDOW_START(i)	(SDW0_MEM_WINDOW_START + ((i) * 0xC0000))
156f7229173SVijendar Mukunda 
157f7229173SVijendar Mukunda #define SDW_PLAYBACK_MIN_NUM_PERIODS    2
158f7229173SVijendar Mukunda #define SDW_PLAYBACK_MAX_NUM_PERIODS    8
159f7229173SVijendar Mukunda #define SDW_PLAYBACK_MAX_PERIOD_SIZE    8192
160f7229173SVijendar Mukunda #define SDW_PLAYBACK_MIN_PERIOD_SIZE    1024
161f7229173SVijendar Mukunda #define SDW_CAPTURE_MIN_NUM_PERIODS     2
162f7229173SVijendar Mukunda #define SDW_CAPTURE_MAX_NUM_PERIODS     8
163f7229173SVijendar Mukunda #define SDW_CAPTURE_MAX_PERIOD_SIZE     8192
164f7229173SVijendar Mukunda #define SDW_CAPTURE_MIN_PERIOD_SIZE     1024
165f7229173SVijendar Mukunda 
166f7229173SVijendar Mukunda #define SDW_MAX_BUFFER (SDW_PLAYBACK_MAX_PERIOD_SIZE * SDW_PLAYBACK_MAX_NUM_PERIODS)
167f7229173SVijendar Mukunda #define SDW_MIN_BUFFER SDW_MAX_BUFFER
168f7229173SVijendar Mukunda 
1694b192114Ssyed saba kareem enum acp_config {
1704b192114Ssyed saba kareem 	ACP_CONFIG_0 = 0,
1714b192114Ssyed saba kareem 	ACP_CONFIG_1,
1724b192114Ssyed saba kareem 	ACP_CONFIG_2,
1734b192114Ssyed saba kareem 	ACP_CONFIG_3,
1744b192114Ssyed saba kareem 	ACP_CONFIG_4,
1754b192114Ssyed saba kareem 	ACP_CONFIG_5,
1764b192114Ssyed saba kareem 	ACP_CONFIG_6,
1774b192114Ssyed saba kareem 	ACP_CONFIG_7,
1784b192114Ssyed saba kareem 	ACP_CONFIG_8,
1794b192114Ssyed saba kareem 	ACP_CONFIG_9,
1804b192114Ssyed saba kareem 	ACP_CONFIG_10,
1814b192114Ssyed saba kareem 	ACP_CONFIG_11,
1824b192114Ssyed saba kareem 	ACP_CONFIG_12,
1834b192114Ssyed saba kareem 	ACP_CONFIG_13,
1844b192114Ssyed saba kareem 	ACP_CONFIG_14,
1854b192114Ssyed saba kareem 	ACP_CONFIG_15,
1864b192114Ssyed saba kareem };
1874b192114Ssyed saba kareem 
188298d4f7bSVijendar Mukunda enum amd_sdw0_channel {
189298d4f7bSVijendar Mukunda 	ACP_SDW0_AUDIO0_TX = 0,
190298d4f7bSVijendar Mukunda 	ACP_SDW0_AUDIO1_TX,
191298d4f7bSVijendar Mukunda 	ACP_SDW0_AUDIO2_TX,
192298d4f7bSVijendar Mukunda 	ACP_SDW0_AUDIO0_RX,
193298d4f7bSVijendar Mukunda 	ACP_SDW0_AUDIO1_RX,
194298d4f7bSVijendar Mukunda 	ACP_SDW0_AUDIO2_RX,
195298d4f7bSVijendar Mukunda };
196298d4f7bSVijendar Mukunda 
197298d4f7bSVijendar Mukunda enum amd_sdw1_channel {
198298d4f7bSVijendar Mukunda 	ACP_SDW1_AUDIO1_TX,
199298d4f7bSVijendar Mukunda 	ACP_SDW1_AUDIO1_RX,
200298d4f7bSVijendar Mukunda };
201298d4f7bSVijendar Mukunda 
2024b192114Ssyed saba kareem struct pdm_stream_instance {
2034b192114Ssyed saba kareem 	u16 num_pages;
2044b192114Ssyed saba kareem 	u16 channels;
2054b192114Ssyed saba kareem 	dma_addr_t dma_addr;
2064b192114Ssyed saba kareem 	u64 bytescount;
2074b192114Ssyed saba kareem 	void __iomem *acp63_base;
2084b192114Ssyed saba kareem };
2094b192114Ssyed saba kareem 
2104b192114Ssyed saba kareem struct pdm_dev_data {
2114b192114Ssyed saba kareem 	u32 pdm_irq;
2124b192114Ssyed saba kareem 	void __iomem *acp63_base;
21345aa83cbSVijendar Mukunda 	struct mutex *acp_lock;
2144b192114Ssyed saba kareem 	struct snd_pcm_substream *capture_stream;
2154b192114Ssyed saba kareem };
2164b192114Ssyed saba kareem 
217665dd181SVijendar Mukunda struct sdw_dma_dev_data {
218665dd181SVijendar Mukunda 	void __iomem *acp_base;
219665dd181SVijendar Mukunda 	struct mutex *acp_lock; /* used to protect acp common register access */
220f7229173SVijendar Mukunda 	struct snd_pcm_substream *sdw0_dma_stream[ACP63_SDW0_DMA_MAX_STREAMS];
221f7229173SVijendar Mukunda 	struct snd_pcm_substream *sdw1_dma_stream[ACP63_SDW1_DMA_MAX_STREAMS];
222f7229173SVijendar Mukunda };
223f7229173SVijendar Mukunda 
224f7229173SVijendar Mukunda struct acp_sdw_dma_stream {
225f7229173SVijendar Mukunda 	u16 num_pages;
226f7229173SVijendar Mukunda 	u16 channels;
227f7229173SVijendar Mukunda 	u32 stream_id;
228f7229173SVijendar Mukunda 	u32 instance;
229f7229173SVijendar Mukunda 	dma_addr_t dma_addr;
230f7229173SVijendar Mukunda 	u64 bytescount;
231f7229173SVijendar Mukunda };
232f7229173SVijendar Mukunda 
233f7229173SVijendar Mukunda union acp_sdw_dma_count {
234f7229173SVijendar Mukunda 	struct {
235f7229173SVijendar Mukunda 		u32 low;
236f7229173SVijendar Mukunda 		u32 high;
237f7229173SVijendar Mukunda 	} bcount;
238f7229173SVijendar Mukunda 	u64 bytescount;
239f7229173SVijendar Mukunda };
240f7229173SVijendar Mukunda 
241f7229173SVijendar Mukunda struct sdw_dma_ring_buf_reg {
242f7229173SVijendar Mukunda 	u32 reg_dma_size;
243f7229173SVijendar Mukunda 	u32 reg_fifo_addr;
244f7229173SVijendar Mukunda 	u32 reg_fifo_size;
245f7229173SVijendar Mukunda 	u32 reg_ring_buf_size;
246f7229173SVijendar Mukunda 	u32 reg_ring_buf_addr;
247f7229173SVijendar Mukunda 	u32 water_mark_size_reg;
248f7229173SVijendar Mukunda 	u32 pos_low_reg;
249f7229173SVijendar Mukunda 	u32 pos_high_reg;
250665dd181SVijendar Mukunda };
251665dd181SVijendar Mukunda 
252d1351c30SVijendar Mukunda /**
253d1351c30SVijendar Mukunda  * struct acp63_dev_data - acp pci driver context
254d1351c30SVijendar Mukunda  * @acp63_base: acp mmio base
255d1351c30SVijendar Mukunda  * @res: resource
256d1351c30SVijendar Mukunda  * @pdev: array of child platform device node structures
257d1351c30SVijendar Mukunda  * @acp_lock: used to protect acp common registers
258d1351c30SVijendar Mukunda  * @sdw_fw_node: SoundWire controller fw node handle
259d1351c30SVijendar Mukunda  * @pdev_config: platform device configuration
260d1351c30SVijendar Mukunda  * @pdev_count: platform devices count
261d1351c30SVijendar Mukunda  * @pdm_dev_index: pdm platform device index
262d1351c30SVijendar Mukunda  * @sdw_manager_count: SoundWire manager instance count
263d1351c30SVijendar Mukunda  * @sdw0_dev_index: SoundWire Manager-0 platform device index
264d1351c30SVijendar Mukunda  * @sdw1_dev_index: SoundWire Manager-1 platform device index
265d1351c30SVijendar Mukunda  * @sdw_dma_dev_index: SoundWire DMA controller platform device index
266298d4f7bSVijendar Mukunda  * @sdw0-dma_intr_stat: DMA interrupt status array for SoundWire manager-SW0 instance
267298d4f7bSVijendar Mukunda  * @sdw_dma_intr_stat: DMA interrupt status array for SoundWire manager-SW1 instance
268d1351c30SVijendar Mukunda  * @acp_reset: flag set to true when bus reset is applied across all
269d1351c30SVijendar Mukunda  * the active SoundWire manager instances
270d1351c30SVijendar Mukunda  */
271d1351c30SVijendar Mukunda 
2727d959775SSyed Saba Kareem struct acp63_dev_data {
2737d959775SSyed Saba Kareem 	void __iomem *acp63_base;
2747d959775SSyed Saba Kareem 	struct resource *res;
2757d959775SSyed Saba Kareem 	struct platform_device *pdev[ACP63_DEVS];
276f763fb2fSVijendar Mukunda 	struct mutex acp_lock; /* protect shared registers */
277d1351c30SVijendar Mukunda 	struct fwnode_handle *sdw_fw_node;
278d1351c30SVijendar Mukunda 	u16 pdev_config;
2792cdabbdeSVijendar Mukunda 	u16 pdev_count;
2801d325cdaSVijendar Mukunda 	u16 pdm_dev_index;
281d1351c30SVijendar Mukunda 	u8 sdw_manager_count;
282d1351c30SVijendar Mukunda 	u16 sdw0_dev_index;
283d1351c30SVijendar Mukunda 	u16 sdw1_dev_index;
284d1351c30SVijendar Mukunda 	u16 sdw_dma_dev_index;
285298d4f7bSVijendar Mukunda 	u16 sdw0_dma_intr_stat[ACP63_SDW0_DMA_MAX_STREAMS];
286298d4f7bSVijendar Mukunda 	u16 sdw1_dma_intr_stat[ACP63_SDW1_DMA_MAX_STREAMS];
287d1351c30SVijendar Mukunda 	bool acp_reset;
2887d959775SSyed Saba Kareem };
289bddcfb08SSyed Saba Kareem 
290bddcfb08SSyed Saba Kareem int snd_amd_acp_find_config(struct pci_dev *pci);
291