18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * This file is provided under a dual BSD/GPLv2 license.  When using or
48c2ecf20Sopenharmony_ci * redistributing this file, you may do so under either license.
58c2ecf20Sopenharmony_ci *
68c2ecf20Sopenharmony_ci * Copyright(c) 2017 Intel Corporation. All rights reserved.
78c2ecf20Sopenharmony_ci *
88c2ecf20Sopenharmony_ci * Author: Liam Girdwood <liam.r.girdwood@linux.intel.com>
98c2ecf20Sopenharmony_ci */
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci#ifndef __SOF_INTEL_HDA_H
128c2ecf20Sopenharmony_ci#define __SOF_INTEL_HDA_H
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci#include <linux/soundwire/sdw.h>
158c2ecf20Sopenharmony_ci#include <linux/soundwire/sdw_intel.h>
168c2ecf20Sopenharmony_ci#include <sound/compress_driver.h>
178c2ecf20Sopenharmony_ci#include <sound/hda_codec.h>
188c2ecf20Sopenharmony_ci#include <sound/hdaudio_ext.h>
198c2ecf20Sopenharmony_ci#include "shim.h"
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ci/* PCI registers */
228c2ecf20Sopenharmony_ci#define PCI_TCSEL			0x44
238c2ecf20Sopenharmony_ci#define PCI_PGCTL			PCI_TCSEL
248c2ecf20Sopenharmony_ci#define PCI_CGCTL			0x48
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_ci/* PCI_PGCTL bits */
278c2ecf20Sopenharmony_ci#define PCI_PGCTL_ADSPPGD               BIT(2)
288c2ecf20Sopenharmony_ci#define PCI_PGCTL_LSRMD_MASK		BIT(4)
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_ci/* PCI_CGCTL bits */
318c2ecf20Sopenharmony_ci#define PCI_CGCTL_MISCBDCGE_MASK	BIT(6)
328c2ecf20Sopenharmony_ci#define PCI_CGCTL_ADSPDCGE              BIT(1)
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_ci/* Legacy HDA registers and bits used - widths are variable */
358c2ecf20Sopenharmony_ci#define SOF_HDA_GCAP			0x0
368c2ecf20Sopenharmony_ci#define SOF_HDA_GCTL			0x8
378c2ecf20Sopenharmony_ci/* accept unsol. response enable */
388c2ecf20Sopenharmony_ci#define SOF_HDA_GCTL_UNSOL		BIT(8)
398c2ecf20Sopenharmony_ci#define SOF_HDA_LLCH			0x14
408c2ecf20Sopenharmony_ci#define SOF_HDA_INTCTL			0x20
418c2ecf20Sopenharmony_ci#define SOF_HDA_INTSTS			0x24
428c2ecf20Sopenharmony_ci#define SOF_HDA_WAKESTS			0x0E
438c2ecf20Sopenharmony_ci#define SOF_HDA_WAKESTS_INT_MASK	((1 << 8) - 1)
448c2ecf20Sopenharmony_ci#define SOF_HDA_RIRBSTS			0x5d
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_ci/* SOF_HDA_GCTL register bist */
478c2ecf20Sopenharmony_ci#define SOF_HDA_GCTL_RESET		BIT(0)
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_ci/* SOF_HDA_INCTL regs */
508c2ecf20Sopenharmony_ci#define SOF_HDA_INT_GLOBAL_EN		BIT(31)
518c2ecf20Sopenharmony_ci#define SOF_HDA_INT_CTRL_EN		BIT(30)
528c2ecf20Sopenharmony_ci#define SOF_HDA_INT_ALL_STREAM		0xff
538c2ecf20Sopenharmony_ci
548c2ecf20Sopenharmony_ci/* SOF_HDA_INTSTS regs */
558c2ecf20Sopenharmony_ci#define SOF_HDA_INTSTS_GIS		BIT(31)
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_ci#define SOF_HDA_MAX_CAPS		10
588c2ecf20Sopenharmony_ci#define SOF_HDA_CAP_ID_OFF		16
598c2ecf20Sopenharmony_ci#define SOF_HDA_CAP_ID_MASK		GENMASK(SOF_HDA_CAP_ID_OFF + 11,\
608c2ecf20Sopenharmony_ci						SOF_HDA_CAP_ID_OFF)
618c2ecf20Sopenharmony_ci#define SOF_HDA_CAP_NEXT_MASK		0xFFFF
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_ci#define SOF_HDA_GTS_CAP_ID			0x1
648c2ecf20Sopenharmony_ci#define SOF_HDA_ML_CAP_ID			0x2
658c2ecf20Sopenharmony_ci
668c2ecf20Sopenharmony_ci#define SOF_HDA_PP_CAP_ID		0x3
678c2ecf20Sopenharmony_ci#define SOF_HDA_REG_PP_PPCH		0x10
688c2ecf20Sopenharmony_ci#define SOF_HDA_REG_PP_PPCTL		0x04
698c2ecf20Sopenharmony_ci#define SOF_HDA_REG_PP_PPSTS		0x08
708c2ecf20Sopenharmony_ci#define SOF_HDA_PPCTL_PIE		BIT(31)
718c2ecf20Sopenharmony_ci#define SOF_HDA_PPCTL_GPROCEN		BIT(30)
728c2ecf20Sopenharmony_ci
738c2ecf20Sopenharmony_ci/*Vendor Specific Registers*/
748c2ecf20Sopenharmony_ci#define SOF_HDA_VS_D0I3C		0x104A
758c2ecf20Sopenharmony_ci
768c2ecf20Sopenharmony_ci/* D0I3C Register fields */
778c2ecf20Sopenharmony_ci#define SOF_HDA_VS_D0I3C_CIP		BIT(0) /* Command-In-Progress */
788c2ecf20Sopenharmony_ci#define SOF_HDA_VS_D0I3C_I3		BIT(2) /* D0i3 enable bit */
798c2ecf20Sopenharmony_ci
808c2ecf20Sopenharmony_ci/* DPIB entry size: 8 Bytes = 2 DWords */
818c2ecf20Sopenharmony_ci#define SOF_HDA_DPIB_ENTRY_SIZE	0x8
828c2ecf20Sopenharmony_ci
838c2ecf20Sopenharmony_ci#define SOF_HDA_SPIB_CAP_ID		0x4
848c2ecf20Sopenharmony_ci#define SOF_HDA_DRSM_CAP_ID		0x5
858c2ecf20Sopenharmony_ci
868c2ecf20Sopenharmony_ci#define SOF_HDA_SPIB_BASE		0x08
878c2ecf20Sopenharmony_ci#define SOF_HDA_SPIB_INTERVAL		0x08
888c2ecf20Sopenharmony_ci#define SOF_HDA_SPIB_SPIB		0x00
898c2ecf20Sopenharmony_ci#define SOF_HDA_SPIB_MAXFIFO		0x04
908c2ecf20Sopenharmony_ci
918c2ecf20Sopenharmony_ci#define SOF_HDA_PPHC_BASE		0x10
928c2ecf20Sopenharmony_ci#define SOF_HDA_PPHC_INTERVAL		0x10
938c2ecf20Sopenharmony_ci
948c2ecf20Sopenharmony_ci#define SOF_HDA_PPLC_BASE		0x10
958c2ecf20Sopenharmony_ci#define SOF_HDA_PPLC_MULTI		0x10
968c2ecf20Sopenharmony_ci#define SOF_HDA_PPLC_INTERVAL		0x10
978c2ecf20Sopenharmony_ci
988c2ecf20Sopenharmony_ci#define SOF_HDA_DRSM_BASE		0x08
998c2ecf20Sopenharmony_ci#define SOF_HDA_DRSM_INTERVAL		0x08
1008c2ecf20Sopenharmony_ci
1018c2ecf20Sopenharmony_ci/* Descriptor error interrupt */
1028c2ecf20Sopenharmony_ci#define SOF_HDA_CL_DMA_SD_INT_DESC_ERR		0x10
1038c2ecf20Sopenharmony_ci
1048c2ecf20Sopenharmony_ci/* FIFO error interrupt */
1058c2ecf20Sopenharmony_ci#define SOF_HDA_CL_DMA_SD_INT_FIFO_ERR		0x08
1068c2ecf20Sopenharmony_ci
1078c2ecf20Sopenharmony_ci/* Buffer completion interrupt */
1088c2ecf20Sopenharmony_ci#define SOF_HDA_CL_DMA_SD_INT_COMPLETE		0x04
1098c2ecf20Sopenharmony_ci
1108c2ecf20Sopenharmony_ci#define SOF_HDA_CL_DMA_SD_INT_MASK \
1118c2ecf20Sopenharmony_ci	(SOF_HDA_CL_DMA_SD_INT_DESC_ERR | \
1128c2ecf20Sopenharmony_ci	SOF_HDA_CL_DMA_SD_INT_FIFO_ERR | \
1138c2ecf20Sopenharmony_ci	SOF_HDA_CL_DMA_SD_INT_COMPLETE)
1148c2ecf20Sopenharmony_ci#define SOF_HDA_SD_CTL_DMA_START		0x02 /* Stream DMA start bit */
1158c2ecf20Sopenharmony_ci
1168c2ecf20Sopenharmony_ci/* Intel HD Audio Code Loader DMA Registers */
1178c2ecf20Sopenharmony_ci#define SOF_HDA_ADSP_LOADER_BASE		0x80
1188c2ecf20Sopenharmony_ci#define SOF_HDA_ADSP_DPLBASE			0x70
1198c2ecf20Sopenharmony_ci#define SOF_HDA_ADSP_DPUBASE			0x74
1208c2ecf20Sopenharmony_ci#define SOF_HDA_ADSP_DPLBASE_ENABLE		0x01
1218c2ecf20Sopenharmony_ci
1228c2ecf20Sopenharmony_ci/* Stream Registers */
1238c2ecf20Sopenharmony_ci#define SOF_HDA_ADSP_REG_CL_SD_CTL		0x00
1248c2ecf20Sopenharmony_ci#define SOF_HDA_ADSP_REG_CL_SD_STS		0x03
1258c2ecf20Sopenharmony_ci#define SOF_HDA_ADSP_REG_CL_SD_LPIB		0x04
1268c2ecf20Sopenharmony_ci#define SOF_HDA_ADSP_REG_CL_SD_CBL		0x08
1278c2ecf20Sopenharmony_ci#define SOF_HDA_ADSP_REG_CL_SD_LVI		0x0C
1288c2ecf20Sopenharmony_ci#define SOF_HDA_ADSP_REG_CL_SD_FIFOW		0x0E
1298c2ecf20Sopenharmony_ci#define SOF_HDA_ADSP_REG_CL_SD_FIFOSIZE		0x10
1308c2ecf20Sopenharmony_ci#define SOF_HDA_ADSP_REG_CL_SD_FORMAT		0x12
1318c2ecf20Sopenharmony_ci#define SOF_HDA_ADSP_REG_CL_SD_FIFOL		0x14
1328c2ecf20Sopenharmony_ci#define SOF_HDA_ADSP_REG_CL_SD_BDLPL		0x18
1338c2ecf20Sopenharmony_ci#define SOF_HDA_ADSP_REG_CL_SD_BDLPU		0x1C
1348c2ecf20Sopenharmony_ci#define SOF_HDA_ADSP_SD_ENTRY_SIZE		0x20
1358c2ecf20Sopenharmony_ci
1368c2ecf20Sopenharmony_ci/* CL: Software Position Based FIFO Capability Registers */
1378c2ecf20Sopenharmony_ci#define SOF_DSP_REG_CL_SPBFIFO \
1388c2ecf20Sopenharmony_ci	(SOF_HDA_ADSP_LOADER_BASE + 0x20)
1398c2ecf20Sopenharmony_ci#define SOF_HDA_ADSP_REG_CL_SPBFIFO_SPBFCH	0x0
1408c2ecf20Sopenharmony_ci#define SOF_HDA_ADSP_REG_CL_SPBFIFO_SPBFCCTL	0x4
1418c2ecf20Sopenharmony_ci#define SOF_HDA_ADSP_REG_CL_SPBFIFO_SPIB	0x8
1428c2ecf20Sopenharmony_ci#define SOF_HDA_ADSP_REG_CL_SPBFIFO_MAXFIFOS	0xc
1438c2ecf20Sopenharmony_ci
1448c2ecf20Sopenharmony_ci/* Stream Number */
1458c2ecf20Sopenharmony_ci#define SOF_HDA_CL_SD_CTL_STREAM_TAG_SHIFT	20
1468c2ecf20Sopenharmony_ci#define SOF_HDA_CL_SD_CTL_STREAM_TAG_MASK \
1478c2ecf20Sopenharmony_ci	GENMASK(SOF_HDA_CL_SD_CTL_STREAM_TAG_SHIFT + 3,\
1488c2ecf20Sopenharmony_ci		SOF_HDA_CL_SD_CTL_STREAM_TAG_SHIFT)
1498c2ecf20Sopenharmony_ci
1508c2ecf20Sopenharmony_ci#define HDA_DSP_HDA_BAR				0
1518c2ecf20Sopenharmony_ci#define HDA_DSP_PP_BAR				1
1528c2ecf20Sopenharmony_ci#define HDA_DSP_SPIB_BAR			2
1538c2ecf20Sopenharmony_ci#define HDA_DSP_DRSM_BAR			3
1548c2ecf20Sopenharmony_ci#define HDA_DSP_BAR				4
1558c2ecf20Sopenharmony_ci
1568c2ecf20Sopenharmony_ci#define SRAM_WINDOW_OFFSET(x)			(0x80000 + (x) * 0x20000)
1578c2ecf20Sopenharmony_ci
1588c2ecf20Sopenharmony_ci#define HDA_DSP_MBOX_OFFSET			SRAM_WINDOW_OFFSET(0)
1598c2ecf20Sopenharmony_ci
1608c2ecf20Sopenharmony_ci#define HDA_DSP_PANIC_OFFSET(x) \
1618c2ecf20Sopenharmony_ci	(((x) & 0xFFFFFF) + HDA_DSP_MBOX_OFFSET)
1628c2ecf20Sopenharmony_ci
1638c2ecf20Sopenharmony_ci/* SRAM window 0 FW "registers" */
1648c2ecf20Sopenharmony_ci#define HDA_DSP_SRAM_REG_ROM_STATUS		(HDA_DSP_MBOX_OFFSET + 0x0)
1658c2ecf20Sopenharmony_ci#define HDA_DSP_SRAM_REG_ROM_ERROR		(HDA_DSP_MBOX_OFFSET + 0x4)
1668c2ecf20Sopenharmony_ci/* FW and ROM share offset 4 */
1678c2ecf20Sopenharmony_ci#define HDA_DSP_SRAM_REG_FW_STATUS		(HDA_DSP_MBOX_OFFSET + 0x4)
1688c2ecf20Sopenharmony_ci#define HDA_DSP_SRAM_REG_FW_TRACEP		(HDA_DSP_MBOX_OFFSET + 0x8)
1698c2ecf20Sopenharmony_ci#define HDA_DSP_SRAM_REG_FW_END			(HDA_DSP_MBOX_OFFSET + 0xc)
1708c2ecf20Sopenharmony_ci
1718c2ecf20Sopenharmony_ci#define HDA_DSP_MBOX_UPLINK_OFFSET		0x81000
1728c2ecf20Sopenharmony_ci
1738c2ecf20Sopenharmony_ci#define HDA_DSP_STREAM_RESET_TIMEOUT		300
1748c2ecf20Sopenharmony_ci/*
1758c2ecf20Sopenharmony_ci * Timeout in us, for setting the stream RUN bit, during
1768c2ecf20Sopenharmony_ci * start/stop the stream. The timeout expires if new RUN bit
1778c2ecf20Sopenharmony_ci * value cannot be read back within the specified time.
1788c2ecf20Sopenharmony_ci */
1798c2ecf20Sopenharmony_ci#define HDA_DSP_STREAM_RUN_TIMEOUT		300
1808c2ecf20Sopenharmony_ci
1818c2ecf20Sopenharmony_ci#define HDA_DSP_SPIB_ENABLE			1
1828c2ecf20Sopenharmony_ci#define HDA_DSP_SPIB_DISABLE			0
1838c2ecf20Sopenharmony_ci
1848c2ecf20Sopenharmony_ci#define SOF_HDA_MAX_BUFFER_SIZE			(32 * PAGE_SIZE)
1858c2ecf20Sopenharmony_ci
1868c2ecf20Sopenharmony_ci#define HDA_DSP_STACK_DUMP_SIZE			32
1878c2ecf20Sopenharmony_ci
1888c2ecf20Sopenharmony_ci/* ROM  status/error values */
1898c2ecf20Sopenharmony_ci#define HDA_DSP_ROM_STS_MASK			GENMASK(23, 0)
1908c2ecf20Sopenharmony_ci#define HDA_DSP_ROM_INIT			0x1
1918c2ecf20Sopenharmony_ci#define HDA_DSP_ROM_FW_MANIFEST_LOADED		0x3
1928c2ecf20Sopenharmony_ci#define HDA_DSP_ROM_FW_FW_LOADED		0x4
1938c2ecf20Sopenharmony_ci#define HDA_DSP_ROM_FW_ENTERED			0x5
1948c2ecf20Sopenharmony_ci#define HDA_DSP_ROM_RFW_START			0xf
1958c2ecf20Sopenharmony_ci#define HDA_DSP_ROM_CSE_ERROR			40
1968c2ecf20Sopenharmony_ci#define HDA_DSP_ROM_CSE_WRONG_RESPONSE		41
1978c2ecf20Sopenharmony_ci#define HDA_DSP_ROM_IMR_TO_SMALL		42
1988c2ecf20Sopenharmony_ci#define HDA_DSP_ROM_BASE_FW_NOT_FOUND		43
1998c2ecf20Sopenharmony_ci#define HDA_DSP_ROM_CSE_VALIDATION_FAILED	44
2008c2ecf20Sopenharmony_ci#define HDA_DSP_ROM_IPC_FATAL_ERROR		45
2018c2ecf20Sopenharmony_ci#define HDA_DSP_ROM_L2_CACHE_ERROR		46
2028c2ecf20Sopenharmony_ci#define HDA_DSP_ROM_LOAD_OFFSET_TO_SMALL	47
2038c2ecf20Sopenharmony_ci#define HDA_DSP_ROM_API_PTR_INVALID		50
2048c2ecf20Sopenharmony_ci#define HDA_DSP_ROM_BASEFW_INCOMPAT		51
2058c2ecf20Sopenharmony_ci#define HDA_DSP_ROM_UNHANDLED_INTERRUPT		0xBEE00000
2068c2ecf20Sopenharmony_ci#define HDA_DSP_ROM_MEMORY_HOLE_ECC		0xECC00000
2078c2ecf20Sopenharmony_ci#define HDA_DSP_ROM_KERNEL_EXCEPTION		0xCAFE0000
2088c2ecf20Sopenharmony_ci#define HDA_DSP_ROM_USER_EXCEPTION		0xBEEF0000
2098c2ecf20Sopenharmony_ci#define HDA_DSP_ROM_UNEXPECTED_RESET		0xDECAF000
2108c2ecf20Sopenharmony_ci#define HDA_DSP_ROM_NULL_FW_ENTRY		0x4c4c4e55
2118c2ecf20Sopenharmony_ci#define HDA_DSP_IPC_PURGE_FW			0x01004000
2128c2ecf20Sopenharmony_ci
2138c2ecf20Sopenharmony_ci/* various timeout values */
2148c2ecf20Sopenharmony_ci#define HDA_DSP_PU_TIMEOUT		50
2158c2ecf20Sopenharmony_ci#define HDA_DSP_PD_TIMEOUT		50
2168c2ecf20Sopenharmony_ci#define HDA_DSP_RESET_TIMEOUT_US	50000
2178c2ecf20Sopenharmony_ci#define HDA_DSP_BASEFW_TIMEOUT_US       3000000
2188c2ecf20Sopenharmony_ci#define HDA_DSP_INIT_TIMEOUT_US	500000
2198c2ecf20Sopenharmony_ci#define HDA_DSP_CTRL_RESET_TIMEOUT		100
2208c2ecf20Sopenharmony_ci#define HDA_DSP_WAIT_TIMEOUT		500	/* 500 msec */
2218c2ecf20Sopenharmony_ci#define HDA_DSP_REG_POLL_INTERVAL_US		500	/* 0.5 msec */
2228c2ecf20Sopenharmony_ci#define HDA_DSP_REG_POLL_RETRY_COUNT		50
2238c2ecf20Sopenharmony_ci
2248c2ecf20Sopenharmony_ci#define HDA_DSP_ADSPIC_IPC			1
2258c2ecf20Sopenharmony_ci#define HDA_DSP_ADSPIS_IPC			1
2268c2ecf20Sopenharmony_ci
2278c2ecf20Sopenharmony_ci/* Intel HD Audio General DSP Registers */
2288c2ecf20Sopenharmony_ci#define HDA_DSP_GEN_BASE		0x0
2298c2ecf20Sopenharmony_ci#define HDA_DSP_REG_ADSPCS		(HDA_DSP_GEN_BASE + 0x04)
2308c2ecf20Sopenharmony_ci#define HDA_DSP_REG_ADSPIC		(HDA_DSP_GEN_BASE + 0x08)
2318c2ecf20Sopenharmony_ci#define HDA_DSP_REG_ADSPIS		(HDA_DSP_GEN_BASE + 0x0C)
2328c2ecf20Sopenharmony_ci#define HDA_DSP_REG_ADSPIC2		(HDA_DSP_GEN_BASE + 0x10)
2338c2ecf20Sopenharmony_ci#define HDA_DSP_REG_ADSPIS2		(HDA_DSP_GEN_BASE + 0x14)
2348c2ecf20Sopenharmony_ci
2358c2ecf20Sopenharmony_ci#define HDA_DSP_REG_ADSPIS2_SNDW	BIT(5)
2368c2ecf20Sopenharmony_ci#define HDA_DSP_REG_SNDW_WAKE_STS      0x2C192
2378c2ecf20Sopenharmony_ci
2388c2ecf20Sopenharmony_ci/* Intel HD Audio Inter-Processor Communication Registers */
2398c2ecf20Sopenharmony_ci#define HDA_DSP_IPC_BASE		0x40
2408c2ecf20Sopenharmony_ci#define HDA_DSP_REG_HIPCT		(HDA_DSP_IPC_BASE + 0x00)
2418c2ecf20Sopenharmony_ci#define HDA_DSP_REG_HIPCTE		(HDA_DSP_IPC_BASE + 0x04)
2428c2ecf20Sopenharmony_ci#define HDA_DSP_REG_HIPCI		(HDA_DSP_IPC_BASE + 0x08)
2438c2ecf20Sopenharmony_ci#define HDA_DSP_REG_HIPCIE		(HDA_DSP_IPC_BASE + 0x0C)
2448c2ecf20Sopenharmony_ci#define HDA_DSP_REG_HIPCCTL		(HDA_DSP_IPC_BASE + 0x10)
2458c2ecf20Sopenharmony_ci
2468c2ecf20Sopenharmony_ci/* Intel Vendor Specific Registers */
2478c2ecf20Sopenharmony_ci#define HDA_VS_INTEL_EM2		0x1030
2488c2ecf20Sopenharmony_ci#define HDA_VS_INTEL_EM2_L1SEN		BIT(13)
2498c2ecf20Sopenharmony_ci#define HDA_VS_INTEL_LTRP_GB_MASK	0x3F
2508c2ecf20Sopenharmony_ci
2518c2ecf20Sopenharmony_ci/*  HIPCI */
2528c2ecf20Sopenharmony_ci#define HDA_DSP_REG_HIPCI_BUSY		BIT(31)
2538c2ecf20Sopenharmony_ci#define HDA_DSP_REG_HIPCI_MSG_MASK	0x7FFFFFFF
2548c2ecf20Sopenharmony_ci
2558c2ecf20Sopenharmony_ci/* HIPCIE */
2568c2ecf20Sopenharmony_ci#define HDA_DSP_REG_HIPCIE_DONE	BIT(30)
2578c2ecf20Sopenharmony_ci#define HDA_DSP_REG_HIPCIE_MSG_MASK	0x3FFFFFFF
2588c2ecf20Sopenharmony_ci
2598c2ecf20Sopenharmony_ci/* HIPCCTL */
2608c2ecf20Sopenharmony_ci#define HDA_DSP_REG_HIPCCTL_DONE	BIT(1)
2618c2ecf20Sopenharmony_ci#define HDA_DSP_REG_HIPCCTL_BUSY	BIT(0)
2628c2ecf20Sopenharmony_ci
2638c2ecf20Sopenharmony_ci/* HIPCT */
2648c2ecf20Sopenharmony_ci#define HDA_DSP_REG_HIPCT_BUSY		BIT(31)
2658c2ecf20Sopenharmony_ci#define HDA_DSP_REG_HIPCT_MSG_MASK	0x7FFFFFFF
2668c2ecf20Sopenharmony_ci
2678c2ecf20Sopenharmony_ci/* HIPCTE */
2688c2ecf20Sopenharmony_ci#define HDA_DSP_REG_HIPCTE_MSG_MASK	0x3FFFFFFF
2698c2ecf20Sopenharmony_ci
2708c2ecf20Sopenharmony_ci#define HDA_DSP_ADSPIC_CL_DMA		0x2
2718c2ecf20Sopenharmony_ci#define HDA_DSP_ADSPIS_CL_DMA		0x2
2728c2ecf20Sopenharmony_ci
2738c2ecf20Sopenharmony_ci/* Delay before scheduling D0i3 entry */
2748c2ecf20Sopenharmony_ci#define BXT_D0I3_DELAY 5000
2758c2ecf20Sopenharmony_ci
2768c2ecf20Sopenharmony_ci#define FW_CL_STREAM_NUMBER		0x1
2778c2ecf20Sopenharmony_ci#define HDA_FW_BOOT_ATTEMPTS	3
2788c2ecf20Sopenharmony_ci
2798c2ecf20Sopenharmony_ci/* ADSPCS - Audio DSP Control & Status */
2808c2ecf20Sopenharmony_ci
2818c2ecf20Sopenharmony_ci/*
2828c2ecf20Sopenharmony_ci * Core Reset - asserted high
2838c2ecf20Sopenharmony_ci * CRST Mask for a given core mask pattern, cm
2848c2ecf20Sopenharmony_ci */
2858c2ecf20Sopenharmony_ci#define HDA_DSP_ADSPCS_CRST_SHIFT	0
2868c2ecf20Sopenharmony_ci#define HDA_DSP_ADSPCS_CRST_MASK(cm)	((cm) << HDA_DSP_ADSPCS_CRST_SHIFT)
2878c2ecf20Sopenharmony_ci
2888c2ecf20Sopenharmony_ci/*
2898c2ecf20Sopenharmony_ci * Core run/stall - when set to '1' core is stalled
2908c2ecf20Sopenharmony_ci * CSTALL Mask for a given core mask pattern, cm
2918c2ecf20Sopenharmony_ci */
2928c2ecf20Sopenharmony_ci#define HDA_DSP_ADSPCS_CSTALL_SHIFT	8
2938c2ecf20Sopenharmony_ci#define HDA_DSP_ADSPCS_CSTALL_MASK(cm)	((cm) << HDA_DSP_ADSPCS_CSTALL_SHIFT)
2948c2ecf20Sopenharmony_ci
2958c2ecf20Sopenharmony_ci/*
2968c2ecf20Sopenharmony_ci * Set Power Active - when set to '1' turn cores on
2978c2ecf20Sopenharmony_ci * SPA Mask for a given core mask pattern, cm
2988c2ecf20Sopenharmony_ci */
2998c2ecf20Sopenharmony_ci#define HDA_DSP_ADSPCS_SPA_SHIFT	16
3008c2ecf20Sopenharmony_ci#define HDA_DSP_ADSPCS_SPA_MASK(cm)	((cm) << HDA_DSP_ADSPCS_SPA_SHIFT)
3018c2ecf20Sopenharmony_ci
3028c2ecf20Sopenharmony_ci/*
3038c2ecf20Sopenharmony_ci * Current Power Active - power status of cores, set by hardware
3048c2ecf20Sopenharmony_ci * CPA Mask for a given core mask pattern, cm
3058c2ecf20Sopenharmony_ci */
3068c2ecf20Sopenharmony_ci#define HDA_DSP_ADSPCS_CPA_SHIFT	24
3078c2ecf20Sopenharmony_ci#define HDA_DSP_ADSPCS_CPA_MASK(cm)	((cm) << HDA_DSP_ADSPCS_CPA_SHIFT)
3088c2ecf20Sopenharmony_ci
3098c2ecf20Sopenharmony_ci/*
3108c2ecf20Sopenharmony_ci * Mask for a given number of cores
3118c2ecf20Sopenharmony_ci * nc = number of supported cores
3128c2ecf20Sopenharmony_ci */
3138c2ecf20Sopenharmony_ci#define SOF_DSP_CORES_MASK(nc)	GENMASK(((nc) - 1), 0)
3148c2ecf20Sopenharmony_ci
3158c2ecf20Sopenharmony_ci/* Intel HD Audio Inter-Processor Communication Registers for Cannonlake*/
3168c2ecf20Sopenharmony_ci#define CNL_DSP_IPC_BASE		0xc0
3178c2ecf20Sopenharmony_ci#define CNL_DSP_REG_HIPCTDR		(CNL_DSP_IPC_BASE + 0x00)
3188c2ecf20Sopenharmony_ci#define CNL_DSP_REG_HIPCTDA		(CNL_DSP_IPC_BASE + 0x04)
3198c2ecf20Sopenharmony_ci#define CNL_DSP_REG_HIPCTDD		(CNL_DSP_IPC_BASE + 0x08)
3208c2ecf20Sopenharmony_ci#define CNL_DSP_REG_HIPCIDR		(CNL_DSP_IPC_BASE + 0x10)
3218c2ecf20Sopenharmony_ci#define CNL_DSP_REG_HIPCIDA		(CNL_DSP_IPC_BASE + 0x14)
3228c2ecf20Sopenharmony_ci#define CNL_DSP_REG_HIPCIDD		(CNL_DSP_IPC_BASE + 0x18)
3238c2ecf20Sopenharmony_ci#define CNL_DSP_REG_HIPCCTL		(CNL_DSP_IPC_BASE + 0x28)
3248c2ecf20Sopenharmony_ci
3258c2ecf20Sopenharmony_ci/*  HIPCI */
3268c2ecf20Sopenharmony_ci#define CNL_DSP_REG_HIPCIDR_BUSY		BIT(31)
3278c2ecf20Sopenharmony_ci#define CNL_DSP_REG_HIPCIDR_MSG_MASK	0x7FFFFFFF
3288c2ecf20Sopenharmony_ci
3298c2ecf20Sopenharmony_ci/* HIPCIE */
3308c2ecf20Sopenharmony_ci#define CNL_DSP_REG_HIPCIDA_DONE	BIT(31)
3318c2ecf20Sopenharmony_ci#define CNL_DSP_REG_HIPCIDA_MSG_MASK	0x7FFFFFFF
3328c2ecf20Sopenharmony_ci
3338c2ecf20Sopenharmony_ci/* HIPCCTL */
3348c2ecf20Sopenharmony_ci#define CNL_DSP_REG_HIPCCTL_DONE	BIT(1)
3358c2ecf20Sopenharmony_ci#define CNL_DSP_REG_HIPCCTL_BUSY	BIT(0)
3368c2ecf20Sopenharmony_ci
3378c2ecf20Sopenharmony_ci/* HIPCT */
3388c2ecf20Sopenharmony_ci#define CNL_DSP_REG_HIPCTDR_BUSY		BIT(31)
3398c2ecf20Sopenharmony_ci#define CNL_DSP_REG_HIPCTDR_MSG_MASK	0x7FFFFFFF
3408c2ecf20Sopenharmony_ci
3418c2ecf20Sopenharmony_ci/* HIPCTDA */
3428c2ecf20Sopenharmony_ci#define CNL_DSP_REG_HIPCTDA_DONE	BIT(31)
3438c2ecf20Sopenharmony_ci#define CNL_DSP_REG_HIPCTDA_MSG_MASK	0x7FFFFFFF
3448c2ecf20Sopenharmony_ci
3458c2ecf20Sopenharmony_ci/* HIPCTDD */
3468c2ecf20Sopenharmony_ci#define CNL_DSP_REG_HIPCTDD_MSG_MASK	0x7FFFFFFF
3478c2ecf20Sopenharmony_ci
3488c2ecf20Sopenharmony_ci/* BDL */
3498c2ecf20Sopenharmony_ci#define HDA_DSP_BDL_SIZE			4096
3508c2ecf20Sopenharmony_ci#define HDA_DSP_MAX_BDL_ENTRIES			\
3518c2ecf20Sopenharmony_ci	(HDA_DSP_BDL_SIZE / sizeof(struct sof_intel_dsp_bdl))
3528c2ecf20Sopenharmony_ci
3538c2ecf20Sopenharmony_ci/* Number of DAIs */
3548c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA)
3558c2ecf20Sopenharmony_ci
3568c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA_PROBES)
3578c2ecf20Sopenharmony_ci#define SOF_SKL_NUM_DAIS		16
3588c2ecf20Sopenharmony_ci#else
3598c2ecf20Sopenharmony_ci#define SOF_SKL_NUM_DAIS		15
3608c2ecf20Sopenharmony_ci#endif
3618c2ecf20Sopenharmony_ci
3628c2ecf20Sopenharmony_ci#else
3638c2ecf20Sopenharmony_ci#define SOF_SKL_NUM_DAIS		8
3648c2ecf20Sopenharmony_ci#endif
3658c2ecf20Sopenharmony_ci
3668c2ecf20Sopenharmony_ci/* Intel HD Audio SRAM Window 0*/
3678c2ecf20Sopenharmony_ci#define HDA_ADSP_SRAM0_BASE_SKL		0x8000
3688c2ecf20Sopenharmony_ci
3698c2ecf20Sopenharmony_ci/* Firmware status window */
3708c2ecf20Sopenharmony_ci#define HDA_ADSP_FW_STATUS_SKL		HDA_ADSP_SRAM0_BASE_SKL
3718c2ecf20Sopenharmony_ci#define HDA_ADSP_ERROR_CODE_SKL		(HDA_ADSP_FW_STATUS_SKL + 0x4)
3728c2ecf20Sopenharmony_ci
3738c2ecf20Sopenharmony_ci/* Host Device Memory Space */
3748c2ecf20Sopenharmony_ci#define APL_SSP_BASE_OFFSET	0x2000
3758c2ecf20Sopenharmony_ci#define CNL_SSP_BASE_OFFSET	0x10000
3768c2ecf20Sopenharmony_ci
3778c2ecf20Sopenharmony_ci/* Host Device Memory Size of a Single SSP */
3788c2ecf20Sopenharmony_ci#define SSP_DEV_MEM_SIZE	0x1000
3798c2ecf20Sopenharmony_ci
3808c2ecf20Sopenharmony_ci/* SSP Count of the Platform */
3818c2ecf20Sopenharmony_ci#define APL_SSP_COUNT		6
3828c2ecf20Sopenharmony_ci#define CNL_SSP_COUNT		3
3838c2ecf20Sopenharmony_ci#define ICL_SSP_COUNT		6
3848c2ecf20Sopenharmony_ci
3858c2ecf20Sopenharmony_ci/* SSP Registers */
3868c2ecf20Sopenharmony_ci#define SSP_SSC1_OFFSET		0x4
3878c2ecf20Sopenharmony_ci#define SSP_SET_SCLK_SLAVE	BIT(25)
3888c2ecf20Sopenharmony_ci#define SSP_SET_SFRM_SLAVE	BIT(24)
3898c2ecf20Sopenharmony_ci#define SSP_SET_SLAVE		(SSP_SET_SCLK_SLAVE | SSP_SET_SFRM_SLAVE)
3908c2ecf20Sopenharmony_ci
3918c2ecf20Sopenharmony_ci#define HDA_IDISP_CODEC(x) ((x) & BIT(2))
3928c2ecf20Sopenharmony_ci
3938c2ecf20Sopenharmony_cistruct sof_intel_dsp_bdl {
3948c2ecf20Sopenharmony_ci	__le32 addr_l;
3958c2ecf20Sopenharmony_ci	__le32 addr_h;
3968c2ecf20Sopenharmony_ci	__le32 size;
3978c2ecf20Sopenharmony_ci	__le32 ioc;
3988c2ecf20Sopenharmony_ci} __attribute((packed));
3998c2ecf20Sopenharmony_ci
4008c2ecf20Sopenharmony_ci#define SOF_HDA_PLAYBACK_STREAMS	16
4018c2ecf20Sopenharmony_ci#define SOF_HDA_CAPTURE_STREAMS		16
4028c2ecf20Sopenharmony_ci#define SOF_HDA_PLAYBACK		0
4038c2ecf20Sopenharmony_ci#define SOF_HDA_CAPTURE			1
4048c2ecf20Sopenharmony_ci
4058c2ecf20Sopenharmony_ci/*
4068c2ecf20Sopenharmony_ci * Time in ms for opportunistic D0I3 entry delay.
4078c2ecf20Sopenharmony_ci * This has been deliberately chosen to be long to avoid race conditions.
4088c2ecf20Sopenharmony_ci * Could be optimized in future.
4098c2ecf20Sopenharmony_ci */
4108c2ecf20Sopenharmony_ci#define SOF_HDA_D0I3_WORK_DELAY_MS	5000
4118c2ecf20Sopenharmony_ci
4128c2ecf20Sopenharmony_ci/* HDA DSP D0 substate */
4138c2ecf20Sopenharmony_cienum sof_hda_D0_substate {
4148c2ecf20Sopenharmony_ci	SOF_HDA_DSP_PM_D0I0,	/* default D0 substate */
4158c2ecf20Sopenharmony_ci	SOF_HDA_DSP_PM_D0I3,	/* low power D0 substate */
4168c2ecf20Sopenharmony_ci};
4178c2ecf20Sopenharmony_ci
4188c2ecf20Sopenharmony_ci/* represents DSP HDA controller frontend - i.e. host facing control */
4198c2ecf20Sopenharmony_cistruct sof_intel_hda_dev {
4208c2ecf20Sopenharmony_ci	int boot_iteration;
4218c2ecf20Sopenharmony_ci
4228c2ecf20Sopenharmony_ci	struct hda_bus hbus;
4238c2ecf20Sopenharmony_ci
4248c2ecf20Sopenharmony_ci	/* hw config */
4258c2ecf20Sopenharmony_ci	const struct sof_intel_dsp_desc *desc;
4268c2ecf20Sopenharmony_ci
4278c2ecf20Sopenharmony_ci	/* trace */
4288c2ecf20Sopenharmony_ci	struct hdac_ext_stream *dtrace_stream;
4298c2ecf20Sopenharmony_ci
4308c2ecf20Sopenharmony_ci	/* if position update IPC needed */
4318c2ecf20Sopenharmony_ci	u32 no_ipc_position;
4328c2ecf20Sopenharmony_ci
4338c2ecf20Sopenharmony_ci	/* the maximum number of streams (playback + capture) supported */
4348c2ecf20Sopenharmony_ci	u32 stream_max;
4358c2ecf20Sopenharmony_ci
4368c2ecf20Sopenharmony_ci	/* PM related */
4378c2ecf20Sopenharmony_ci	bool l1_support_changed;/* during suspend, is L1SEN changed or not */
4388c2ecf20Sopenharmony_ci
4398c2ecf20Sopenharmony_ci	/* DMIC device */
4408c2ecf20Sopenharmony_ci	struct platform_device *dmic_dev;
4418c2ecf20Sopenharmony_ci
4428c2ecf20Sopenharmony_ci	/* delayed work to enter D0I3 opportunistically */
4438c2ecf20Sopenharmony_ci	struct delayed_work d0i3_work;
4448c2ecf20Sopenharmony_ci
4458c2ecf20Sopenharmony_ci	/* ACPI information stored between scan and probe steps */
4468c2ecf20Sopenharmony_ci	struct sdw_intel_acpi_info info;
4478c2ecf20Sopenharmony_ci
4488c2ecf20Sopenharmony_ci	/* sdw context allocated by SoundWire driver */
4498c2ecf20Sopenharmony_ci	struct sdw_intel_ctx *sdw;
4508c2ecf20Sopenharmony_ci};
4518c2ecf20Sopenharmony_ci
4528c2ecf20Sopenharmony_cistatic inline struct hdac_bus *sof_to_bus(struct snd_sof_dev *s)
4538c2ecf20Sopenharmony_ci{
4548c2ecf20Sopenharmony_ci	struct sof_intel_hda_dev *hda = s->pdata->hw_pdata;
4558c2ecf20Sopenharmony_ci
4568c2ecf20Sopenharmony_ci	return &hda->hbus.core;
4578c2ecf20Sopenharmony_ci}
4588c2ecf20Sopenharmony_ci
4598c2ecf20Sopenharmony_cistatic inline struct hda_bus *sof_to_hbus(struct snd_sof_dev *s)
4608c2ecf20Sopenharmony_ci{
4618c2ecf20Sopenharmony_ci	struct sof_intel_hda_dev *hda = s->pdata->hw_pdata;
4628c2ecf20Sopenharmony_ci
4638c2ecf20Sopenharmony_ci	return &hda->hbus;
4648c2ecf20Sopenharmony_ci}
4658c2ecf20Sopenharmony_ci
4668c2ecf20Sopenharmony_cistruct sof_intel_hda_stream {
4678c2ecf20Sopenharmony_ci	struct snd_sof_dev *sdev;
4688c2ecf20Sopenharmony_ci	struct hdac_ext_stream hda_stream;
4698c2ecf20Sopenharmony_ci	struct sof_intel_stream stream;
4708c2ecf20Sopenharmony_ci	int host_reserved; /* reserve host DMA channel */
4718c2ecf20Sopenharmony_ci};
4728c2ecf20Sopenharmony_ci
4738c2ecf20Sopenharmony_ci#define hstream_to_sof_hda_stream(hstream) \
4748c2ecf20Sopenharmony_ci	container_of(hstream, struct sof_intel_hda_stream, hda_stream)
4758c2ecf20Sopenharmony_ci
4768c2ecf20Sopenharmony_ci#define bus_to_sof_hda(bus) \
4778c2ecf20Sopenharmony_ci	container_of(bus, struct sof_intel_hda_dev, hbus.core)
4788c2ecf20Sopenharmony_ci
4798c2ecf20Sopenharmony_ci#define SOF_STREAM_SD_OFFSET(s) \
4808c2ecf20Sopenharmony_ci	(SOF_HDA_ADSP_SD_ENTRY_SIZE * ((s)->index) \
4818c2ecf20Sopenharmony_ci	 + SOF_HDA_ADSP_LOADER_BASE)
4828c2ecf20Sopenharmony_ci
4838c2ecf20Sopenharmony_ci/*
4848c2ecf20Sopenharmony_ci * DSP Core services.
4858c2ecf20Sopenharmony_ci */
4868c2ecf20Sopenharmony_ciint hda_dsp_probe(struct snd_sof_dev *sdev);
4878c2ecf20Sopenharmony_ciint hda_dsp_remove(struct snd_sof_dev *sdev);
4888c2ecf20Sopenharmony_ciint hda_dsp_core_reset_enter(struct snd_sof_dev *sdev,
4898c2ecf20Sopenharmony_ci			     unsigned int core_mask);
4908c2ecf20Sopenharmony_ciint hda_dsp_core_reset_leave(struct snd_sof_dev *sdev,
4918c2ecf20Sopenharmony_ci			     unsigned int core_mask);
4928c2ecf20Sopenharmony_ciint hda_dsp_core_stall_reset(struct snd_sof_dev *sdev, unsigned int core_mask);
4938c2ecf20Sopenharmony_ciint hda_dsp_core_run(struct snd_sof_dev *sdev, unsigned int core_mask);
4948c2ecf20Sopenharmony_ciint hda_dsp_core_power_up(struct snd_sof_dev *sdev, unsigned int core_mask);
4958c2ecf20Sopenharmony_ciint hda_dsp_enable_core(struct snd_sof_dev *sdev, unsigned int core_mask);
4968c2ecf20Sopenharmony_ciint hda_dsp_core_power_down(struct snd_sof_dev *sdev, unsigned int core_mask);
4978c2ecf20Sopenharmony_cibool hda_dsp_core_is_enabled(struct snd_sof_dev *sdev,
4988c2ecf20Sopenharmony_ci			     unsigned int core_mask);
4998c2ecf20Sopenharmony_ciint hda_dsp_core_reset_power_down(struct snd_sof_dev *sdev,
5008c2ecf20Sopenharmony_ci				  unsigned int core_mask);
5018c2ecf20Sopenharmony_civoid hda_dsp_ipc_int_enable(struct snd_sof_dev *sdev);
5028c2ecf20Sopenharmony_civoid hda_dsp_ipc_int_disable(struct snd_sof_dev *sdev);
5038c2ecf20Sopenharmony_ci
5048c2ecf20Sopenharmony_ciint hda_dsp_set_power_state(struct snd_sof_dev *sdev,
5058c2ecf20Sopenharmony_ci			    const struct sof_dsp_power_state *target_state);
5068c2ecf20Sopenharmony_ci
5078c2ecf20Sopenharmony_ciint hda_dsp_suspend(struct snd_sof_dev *sdev, u32 target_state);
5088c2ecf20Sopenharmony_ciint hda_dsp_resume(struct snd_sof_dev *sdev);
5098c2ecf20Sopenharmony_ciint hda_dsp_runtime_suspend(struct snd_sof_dev *sdev);
5108c2ecf20Sopenharmony_ciint hda_dsp_runtime_resume(struct snd_sof_dev *sdev);
5118c2ecf20Sopenharmony_ciint hda_dsp_runtime_idle(struct snd_sof_dev *sdev);
5128c2ecf20Sopenharmony_ciint hda_dsp_set_hw_params_upon_resume(struct snd_sof_dev *sdev);
5138c2ecf20Sopenharmony_civoid hda_dsp_dump_skl(struct snd_sof_dev *sdev, u32 flags);
5148c2ecf20Sopenharmony_civoid hda_dsp_dump(struct snd_sof_dev *sdev, u32 flags);
5158c2ecf20Sopenharmony_civoid hda_ipc_dump(struct snd_sof_dev *sdev);
5168c2ecf20Sopenharmony_civoid hda_ipc_irq_dump(struct snd_sof_dev *sdev);
5178c2ecf20Sopenharmony_civoid hda_dsp_d0i3_work(struct work_struct *work);
5188c2ecf20Sopenharmony_ci
5198c2ecf20Sopenharmony_ci/*
5208c2ecf20Sopenharmony_ci * DSP PCM Operations.
5218c2ecf20Sopenharmony_ci */
5228c2ecf20Sopenharmony_ciu32 hda_dsp_get_mult_div(struct snd_sof_dev *sdev, int rate);
5238c2ecf20Sopenharmony_ciu32 hda_dsp_get_bits(struct snd_sof_dev *sdev, int sample_bits);
5248c2ecf20Sopenharmony_ciint hda_dsp_pcm_open(struct snd_sof_dev *sdev,
5258c2ecf20Sopenharmony_ci		     struct snd_pcm_substream *substream);
5268c2ecf20Sopenharmony_ciint hda_dsp_pcm_close(struct snd_sof_dev *sdev,
5278c2ecf20Sopenharmony_ci		      struct snd_pcm_substream *substream);
5288c2ecf20Sopenharmony_ciint hda_dsp_pcm_hw_params(struct snd_sof_dev *sdev,
5298c2ecf20Sopenharmony_ci			  struct snd_pcm_substream *substream,
5308c2ecf20Sopenharmony_ci			  struct snd_pcm_hw_params *params,
5318c2ecf20Sopenharmony_ci			  struct sof_ipc_stream_params *ipc_params);
5328c2ecf20Sopenharmony_ciint hda_dsp_stream_hw_free(struct snd_sof_dev *sdev,
5338c2ecf20Sopenharmony_ci			   struct snd_pcm_substream *substream);
5348c2ecf20Sopenharmony_ciint hda_dsp_pcm_trigger(struct snd_sof_dev *sdev,
5358c2ecf20Sopenharmony_ci			struct snd_pcm_substream *substream, int cmd);
5368c2ecf20Sopenharmony_cisnd_pcm_uframes_t hda_dsp_pcm_pointer(struct snd_sof_dev *sdev,
5378c2ecf20Sopenharmony_ci				      struct snd_pcm_substream *substream);
5388c2ecf20Sopenharmony_ci
5398c2ecf20Sopenharmony_ci/*
5408c2ecf20Sopenharmony_ci * DSP Stream Operations.
5418c2ecf20Sopenharmony_ci */
5428c2ecf20Sopenharmony_ci
5438c2ecf20Sopenharmony_ciint hda_dsp_stream_init(struct snd_sof_dev *sdev);
5448c2ecf20Sopenharmony_civoid hda_dsp_stream_free(struct snd_sof_dev *sdev);
5458c2ecf20Sopenharmony_ciint hda_dsp_stream_hw_params(struct snd_sof_dev *sdev,
5468c2ecf20Sopenharmony_ci			     struct hdac_ext_stream *stream,
5478c2ecf20Sopenharmony_ci			     struct snd_dma_buffer *dmab,
5488c2ecf20Sopenharmony_ci			     struct snd_pcm_hw_params *params);
5498c2ecf20Sopenharmony_ciint hda_dsp_iccmax_stream_hw_params(struct snd_sof_dev *sdev, struct hdac_ext_stream *stream,
5508c2ecf20Sopenharmony_ci				    struct snd_dma_buffer *dmab,
5518c2ecf20Sopenharmony_ci				    struct snd_pcm_hw_params *params);
5528c2ecf20Sopenharmony_ciint hda_dsp_stream_trigger(struct snd_sof_dev *sdev,
5538c2ecf20Sopenharmony_ci			   struct hdac_ext_stream *stream, int cmd);
5548c2ecf20Sopenharmony_ciirqreturn_t hda_dsp_stream_threaded_handler(int irq, void *context);
5558c2ecf20Sopenharmony_ciint hda_dsp_stream_setup_bdl(struct snd_sof_dev *sdev,
5568c2ecf20Sopenharmony_ci			     struct snd_dma_buffer *dmab,
5578c2ecf20Sopenharmony_ci			     struct hdac_stream *stream);
5588c2ecf20Sopenharmony_cibool hda_dsp_check_ipc_irq(struct snd_sof_dev *sdev);
5598c2ecf20Sopenharmony_cibool hda_dsp_check_stream_irq(struct snd_sof_dev *sdev);
5608c2ecf20Sopenharmony_ci
5618c2ecf20Sopenharmony_cistruct hdac_ext_stream *
5628c2ecf20Sopenharmony_ci	hda_dsp_stream_get(struct snd_sof_dev *sdev, int direction);
5638c2ecf20Sopenharmony_ciint hda_dsp_stream_put(struct snd_sof_dev *sdev, int direction, int stream_tag);
5648c2ecf20Sopenharmony_ciint hda_dsp_stream_spib_config(struct snd_sof_dev *sdev,
5658c2ecf20Sopenharmony_ci			       struct hdac_ext_stream *stream,
5668c2ecf20Sopenharmony_ci			       int enable, u32 size);
5678c2ecf20Sopenharmony_ci
5688c2ecf20Sopenharmony_civoid hda_ipc_msg_data(struct snd_sof_dev *sdev,
5698c2ecf20Sopenharmony_ci		      struct snd_pcm_substream *substream,
5708c2ecf20Sopenharmony_ci		      void *p, size_t sz);
5718c2ecf20Sopenharmony_ciint hda_ipc_pcm_params(struct snd_sof_dev *sdev,
5728c2ecf20Sopenharmony_ci		       struct snd_pcm_substream *substream,
5738c2ecf20Sopenharmony_ci		       const struct sof_ipc_pcm_params_reply *reply);
5748c2ecf20Sopenharmony_ci
5758c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA_PROBES)
5768c2ecf20Sopenharmony_ci/*
5778c2ecf20Sopenharmony_ci * Probe Compress Operations.
5788c2ecf20Sopenharmony_ci */
5798c2ecf20Sopenharmony_ciint hda_probe_compr_assign(struct snd_sof_dev *sdev,
5808c2ecf20Sopenharmony_ci			   struct snd_compr_stream *cstream,
5818c2ecf20Sopenharmony_ci			   struct snd_soc_dai *dai);
5828c2ecf20Sopenharmony_ciint hda_probe_compr_free(struct snd_sof_dev *sdev,
5838c2ecf20Sopenharmony_ci			 struct snd_compr_stream *cstream,
5848c2ecf20Sopenharmony_ci			 struct snd_soc_dai *dai);
5858c2ecf20Sopenharmony_ciint hda_probe_compr_set_params(struct snd_sof_dev *sdev,
5868c2ecf20Sopenharmony_ci			       struct snd_compr_stream *cstream,
5878c2ecf20Sopenharmony_ci			       struct snd_compr_params *params,
5888c2ecf20Sopenharmony_ci			       struct snd_soc_dai *dai);
5898c2ecf20Sopenharmony_ciint hda_probe_compr_trigger(struct snd_sof_dev *sdev,
5908c2ecf20Sopenharmony_ci			    struct snd_compr_stream *cstream, int cmd,
5918c2ecf20Sopenharmony_ci			    struct snd_soc_dai *dai);
5928c2ecf20Sopenharmony_ciint hda_probe_compr_pointer(struct snd_sof_dev *sdev,
5938c2ecf20Sopenharmony_ci			    struct snd_compr_stream *cstream,
5948c2ecf20Sopenharmony_ci			    struct snd_compr_tstamp *tstamp,
5958c2ecf20Sopenharmony_ci			    struct snd_soc_dai *dai);
5968c2ecf20Sopenharmony_ci#endif
5978c2ecf20Sopenharmony_ci
5988c2ecf20Sopenharmony_ci/*
5998c2ecf20Sopenharmony_ci * DSP IPC Operations.
6008c2ecf20Sopenharmony_ci */
6018c2ecf20Sopenharmony_ciint hda_dsp_ipc_send_msg(struct snd_sof_dev *sdev,
6028c2ecf20Sopenharmony_ci			 struct snd_sof_ipc_msg *msg);
6038c2ecf20Sopenharmony_civoid hda_dsp_ipc_get_reply(struct snd_sof_dev *sdev);
6048c2ecf20Sopenharmony_ciint hda_dsp_ipc_get_mailbox_offset(struct snd_sof_dev *sdev);
6058c2ecf20Sopenharmony_ciint hda_dsp_ipc_get_window_offset(struct snd_sof_dev *sdev, u32 id);
6068c2ecf20Sopenharmony_ci
6078c2ecf20Sopenharmony_ciirqreturn_t hda_dsp_ipc_irq_thread(int irq, void *context);
6088c2ecf20Sopenharmony_ciint hda_dsp_ipc_cmd_done(struct snd_sof_dev *sdev, int dir);
6098c2ecf20Sopenharmony_ci
6108c2ecf20Sopenharmony_ci/*
6118c2ecf20Sopenharmony_ci * DSP Code loader.
6128c2ecf20Sopenharmony_ci */
6138c2ecf20Sopenharmony_ciint hda_dsp_cl_boot_firmware(struct snd_sof_dev *sdev);
6148c2ecf20Sopenharmony_ciint hda_dsp_cl_boot_firmware_iccmax(struct snd_sof_dev *sdev);
6158c2ecf20Sopenharmony_ciint hda_dsp_cl_boot_firmware_skl(struct snd_sof_dev *sdev);
6168c2ecf20Sopenharmony_ci
6178c2ecf20Sopenharmony_ci/* pre and post fw run ops */
6188c2ecf20Sopenharmony_ciint hda_dsp_pre_fw_run(struct snd_sof_dev *sdev);
6198c2ecf20Sopenharmony_ciint hda_dsp_post_fw_run(struct snd_sof_dev *sdev);
6208c2ecf20Sopenharmony_ci
6218c2ecf20Sopenharmony_ci/*
6228c2ecf20Sopenharmony_ci * HDA Controller Operations.
6238c2ecf20Sopenharmony_ci */
6248c2ecf20Sopenharmony_ciint hda_dsp_ctrl_get_caps(struct snd_sof_dev *sdev);
6258c2ecf20Sopenharmony_civoid hda_dsp_ctrl_ppcap_enable(struct snd_sof_dev *sdev, bool enable);
6268c2ecf20Sopenharmony_civoid hda_dsp_ctrl_ppcap_int_enable(struct snd_sof_dev *sdev, bool enable);
6278c2ecf20Sopenharmony_ciint hda_dsp_ctrl_link_reset(struct snd_sof_dev *sdev, bool reset);
6288c2ecf20Sopenharmony_civoid hda_dsp_ctrl_misc_clock_gating(struct snd_sof_dev *sdev, bool enable);
6298c2ecf20Sopenharmony_ciint hda_dsp_ctrl_clock_power_gating(struct snd_sof_dev *sdev, bool enable);
6308c2ecf20Sopenharmony_ciint hda_dsp_ctrl_init_chip(struct snd_sof_dev *sdev, bool full_reset);
6318c2ecf20Sopenharmony_civoid hda_dsp_ctrl_stop_chip(struct snd_sof_dev *sdev);
6328c2ecf20Sopenharmony_ci/*
6338c2ecf20Sopenharmony_ci * HDA bus operations.
6348c2ecf20Sopenharmony_ci */
6358c2ecf20Sopenharmony_civoid sof_hda_bus_init(struct hdac_bus *bus, struct device *dev);
6368c2ecf20Sopenharmony_ci
6378c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA)
6388c2ecf20Sopenharmony_ci/*
6398c2ecf20Sopenharmony_ci * HDA Codec operations.
6408c2ecf20Sopenharmony_ci */
6418c2ecf20Sopenharmony_civoid hda_codec_probe_bus(struct snd_sof_dev *sdev,
6428c2ecf20Sopenharmony_ci			 bool hda_codec_use_common_hdmi);
6438c2ecf20Sopenharmony_civoid hda_codec_jack_wake_enable(struct snd_sof_dev *sdev);
6448c2ecf20Sopenharmony_civoid hda_codec_jack_check(struct snd_sof_dev *sdev);
6458c2ecf20Sopenharmony_ci
6468c2ecf20Sopenharmony_ci#endif /* CONFIG_SND_SOC_SOF_HDA */
6478c2ecf20Sopenharmony_ci
6488c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA) && \
6498c2ecf20Sopenharmony_ci	(IS_ENABLED(CONFIG_SND_HDA_CODEC_HDMI) || \
6508c2ecf20Sopenharmony_ci	 IS_ENABLED(CONFIG_SND_SOC_HDAC_HDMI))
6518c2ecf20Sopenharmony_ci
6528c2ecf20Sopenharmony_civoid hda_codec_i915_display_power(struct snd_sof_dev *sdev, bool enable);
6538c2ecf20Sopenharmony_ciint hda_codec_i915_init(struct snd_sof_dev *sdev);
6548c2ecf20Sopenharmony_ciint hda_codec_i915_exit(struct snd_sof_dev *sdev);
6558c2ecf20Sopenharmony_ci
6568c2ecf20Sopenharmony_ci#else
6578c2ecf20Sopenharmony_ci
6588c2ecf20Sopenharmony_cistatic inline void hda_codec_i915_display_power(struct snd_sof_dev *sdev,
6598c2ecf20Sopenharmony_ci						bool enable) { }
6608c2ecf20Sopenharmony_cistatic inline int hda_codec_i915_init(struct snd_sof_dev *sdev) { return 0; }
6618c2ecf20Sopenharmony_cistatic inline int hda_codec_i915_exit(struct snd_sof_dev *sdev) { return 0; }
6628c2ecf20Sopenharmony_ci
6638c2ecf20Sopenharmony_ci#endif
6648c2ecf20Sopenharmony_ci
6658c2ecf20Sopenharmony_ci/*
6668c2ecf20Sopenharmony_ci * Trace Control.
6678c2ecf20Sopenharmony_ci */
6688c2ecf20Sopenharmony_ciint hda_dsp_trace_init(struct snd_sof_dev *sdev, u32 *stream_tag);
6698c2ecf20Sopenharmony_ciint hda_dsp_trace_release(struct snd_sof_dev *sdev);
6708c2ecf20Sopenharmony_ciint hda_dsp_trace_trigger(struct snd_sof_dev *sdev, int cmd);
6718c2ecf20Sopenharmony_ci
6728c2ecf20Sopenharmony_ci/*
6738c2ecf20Sopenharmony_ci * SoundWire support
6748c2ecf20Sopenharmony_ci */
6758c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_SND_SOC_SOF_INTEL_SOUNDWIRE)
6768c2ecf20Sopenharmony_ci
6778c2ecf20Sopenharmony_ciint hda_sdw_startup(struct snd_sof_dev *sdev);
6788c2ecf20Sopenharmony_civoid hda_sdw_int_enable(struct snd_sof_dev *sdev, bool enable);
6798c2ecf20Sopenharmony_civoid hda_sdw_process_wakeen(struct snd_sof_dev *sdev);
6808c2ecf20Sopenharmony_ci
6818c2ecf20Sopenharmony_ci#else
6828c2ecf20Sopenharmony_ci
6838c2ecf20Sopenharmony_cistatic inline int hda_sdw_acpi_scan(struct snd_sof_dev *sdev)
6848c2ecf20Sopenharmony_ci{
6858c2ecf20Sopenharmony_ci	return 0;
6868c2ecf20Sopenharmony_ci}
6878c2ecf20Sopenharmony_ci
6888c2ecf20Sopenharmony_cistatic inline int hda_sdw_probe(struct snd_sof_dev *sdev)
6898c2ecf20Sopenharmony_ci{
6908c2ecf20Sopenharmony_ci	return 0;
6918c2ecf20Sopenharmony_ci}
6928c2ecf20Sopenharmony_ci
6938c2ecf20Sopenharmony_cistatic inline int hda_sdw_startup(struct snd_sof_dev *sdev)
6948c2ecf20Sopenharmony_ci{
6958c2ecf20Sopenharmony_ci	return 0;
6968c2ecf20Sopenharmony_ci}
6978c2ecf20Sopenharmony_ci
6988c2ecf20Sopenharmony_cistatic inline int hda_sdw_exit(struct snd_sof_dev *sdev)
6998c2ecf20Sopenharmony_ci{
7008c2ecf20Sopenharmony_ci	return 0;
7018c2ecf20Sopenharmony_ci}
7028c2ecf20Sopenharmony_ci
7038c2ecf20Sopenharmony_cistatic inline void hda_sdw_int_enable(struct snd_sof_dev *sdev, bool enable)
7048c2ecf20Sopenharmony_ci{
7058c2ecf20Sopenharmony_ci}
7068c2ecf20Sopenharmony_ci
7078c2ecf20Sopenharmony_cistatic inline bool hda_dsp_check_sdw_irq(struct snd_sof_dev *sdev)
7088c2ecf20Sopenharmony_ci{
7098c2ecf20Sopenharmony_ci	return false;
7108c2ecf20Sopenharmony_ci}
7118c2ecf20Sopenharmony_ci
7128c2ecf20Sopenharmony_cistatic inline irqreturn_t hda_dsp_sdw_thread(int irq, void *context)
7138c2ecf20Sopenharmony_ci{
7148c2ecf20Sopenharmony_ci	return IRQ_HANDLED;
7158c2ecf20Sopenharmony_ci}
7168c2ecf20Sopenharmony_ci
7178c2ecf20Sopenharmony_cistatic inline bool hda_sdw_check_wakeen_irq(struct snd_sof_dev *sdev)
7188c2ecf20Sopenharmony_ci{
7198c2ecf20Sopenharmony_ci	return false;
7208c2ecf20Sopenharmony_ci}
7218c2ecf20Sopenharmony_ci
7228c2ecf20Sopenharmony_cistatic inline void hda_sdw_process_wakeen(struct snd_sof_dev *sdev)
7238c2ecf20Sopenharmony_ci{
7248c2ecf20Sopenharmony_ci}
7258c2ecf20Sopenharmony_ci#endif
7268c2ecf20Sopenharmony_ci
7278c2ecf20Sopenharmony_ci/* common dai driver */
7288c2ecf20Sopenharmony_ciextern struct snd_soc_dai_driver skl_dai[];
7298c2ecf20Sopenharmony_ci
7308c2ecf20Sopenharmony_ci/*
7318c2ecf20Sopenharmony_ci * Platform Specific HW abstraction Ops.
7328c2ecf20Sopenharmony_ci */
7338c2ecf20Sopenharmony_ciextern const struct snd_sof_dsp_ops sof_apl_ops;
7348c2ecf20Sopenharmony_ciextern const struct snd_sof_dsp_ops sof_cnl_ops;
7358c2ecf20Sopenharmony_ciextern const struct snd_sof_dsp_ops sof_tgl_ops;
7368c2ecf20Sopenharmony_ci
7378c2ecf20Sopenharmony_ciextern const struct sof_intel_dsp_desc apl_chip_info;
7388c2ecf20Sopenharmony_ciextern const struct sof_intel_dsp_desc cnl_chip_info;
7398c2ecf20Sopenharmony_ciextern const struct sof_intel_dsp_desc skl_chip_info;
7408c2ecf20Sopenharmony_ciextern const struct sof_intel_dsp_desc icl_chip_info;
7418c2ecf20Sopenharmony_ciextern const struct sof_intel_dsp_desc tgl_chip_info;
7428c2ecf20Sopenharmony_ciextern const struct sof_intel_dsp_desc tglh_chip_info;
7438c2ecf20Sopenharmony_ciextern const struct sof_intel_dsp_desc ehl_chip_info;
7448c2ecf20Sopenharmony_ciextern const struct sof_intel_dsp_desc jsl_chip_info;
7458c2ecf20Sopenharmony_ci
7468c2ecf20Sopenharmony_ci/* machine driver select */
7478c2ecf20Sopenharmony_civoid hda_machine_select(struct snd_sof_dev *sdev);
7488c2ecf20Sopenharmony_civoid hda_set_mach_params(const struct snd_soc_acpi_mach *mach,
7498c2ecf20Sopenharmony_ci			 struct device *dev);
7508c2ecf20Sopenharmony_ci
7518c2ecf20Sopenharmony_ci#endif
752