xref: /kernel/linux/linux-6.6/sound/soc/amd/ps/acp63.h (revision 62306a36)
162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0+ */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * AMD ALSA SoC PDM Driver
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2022, 2023 Advanced Micro Devices, Inc. All rights reserved.
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <sound/acp63_chip_offset_byte.h>
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#define ACP_DEVICE_ID 0x15E2
1162306a36Sopenharmony_ci#define ACP63_REG_START		0x1240000
1262306a36Sopenharmony_ci#define ACP63_REG_END		0x1250200
1362306a36Sopenharmony_ci#define ACP63_DEVS		5
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#define ACP_SOFT_RESET_SOFTRESET_AUDDONE_MASK	0x00010001
1662306a36Sopenharmony_ci#define ACP_PGFSM_CNTL_POWER_ON_MASK	1
1762306a36Sopenharmony_ci#define ACP_PGFSM_CNTL_POWER_OFF_MASK	0
1862306a36Sopenharmony_ci#define ACP_PGFSM_STATUS_MASK		3
1962306a36Sopenharmony_ci#define ACP_POWERED_ON			0
2062306a36Sopenharmony_ci#define ACP_POWER_ON_IN_PROGRESS	1
2162306a36Sopenharmony_ci#define ACP_POWERED_OFF		2
2262306a36Sopenharmony_ci#define ACP_POWER_OFF_IN_PROGRESS	3
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci#define ACP_ERROR_MASK 0x20000000
2562306a36Sopenharmony_ci#define ACP_EXT_INTR_STAT_CLEAR_MASK 0xFFFFFFFF
2662306a36Sopenharmony_ci#define PDM_DMA_STAT 0x10
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci#define PDM_DMA_INTR_MASK	0x10000
2962306a36Sopenharmony_ci#define ACP_ERROR_STAT	29
3062306a36Sopenharmony_ci#define PDM_DECIMATION_FACTOR	2
3162306a36Sopenharmony_ci#define ACP_PDM_CLK_FREQ_MASK	7
3262306a36Sopenharmony_ci#define ACP_WOV_GAIN_CONTROL	GENMASK(4, 3)
3362306a36Sopenharmony_ci#define ACP_PDM_ENABLE		1
3462306a36Sopenharmony_ci#define ACP_PDM_DISABLE		0
3562306a36Sopenharmony_ci#define ACP_PDM_DMA_EN_STATUS	2
3662306a36Sopenharmony_ci#define TWO_CH		2
3762306a36Sopenharmony_ci#define DELAY_US	5
3862306a36Sopenharmony_ci#define ACP_COUNTER	20000
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci#define ACP_SRAM_PTE_OFFSET	0x03800000
4162306a36Sopenharmony_ci#define PAGE_SIZE_4K_ENABLE	2
4262306a36Sopenharmony_ci#define PDM_PTE_OFFSET		0
4362306a36Sopenharmony_ci#define PDM_MEM_WINDOW_START	0x4000000
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci#define CAPTURE_MIN_NUM_PERIODS     4
4662306a36Sopenharmony_ci#define CAPTURE_MAX_NUM_PERIODS     4
4762306a36Sopenharmony_ci#define CAPTURE_MAX_PERIOD_SIZE     8192
4862306a36Sopenharmony_ci#define CAPTURE_MIN_PERIOD_SIZE     4096
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci#define MAX_BUFFER (CAPTURE_MAX_PERIOD_SIZE * CAPTURE_MAX_NUM_PERIODS)
5162306a36Sopenharmony_ci#define MIN_BUFFER MAX_BUFFER
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci/* time in ms for runtime suspend delay */
5462306a36Sopenharmony_ci#define ACP_SUSPEND_DELAY_MS	2000
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci#define ACP_DMIC_DEV	2
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci/* ACP63_PDM_MODE_DEVS corresponds to platform devices count for ACP PDM configuration */
5962306a36Sopenharmony_ci#define ACP63_PDM_MODE_DEVS		3
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci/*
6262306a36Sopenharmony_ci * ACP63_SDW0_MODE_DEVS corresponds to platform devices count for
6362306a36Sopenharmony_ci * SW0 SoundWire manager instance configuration
6462306a36Sopenharmony_ci */
6562306a36Sopenharmony_ci#define ACP63_SDW0_MODE_DEVS		2
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci/*
6862306a36Sopenharmony_ci * ACP63_SDW0_SDW1_MODE_DEVS corresponds to platform devices count for SW0 + SW1 SoundWire manager
6962306a36Sopenharmony_ci * instances configuration
7062306a36Sopenharmony_ci */
7162306a36Sopenharmony_ci#define ACP63_SDW0_SDW1_MODE_DEVS	3
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci/*
7462306a36Sopenharmony_ci * ACP63_SDW0_PDM_MODE_DEVS corresponds to platform devices count for SW0 manager
7562306a36Sopenharmony_ci * instance + ACP PDM controller configuration
7662306a36Sopenharmony_ci */
7762306a36Sopenharmony_ci#define ACP63_SDW0_PDM_MODE_DEVS	4
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci/*
8062306a36Sopenharmony_ci * ACP63_SDW0_SDW1_PDM_MODE_DEVS corresponds to platform devices count for
8162306a36Sopenharmony_ci * SW0 + SW1 SoundWire manager instances + ACP PDM controller configuration
8262306a36Sopenharmony_ci */
8362306a36Sopenharmony_ci#define ACP63_SDW0_SDW1_PDM_MODE_DEVS   5
8462306a36Sopenharmony_ci#define ACP63_DMIC_ADDR			2
8562306a36Sopenharmony_ci#define ACP63_SDW_ADDR			5
8662306a36Sopenharmony_ci#define AMD_SDW_MAX_MANAGERS		2
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci/* time in ms for acp timeout */
8962306a36Sopenharmony_ci#define ACP_TIMEOUT		500
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci/* ACP63_PDM_DEV_CONFIG corresponds to platform device configuration for ACP PDM controller */
9262306a36Sopenharmony_ci#define ACP63_PDM_DEV_CONFIG		BIT(0)
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci/* ACP63_SDW_DEV_CONFIG corresponds to platform device configuration for SDW manager instances */
9562306a36Sopenharmony_ci#define ACP63_SDW_DEV_CONFIG		BIT(1)
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci/*
9862306a36Sopenharmony_ci * ACP63_SDW_PDM_DEV_CONFIG corresponds to platform device configuration for ACP PDM + SoundWire
9962306a36Sopenharmony_ci * manager instance combination.
10062306a36Sopenharmony_ci */
10162306a36Sopenharmony_ci#define ACP63_SDW_PDM_DEV_CONFIG	GENMASK(1, 0)
10262306a36Sopenharmony_ci#define ACP_SDW0_STAT			BIT(21)
10362306a36Sopenharmony_ci#define ACP_SDW1_STAT			BIT(2)
10462306a36Sopenharmony_ci#define ACP_ERROR_IRQ			BIT(29)
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ci#define ACP_AUDIO0_TX_THRESHOLD		0x1c
10762306a36Sopenharmony_ci#define ACP_AUDIO1_TX_THRESHOLD		0x1a
10862306a36Sopenharmony_ci#define ACP_AUDIO2_TX_THRESHOLD		0x18
10962306a36Sopenharmony_ci#define ACP_AUDIO0_RX_THRESHOLD		0x1b
11062306a36Sopenharmony_ci#define ACP_AUDIO1_RX_THRESHOLD		0x19
11162306a36Sopenharmony_ci#define ACP_AUDIO2_RX_THRESHOLD		0x17
11262306a36Sopenharmony_ci#define ACP_P1_AUDIO1_TX_THRESHOLD	BIT(6)
11362306a36Sopenharmony_ci#define ACP_P1_AUDIO1_RX_THRESHOLD	BIT(5)
11462306a36Sopenharmony_ci#define ACP_SDW_DMA_IRQ_MASK		0x1F800000
11562306a36Sopenharmony_ci#define ACP_P1_SDW_DMA_IRQ_MASK		0x60
11662306a36Sopenharmony_ci#define ACP63_SDW0_DMA_MAX_STREAMS	6
11762306a36Sopenharmony_ci#define ACP63_SDW1_DMA_MAX_STREAMS	2
11862306a36Sopenharmony_ci#define ACP_P1_AUDIO_TX_THRESHOLD	6
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_ci/*
12162306a36Sopenharmony_ci * Below entries describes SDW0 instance DMA stream id and DMA irq bit mapping
12262306a36Sopenharmony_ci * in ACP_EXTENAL_INTR_CNTL register.
12362306a36Sopenharmony_ci * Stream id		IRQ Bit
12462306a36Sopenharmony_ci * 0 (SDW0_AUDIO0_TX)	28
12562306a36Sopenharmony_ci * 1 (SDW0_AUDIO1_TX)	26
12662306a36Sopenharmony_ci * 2 (SDW0_AUDIO2_TX)	24
12762306a36Sopenharmony_ci * 3 (SDW0_AUDIO0_RX)	27
12862306a36Sopenharmony_ci * 4 (SDW0_AUDIO1_RX)	25
12962306a36Sopenharmony_ci * 5 (SDW0_AUDIO2_RX)	23
13062306a36Sopenharmony_ci */
13162306a36Sopenharmony_ci#define SDW0_DMA_TX_IRQ_MASK(i)	(ACP_AUDIO0_TX_THRESHOLD - (2 * (i)))
13262306a36Sopenharmony_ci#define SDW0_DMA_RX_IRQ_MASK(i)	(ACP_AUDIO0_RX_THRESHOLD - (2 * ((i) - 3)))
13362306a36Sopenharmony_ci
13462306a36Sopenharmony_ci/*
13562306a36Sopenharmony_ci * Below entries describes SDW1 instance DMA stream id and DMA irq bit mapping
13662306a36Sopenharmony_ci * in ACP_EXTENAL_INTR_CNTL1 register.
13762306a36Sopenharmony_ci * Stream id		IRQ Bit
13862306a36Sopenharmony_ci * 0 (SDW1_AUDIO1_TX)	6
13962306a36Sopenharmony_ci * 1 (SDW1_AUDIO1_RX)	5
14062306a36Sopenharmony_ci */
14162306a36Sopenharmony_ci#define SDW1_DMA_IRQ_MASK(i)	(ACP_P1_AUDIO_TX_THRESHOLD - (i))
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_ci#define ACP_DELAY_US		5
14462306a36Sopenharmony_ci#define ACP_SDW_RING_BUFF_ADDR_OFFSET (128 * 1024)
14562306a36Sopenharmony_ci#define SDW0_MEM_WINDOW_START	0x4800000
14662306a36Sopenharmony_ci#define ACP_SDW_SRAM_PTE_OFFSET	0x03800400
14762306a36Sopenharmony_ci#define SDW0_PTE_OFFSET		0x400
14862306a36Sopenharmony_ci#define SDW_FIFO_SIZE		0x100
14962306a36Sopenharmony_ci#define SDW_DMA_SIZE		0x40
15062306a36Sopenharmony_ci#define ACP_SDW0_FIFO_OFFSET	0x100
15162306a36Sopenharmony_ci#define ACP_SDW_PTE_OFFSET	0x100
15262306a36Sopenharmony_ci#define SDW_FIFO_OFFSET		0x100
15362306a36Sopenharmony_ci#define SDW_PTE_OFFSET(i)	(SDW0_PTE_OFFSET + ((i) * 0x600))
15462306a36Sopenharmony_ci#define ACP_SDW_FIFO_OFFSET(i)	(ACP_SDW0_FIFO_OFFSET + ((i) * 0x500))
15562306a36Sopenharmony_ci#define SDW_MEM_WINDOW_START(i)	(SDW0_MEM_WINDOW_START + ((i) * 0xC0000))
15662306a36Sopenharmony_ci
15762306a36Sopenharmony_ci#define SDW_PLAYBACK_MIN_NUM_PERIODS    2
15862306a36Sopenharmony_ci#define SDW_PLAYBACK_MAX_NUM_PERIODS    8
15962306a36Sopenharmony_ci#define SDW_PLAYBACK_MAX_PERIOD_SIZE    8192
16062306a36Sopenharmony_ci#define SDW_PLAYBACK_MIN_PERIOD_SIZE    1024
16162306a36Sopenharmony_ci#define SDW_CAPTURE_MIN_NUM_PERIODS     2
16262306a36Sopenharmony_ci#define SDW_CAPTURE_MAX_NUM_PERIODS     8
16362306a36Sopenharmony_ci#define SDW_CAPTURE_MAX_PERIOD_SIZE     8192
16462306a36Sopenharmony_ci#define SDW_CAPTURE_MIN_PERIOD_SIZE     1024
16562306a36Sopenharmony_ci
16662306a36Sopenharmony_ci#define SDW_MAX_BUFFER (SDW_PLAYBACK_MAX_PERIOD_SIZE * SDW_PLAYBACK_MAX_NUM_PERIODS)
16762306a36Sopenharmony_ci#define SDW_MIN_BUFFER SDW_MAX_BUFFER
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_cienum acp_config {
17062306a36Sopenharmony_ci	ACP_CONFIG_0 = 0,
17162306a36Sopenharmony_ci	ACP_CONFIG_1,
17262306a36Sopenharmony_ci	ACP_CONFIG_2,
17362306a36Sopenharmony_ci	ACP_CONFIG_3,
17462306a36Sopenharmony_ci	ACP_CONFIG_4,
17562306a36Sopenharmony_ci	ACP_CONFIG_5,
17662306a36Sopenharmony_ci	ACP_CONFIG_6,
17762306a36Sopenharmony_ci	ACP_CONFIG_7,
17862306a36Sopenharmony_ci	ACP_CONFIG_8,
17962306a36Sopenharmony_ci	ACP_CONFIG_9,
18062306a36Sopenharmony_ci	ACP_CONFIG_10,
18162306a36Sopenharmony_ci	ACP_CONFIG_11,
18262306a36Sopenharmony_ci	ACP_CONFIG_12,
18362306a36Sopenharmony_ci	ACP_CONFIG_13,
18462306a36Sopenharmony_ci	ACP_CONFIG_14,
18562306a36Sopenharmony_ci	ACP_CONFIG_15,
18662306a36Sopenharmony_ci};
18762306a36Sopenharmony_ci
18862306a36Sopenharmony_cienum amd_sdw0_channel {
18962306a36Sopenharmony_ci	ACP_SDW0_AUDIO0_TX = 0,
19062306a36Sopenharmony_ci	ACP_SDW0_AUDIO1_TX,
19162306a36Sopenharmony_ci	ACP_SDW0_AUDIO2_TX,
19262306a36Sopenharmony_ci	ACP_SDW0_AUDIO0_RX,
19362306a36Sopenharmony_ci	ACP_SDW0_AUDIO1_RX,
19462306a36Sopenharmony_ci	ACP_SDW0_AUDIO2_RX,
19562306a36Sopenharmony_ci};
19662306a36Sopenharmony_ci
19762306a36Sopenharmony_cienum amd_sdw1_channel {
19862306a36Sopenharmony_ci	ACP_SDW1_AUDIO1_TX,
19962306a36Sopenharmony_ci	ACP_SDW1_AUDIO1_RX,
20062306a36Sopenharmony_ci};
20162306a36Sopenharmony_ci
20262306a36Sopenharmony_cistruct pdm_stream_instance {
20362306a36Sopenharmony_ci	u16 num_pages;
20462306a36Sopenharmony_ci	u16 channels;
20562306a36Sopenharmony_ci	dma_addr_t dma_addr;
20662306a36Sopenharmony_ci	u64 bytescount;
20762306a36Sopenharmony_ci	void __iomem *acp63_base;
20862306a36Sopenharmony_ci};
20962306a36Sopenharmony_ci
21062306a36Sopenharmony_cistruct pdm_dev_data {
21162306a36Sopenharmony_ci	u32 pdm_irq;
21262306a36Sopenharmony_ci	void __iomem *acp63_base;
21362306a36Sopenharmony_ci	struct mutex *acp_lock;
21462306a36Sopenharmony_ci	struct snd_pcm_substream *capture_stream;
21562306a36Sopenharmony_ci};
21662306a36Sopenharmony_ci
21762306a36Sopenharmony_cistruct sdw_dma_dev_data {
21862306a36Sopenharmony_ci	void __iomem *acp_base;
21962306a36Sopenharmony_ci	struct mutex *acp_lock; /* used to protect acp common register access */
22062306a36Sopenharmony_ci	struct snd_pcm_substream *sdw0_dma_stream[ACP63_SDW0_DMA_MAX_STREAMS];
22162306a36Sopenharmony_ci	struct snd_pcm_substream *sdw1_dma_stream[ACP63_SDW1_DMA_MAX_STREAMS];
22262306a36Sopenharmony_ci};
22362306a36Sopenharmony_ci
22462306a36Sopenharmony_cistruct acp_sdw_dma_stream {
22562306a36Sopenharmony_ci	u16 num_pages;
22662306a36Sopenharmony_ci	u16 channels;
22762306a36Sopenharmony_ci	u32 stream_id;
22862306a36Sopenharmony_ci	u32 instance;
22962306a36Sopenharmony_ci	dma_addr_t dma_addr;
23062306a36Sopenharmony_ci	u64 bytescount;
23162306a36Sopenharmony_ci};
23262306a36Sopenharmony_ci
23362306a36Sopenharmony_ciunion acp_sdw_dma_count {
23462306a36Sopenharmony_ci	struct {
23562306a36Sopenharmony_ci		u32 low;
23662306a36Sopenharmony_ci		u32 high;
23762306a36Sopenharmony_ci	} bcount;
23862306a36Sopenharmony_ci	u64 bytescount;
23962306a36Sopenharmony_ci};
24062306a36Sopenharmony_ci
24162306a36Sopenharmony_cistruct sdw_dma_ring_buf_reg {
24262306a36Sopenharmony_ci	u32 reg_dma_size;
24362306a36Sopenharmony_ci	u32 reg_fifo_addr;
24462306a36Sopenharmony_ci	u32 reg_fifo_size;
24562306a36Sopenharmony_ci	u32 reg_ring_buf_size;
24662306a36Sopenharmony_ci	u32 reg_ring_buf_addr;
24762306a36Sopenharmony_ci	u32 water_mark_size_reg;
24862306a36Sopenharmony_ci	u32 pos_low_reg;
24962306a36Sopenharmony_ci	u32 pos_high_reg;
25062306a36Sopenharmony_ci};
25162306a36Sopenharmony_ci
25262306a36Sopenharmony_ci/**
25362306a36Sopenharmony_ci * struct acp63_dev_data - acp pci driver context
25462306a36Sopenharmony_ci * @acp63_base: acp mmio base
25562306a36Sopenharmony_ci * @res: resource
25662306a36Sopenharmony_ci * @pdev: array of child platform device node structures
25762306a36Sopenharmony_ci * @acp_lock: used to protect acp common registers
25862306a36Sopenharmony_ci * @sdw_fw_node: SoundWire controller fw node handle
25962306a36Sopenharmony_ci * @pdev_config: platform device configuration
26062306a36Sopenharmony_ci * @pdev_count: platform devices count
26162306a36Sopenharmony_ci * @pdm_dev_index: pdm platform device index
26262306a36Sopenharmony_ci * @sdw_manager_count: SoundWire manager instance count
26362306a36Sopenharmony_ci * @sdw0_dev_index: SoundWire Manager-0 platform device index
26462306a36Sopenharmony_ci * @sdw1_dev_index: SoundWire Manager-1 platform device index
26562306a36Sopenharmony_ci * @sdw_dma_dev_index: SoundWire DMA controller platform device index
26662306a36Sopenharmony_ci * @sdw0-dma_intr_stat: DMA interrupt status array for SoundWire manager-SW0 instance
26762306a36Sopenharmony_ci * @sdw_dma_intr_stat: DMA interrupt status array for SoundWire manager-SW1 instance
26862306a36Sopenharmony_ci * @acp_reset: flag set to true when bus reset is applied across all
26962306a36Sopenharmony_ci * the active SoundWire manager instances
27062306a36Sopenharmony_ci */
27162306a36Sopenharmony_ci
27262306a36Sopenharmony_cistruct acp63_dev_data {
27362306a36Sopenharmony_ci	void __iomem *acp63_base;
27462306a36Sopenharmony_ci	struct resource *res;
27562306a36Sopenharmony_ci	struct platform_device *pdev[ACP63_DEVS];
27662306a36Sopenharmony_ci	struct mutex acp_lock; /* protect shared registers */
27762306a36Sopenharmony_ci	struct fwnode_handle *sdw_fw_node;
27862306a36Sopenharmony_ci	u16 pdev_config;
27962306a36Sopenharmony_ci	u16 pdev_count;
28062306a36Sopenharmony_ci	u16 pdm_dev_index;
28162306a36Sopenharmony_ci	u8 sdw_manager_count;
28262306a36Sopenharmony_ci	u16 sdw0_dev_index;
28362306a36Sopenharmony_ci	u16 sdw1_dev_index;
28462306a36Sopenharmony_ci	u16 sdw_dma_dev_index;
28562306a36Sopenharmony_ci	u16 sdw0_dma_intr_stat[ACP63_SDW0_DMA_MAX_STREAMS];
28662306a36Sopenharmony_ci	u16 sdw1_dma_intr_stat[ACP63_SDW1_DMA_MAX_STREAMS];
28762306a36Sopenharmony_ci	bool acp_reset;
28862306a36Sopenharmony_ci};
28962306a36Sopenharmony_ci
29062306a36Sopenharmony_ciint snd_amd_acp_find_config(struct pci_dev *pci);
291