162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Cannonlake SST DSP Support
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2016-17, Intel Corporation.
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#ifndef __CNL_SST_DSP_H__
962306a36Sopenharmony_ci#define __CNL_SST_DSP_H__
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_cistruct sst_dsp;
1262306a36Sopenharmony_cistruct sst_dsp_device;
1362306a36Sopenharmony_cistruct sst_generic_ipc;
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci/* Intel HD Audio General DSP Registers */
1662306a36Sopenharmony_ci#define CNL_ADSP_GEN_BASE		0x0
1762306a36Sopenharmony_ci#define CNL_ADSP_REG_ADSPCS		(CNL_ADSP_GEN_BASE + 0x04)
1862306a36Sopenharmony_ci#define CNL_ADSP_REG_ADSPIC		(CNL_ADSP_GEN_BASE + 0x08)
1962306a36Sopenharmony_ci#define CNL_ADSP_REG_ADSPIS		(CNL_ADSP_GEN_BASE + 0x0c)
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci/* Intel HD Audio Inter-Processor Communication Registers */
2262306a36Sopenharmony_ci#define CNL_ADSP_IPC_BASE               0xc0
2362306a36Sopenharmony_ci#define CNL_ADSP_REG_HIPCTDR            (CNL_ADSP_IPC_BASE + 0x00)
2462306a36Sopenharmony_ci#define CNL_ADSP_REG_HIPCTDA            (CNL_ADSP_IPC_BASE + 0x04)
2562306a36Sopenharmony_ci#define CNL_ADSP_REG_HIPCTDD            (CNL_ADSP_IPC_BASE + 0x08)
2662306a36Sopenharmony_ci#define CNL_ADSP_REG_HIPCIDR            (CNL_ADSP_IPC_BASE + 0x10)
2762306a36Sopenharmony_ci#define CNL_ADSP_REG_HIPCIDA            (CNL_ADSP_IPC_BASE + 0x14)
2862306a36Sopenharmony_ci#define CNL_ADSP_REG_HIPCIDD            (CNL_ADSP_IPC_BASE + 0x18)
2962306a36Sopenharmony_ci#define CNL_ADSP_REG_HIPCCTL            (CNL_ADSP_IPC_BASE + 0x28)
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci/* HIPCTDR */
3262306a36Sopenharmony_ci#define CNL_ADSP_REG_HIPCTDR_BUSY	BIT(31)
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci/* HIPCTDA */
3562306a36Sopenharmony_ci#define CNL_ADSP_REG_HIPCTDA_DONE	BIT(31)
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci/* HIPCIDR */
3862306a36Sopenharmony_ci#define CNL_ADSP_REG_HIPCIDR_BUSY	BIT(31)
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci/* HIPCIDA */
4162306a36Sopenharmony_ci#define CNL_ADSP_REG_HIPCIDA_DONE	BIT(31)
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci/* CNL HIPCCTL */
4462306a36Sopenharmony_ci#define CNL_ADSP_REG_HIPCCTL_DONE	BIT(1)
4562306a36Sopenharmony_ci#define CNL_ADSP_REG_HIPCCTL_BUSY	BIT(0)
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci/* CNL HIPCT */
4862306a36Sopenharmony_ci#define CNL_ADSP_REG_HIPCT_BUSY		BIT(31)
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci/* Intel HD Audio SRAM Window 1 */
5162306a36Sopenharmony_ci#define CNL_ADSP_SRAM1_BASE		0xa0000
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci#define CNL_ADSP_MMIO_LEN		0x10000
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci#define CNL_ADSP_W0_STAT_SZ		0x1000
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci#define CNL_ADSP_W0_UP_SZ		0x1000
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci#define CNL_ADSP_W1_SZ			0x1000
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci#define CNL_FW_STS_MASK			0xf
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci#define CNL_ADSPIC_IPC			0x1
6462306a36Sopenharmony_ci#define CNL_ADSPIS_IPC			0x1
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci#define CNL_DSP_CORES		4
6762306a36Sopenharmony_ci#define CNL_DSP_CORES_MASK	((1 << CNL_DSP_CORES) - 1)
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci/* core reset - asserted high */
7062306a36Sopenharmony_ci#define CNL_ADSPCS_CRST_SHIFT	0
7162306a36Sopenharmony_ci#define CNL_ADSPCS_CRST(x)	(x << CNL_ADSPCS_CRST_SHIFT)
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci/* core run/stall - when set to 1 core is stalled */
7462306a36Sopenharmony_ci#define CNL_ADSPCS_CSTALL_SHIFT	8
7562306a36Sopenharmony_ci#define CNL_ADSPCS_CSTALL(x)	(x << CNL_ADSPCS_CSTALL_SHIFT)
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci/* set power active - when set to 1 turn core on */
7862306a36Sopenharmony_ci#define CNL_ADSPCS_SPA_SHIFT	16
7962306a36Sopenharmony_ci#define CNL_ADSPCS_SPA(x)	(x << CNL_ADSPCS_SPA_SHIFT)
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci/* current power active - power status of cores, set by hardware */
8262306a36Sopenharmony_ci#define CNL_ADSPCS_CPA_SHIFT	24
8362306a36Sopenharmony_ci#define CNL_ADSPCS_CPA(x)	(x << CNL_ADSPCS_CPA_SHIFT)
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ciint cnl_dsp_enable_core(struct sst_dsp *ctx, unsigned int core_mask);
8662306a36Sopenharmony_ciint cnl_dsp_disable_core(struct sst_dsp *ctx, unsigned int core_mask);
8762306a36Sopenharmony_ciirqreturn_t cnl_dsp_sst_interrupt(int irq, void *dev_id);
8862306a36Sopenharmony_civoid cnl_dsp_free(struct sst_dsp *dsp);
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_civoid cnl_ipc_int_enable(struct sst_dsp *ctx);
9162306a36Sopenharmony_civoid cnl_ipc_int_disable(struct sst_dsp *ctx);
9262306a36Sopenharmony_civoid cnl_ipc_op_int_enable(struct sst_dsp *ctx);
9362306a36Sopenharmony_civoid cnl_ipc_op_int_disable(struct sst_dsp *ctx);
9462306a36Sopenharmony_cibool cnl_ipc_int_status(struct sst_dsp *ctx);
9562306a36Sopenharmony_civoid cnl_ipc_free(struct sst_generic_ipc *ipc);
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ciint cnl_sst_dsp_init(struct device *dev, void __iomem *mmio_base, int irq,
9862306a36Sopenharmony_ci		     const char *fw_name, struct skl_dsp_loader_ops dsp_ops,
9962306a36Sopenharmony_ci		     struct skl_dev **dsp);
10062306a36Sopenharmony_ciint cnl_sst_init_fw(struct device *dev, struct skl_dev *skl);
10162306a36Sopenharmony_civoid cnl_sst_dsp_cleanup(struct device *dev, struct skl_dev *skl);
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_ci#endif /*__CNL_SST_DSP_H__*/
104