xref: /kernel/linux/linux-5.10/sound/soc/sof/sof-priv.h (revision 8c2ecf20)
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) 2018 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 __SOUND_SOC_SOF_PRIV_H
128c2ecf20Sopenharmony_ci#define __SOUND_SOC_SOF_PRIV_H
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci#include <linux/device.h>
158c2ecf20Sopenharmony_ci#include <sound/hdaudio.h>
168c2ecf20Sopenharmony_ci#include <sound/sof.h>
178c2ecf20Sopenharmony_ci#include <sound/sof/info.h>
188c2ecf20Sopenharmony_ci#include <sound/sof/pm.h>
198c2ecf20Sopenharmony_ci#include <sound/sof/trace.h>
208c2ecf20Sopenharmony_ci#include <uapi/sound/sof/fw.h>
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ci/* debug flags */
238c2ecf20Sopenharmony_ci#define SOF_DBG_ENABLE_TRACE	BIT(0)
248c2ecf20Sopenharmony_ci#define SOF_DBG_REGS		BIT(1)
258c2ecf20Sopenharmony_ci#define SOF_DBG_MBOX		BIT(2)
268c2ecf20Sopenharmony_ci#define SOF_DBG_TEXT		BIT(3)
278c2ecf20Sopenharmony_ci#define SOF_DBG_PCI		BIT(4)
288c2ecf20Sopenharmony_ci#define SOF_DBG_RETAIN_CTX	BIT(5)	/* prevent DSP D3 on FW exception */
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_ci/* global debug state set by SOF_DBG_ flags */
318c2ecf20Sopenharmony_ciextern int sof_core_debug;
328c2ecf20Sopenharmony_ci
338c2ecf20Sopenharmony_ci/* max BARs mmaped devices can use */
348c2ecf20Sopenharmony_ci#define SND_SOF_BARS	8
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_ci/* time in ms for runtime suspend delay */
378c2ecf20Sopenharmony_ci#define SND_SOF_SUSPEND_DELAY_MS	2000
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci/* DMA buffer size for trace */
408c2ecf20Sopenharmony_ci#define DMA_BUF_SIZE_FOR_TRACE (PAGE_SIZE * 16)
418c2ecf20Sopenharmony_ci
428c2ecf20Sopenharmony_ci#define SOF_IPC_DSP_REPLY		0
438c2ecf20Sopenharmony_ci#define SOF_IPC_HOST_REPLY		1
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_ci/* convenience constructor for DAI driver streams */
468c2ecf20Sopenharmony_ci#define SOF_DAI_STREAM(sname, scmin, scmax, srates, sfmt) \
478c2ecf20Sopenharmony_ci	{.stream_name = sname, .channels_min = scmin, .channels_max = scmax, \
488c2ecf20Sopenharmony_ci	 .rates = srates, .formats = sfmt}
498c2ecf20Sopenharmony_ci
508c2ecf20Sopenharmony_ci#define SOF_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE | \
518c2ecf20Sopenharmony_ci	SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_FLOAT)
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_ci#define ENABLE_DEBUGFS_CACHEBUF \
548c2ecf20Sopenharmony_ci	(IS_ENABLED(CONFIG_SND_SOC_SOF_DEBUG_ENABLE_DEBUGFS_CACHE) || \
558c2ecf20Sopenharmony_ci	 IS_ENABLED(CONFIG_SND_SOC_SOF_DEBUG_IPC_FLOOD_TEST))
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_ci/* So far the primary core on all DSPs has ID 0 */
588c2ecf20Sopenharmony_ci#define SOF_DSP_PRIMARY_CORE 0
598c2ecf20Sopenharmony_ci
608c2ecf20Sopenharmony_ci/* DSP power state */
618c2ecf20Sopenharmony_cienum sof_dsp_power_states {
628c2ecf20Sopenharmony_ci	SOF_DSP_PM_D0,
638c2ecf20Sopenharmony_ci	SOF_DSP_PM_D1,
648c2ecf20Sopenharmony_ci	SOF_DSP_PM_D2,
658c2ecf20Sopenharmony_ci	SOF_DSP_PM_D3_HOT,
668c2ecf20Sopenharmony_ci	SOF_DSP_PM_D3,
678c2ecf20Sopenharmony_ci	SOF_DSP_PM_D3_COLD,
688c2ecf20Sopenharmony_ci};
698c2ecf20Sopenharmony_ci
708c2ecf20Sopenharmony_cistruct sof_dsp_power_state {
718c2ecf20Sopenharmony_ci	u32 state;
728c2ecf20Sopenharmony_ci	u32 substate; /* platform-specific */
738c2ecf20Sopenharmony_ci};
748c2ecf20Sopenharmony_ci
758c2ecf20Sopenharmony_ci/* System suspend target state */
768c2ecf20Sopenharmony_cienum sof_system_suspend_state {
778c2ecf20Sopenharmony_ci	SOF_SUSPEND_NONE = 0,
788c2ecf20Sopenharmony_ci	SOF_SUSPEND_S0IX,
798c2ecf20Sopenharmony_ci	SOF_SUSPEND_S3,
808c2ecf20Sopenharmony_ci};
818c2ecf20Sopenharmony_ci
828c2ecf20Sopenharmony_cistruct snd_sof_dev;
838c2ecf20Sopenharmony_cistruct snd_sof_ipc_msg;
848c2ecf20Sopenharmony_cistruct snd_sof_ipc;
858c2ecf20Sopenharmony_cistruct snd_sof_debugfs_map;
868c2ecf20Sopenharmony_cistruct snd_soc_tplg_ops;
878c2ecf20Sopenharmony_cistruct snd_soc_component;
888c2ecf20Sopenharmony_cistruct snd_sof_pdata;
898c2ecf20Sopenharmony_ci
908c2ecf20Sopenharmony_ci/*
918c2ecf20Sopenharmony_ci * SOF DSP HW abstraction operations.
928c2ecf20Sopenharmony_ci * Used to abstract DSP HW architecture and any IO busses between host CPU
938c2ecf20Sopenharmony_ci * and DSP device(s).
948c2ecf20Sopenharmony_ci */
958c2ecf20Sopenharmony_cistruct snd_sof_dsp_ops {
968c2ecf20Sopenharmony_ci
978c2ecf20Sopenharmony_ci	/* probe and remove */
988c2ecf20Sopenharmony_ci	int (*probe)(struct snd_sof_dev *sof_dev); /* mandatory */
998c2ecf20Sopenharmony_ci	int (*remove)(struct snd_sof_dev *sof_dev); /* optional */
1008c2ecf20Sopenharmony_ci
1018c2ecf20Sopenharmony_ci	/* DSP core boot / reset */
1028c2ecf20Sopenharmony_ci	int (*run)(struct snd_sof_dev *sof_dev); /* mandatory */
1038c2ecf20Sopenharmony_ci	int (*stall)(struct snd_sof_dev *sof_dev); /* optional */
1048c2ecf20Sopenharmony_ci	int (*reset)(struct snd_sof_dev *sof_dev); /* optional */
1058c2ecf20Sopenharmony_ci	int (*core_power_up)(struct snd_sof_dev *sof_dev,
1068c2ecf20Sopenharmony_ci			     unsigned int core_mask); /* optional */
1078c2ecf20Sopenharmony_ci	int (*core_power_down)(struct snd_sof_dev *sof_dev,
1088c2ecf20Sopenharmony_ci			       unsigned int core_mask); /* optional */
1098c2ecf20Sopenharmony_ci
1108c2ecf20Sopenharmony_ci	/*
1118c2ecf20Sopenharmony_ci	 * Register IO: only used by respective drivers themselves,
1128c2ecf20Sopenharmony_ci	 * TODO: consider removing these operations and calling respective
1138c2ecf20Sopenharmony_ci	 * implementations directly
1148c2ecf20Sopenharmony_ci	 */
1158c2ecf20Sopenharmony_ci	void (*write)(struct snd_sof_dev *sof_dev, void __iomem *addr,
1168c2ecf20Sopenharmony_ci		      u32 value); /* optional */
1178c2ecf20Sopenharmony_ci	u32 (*read)(struct snd_sof_dev *sof_dev,
1188c2ecf20Sopenharmony_ci		    void __iomem *addr); /* optional */
1198c2ecf20Sopenharmony_ci	void (*write64)(struct snd_sof_dev *sof_dev, void __iomem *addr,
1208c2ecf20Sopenharmony_ci			u64 value); /* optional */
1218c2ecf20Sopenharmony_ci	u64 (*read64)(struct snd_sof_dev *sof_dev,
1228c2ecf20Sopenharmony_ci		      void __iomem *addr); /* optional */
1238c2ecf20Sopenharmony_ci
1248c2ecf20Sopenharmony_ci	/* memcpy IO */
1258c2ecf20Sopenharmony_ci	void (*block_read)(struct snd_sof_dev *sof_dev, u32 bar,
1268c2ecf20Sopenharmony_ci			   u32 offset, void *dest,
1278c2ecf20Sopenharmony_ci			   size_t size); /* mandatory */
1288c2ecf20Sopenharmony_ci	void (*block_write)(struct snd_sof_dev *sof_dev, u32 bar,
1298c2ecf20Sopenharmony_ci			    u32 offset, void *src,
1308c2ecf20Sopenharmony_ci			    size_t size); /* mandatory */
1318c2ecf20Sopenharmony_ci
1328c2ecf20Sopenharmony_ci	/* doorbell */
1338c2ecf20Sopenharmony_ci	irqreturn_t (*irq_handler)(int irq, void *context); /* optional */
1348c2ecf20Sopenharmony_ci	irqreturn_t (*irq_thread)(int irq, void *context); /* optional */
1358c2ecf20Sopenharmony_ci
1368c2ecf20Sopenharmony_ci	/* ipc */
1378c2ecf20Sopenharmony_ci	int (*send_msg)(struct snd_sof_dev *sof_dev,
1388c2ecf20Sopenharmony_ci			struct snd_sof_ipc_msg *msg); /* mandatory */
1398c2ecf20Sopenharmony_ci
1408c2ecf20Sopenharmony_ci	/* FW loading */
1418c2ecf20Sopenharmony_ci	int (*load_firmware)(struct snd_sof_dev *sof_dev); /* mandatory */
1428c2ecf20Sopenharmony_ci	int (*load_module)(struct snd_sof_dev *sof_dev,
1438c2ecf20Sopenharmony_ci			   struct snd_sof_mod_hdr *hdr); /* optional */
1448c2ecf20Sopenharmony_ci	/*
1458c2ecf20Sopenharmony_ci	 * FW ready checks for ABI compatibility and creates
1468c2ecf20Sopenharmony_ci	 * memory windows at first boot
1478c2ecf20Sopenharmony_ci	 */
1488c2ecf20Sopenharmony_ci	int (*fw_ready)(struct snd_sof_dev *sdev, u32 msg_id); /* mandatory */
1498c2ecf20Sopenharmony_ci
1508c2ecf20Sopenharmony_ci	/* connect pcm substream to a host stream */
1518c2ecf20Sopenharmony_ci	int (*pcm_open)(struct snd_sof_dev *sdev,
1528c2ecf20Sopenharmony_ci			struct snd_pcm_substream *substream); /* optional */
1538c2ecf20Sopenharmony_ci	/* disconnect pcm substream to a host stream */
1548c2ecf20Sopenharmony_ci	int (*pcm_close)(struct snd_sof_dev *sdev,
1558c2ecf20Sopenharmony_ci			 struct snd_pcm_substream *substream); /* optional */
1568c2ecf20Sopenharmony_ci
1578c2ecf20Sopenharmony_ci	/* host stream hw params */
1588c2ecf20Sopenharmony_ci	int (*pcm_hw_params)(struct snd_sof_dev *sdev,
1598c2ecf20Sopenharmony_ci			     struct snd_pcm_substream *substream,
1608c2ecf20Sopenharmony_ci			     struct snd_pcm_hw_params *params,
1618c2ecf20Sopenharmony_ci			     struct sof_ipc_stream_params *ipc_params); /* optional */
1628c2ecf20Sopenharmony_ci
1638c2ecf20Sopenharmony_ci	/* host stream hw_free */
1648c2ecf20Sopenharmony_ci	int (*pcm_hw_free)(struct snd_sof_dev *sdev,
1658c2ecf20Sopenharmony_ci			   struct snd_pcm_substream *substream); /* optional */
1668c2ecf20Sopenharmony_ci
1678c2ecf20Sopenharmony_ci	/* host stream trigger */
1688c2ecf20Sopenharmony_ci	int (*pcm_trigger)(struct snd_sof_dev *sdev,
1698c2ecf20Sopenharmony_ci			   struct snd_pcm_substream *substream,
1708c2ecf20Sopenharmony_ci			   int cmd); /* optional */
1718c2ecf20Sopenharmony_ci
1728c2ecf20Sopenharmony_ci	/* host stream pointer */
1738c2ecf20Sopenharmony_ci	snd_pcm_uframes_t (*pcm_pointer)(struct snd_sof_dev *sdev,
1748c2ecf20Sopenharmony_ci					 struct snd_pcm_substream *substream); /* optional */
1758c2ecf20Sopenharmony_ci
1768c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_SND_SOC_SOF_DEBUG_PROBES)
1778c2ecf20Sopenharmony_ci	/* Except for probe_pointer, all probe ops are mandatory */
1788c2ecf20Sopenharmony_ci	int (*probe_assign)(struct snd_sof_dev *sdev,
1798c2ecf20Sopenharmony_ci			struct snd_compr_stream *cstream,
1808c2ecf20Sopenharmony_ci			struct snd_soc_dai *dai); /* mandatory */
1818c2ecf20Sopenharmony_ci	int (*probe_free)(struct snd_sof_dev *sdev,
1828c2ecf20Sopenharmony_ci			struct snd_compr_stream *cstream,
1838c2ecf20Sopenharmony_ci			struct snd_soc_dai *dai); /* mandatory */
1848c2ecf20Sopenharmony_ci	int (*probe_set_params)(struct snd_sof_dev *sdev,
1858c2ecf20Sopenharmony_ci			struct snd_compr_stream *cstream,
1868c2ecf20Sopenharmony_ci			struct snd_compr_params *params,
1878c2ecf20Sopenharmony_ci			struct snd_soc_dai *dai); /* mandatory */
1888c2ecf20Sopenharmony_ci	int (*probe_trigger)(struct snd_sof_dev *sdev,
1898c2ecf20Sopenharmony_ci			struct snd_compr_stream *cstream, int cmd,
1908c2ecf20Sopenharmony_ci			struct snd_soc_dai *dai); /* mandatory */
1918c2ecf20Sopenharmony_ci	int (*probe_pointer)(struct snd_sof_dev *sdev,
1928c2ecf20Sopenharmony_ci			struct snd_compr_stream *cstream,
1938c2ecf20Sopenharmony_ci			struct snd_compr_tstamp *tstamp,
1948c2ecf20Sopenharmony_ci			struct snd_soc_dai *dai); /* optional */
1958c2ecf20Sopenharmony_ci#endif
1968c2ecf20Sopenharmony_ci
1978c2ecf20Sopenharmony_ci	/* host read DSP stream data */
1988c2ecf20Sopenharmony_ci	void (*ipc_msg_data)(struct snd_sof_dev *sdev,
1998c2ecf20Sopenharmony_ci			     struct snd_pcm_substream *substream,
2008c2ecf20Sopenharmony_ci			     void *p, size_t sz); /* mandatory */
2018c2ecf20Sopenharmony_ci
2028c2ecf20Sopenharmony_ci	/* host configure DSP HW parameters */
2038c2ecf20Sopenharmony_ci	int (*ipc_pcm_params)(struct snd_sof_dev *sdev,
2048c2ecf20Sopenharmony_ci			      struct snd_pcm_substream *substream,
2058c2ecf20Sopenharmony_ci			      const struct sof_ipc_pcm_params_reply *reply); /* mandatory */
2068c2ecf20Sopenharmony_ci
2078c2ecf20Sopenharmony_ci	/* pre/post firmware run */
2088c2ecf20Sopenharmony_ci	int (*pre_fw_run)(struct snd_sof_dev *sof_dev); /* optional */
2098c2ecf20Sopenharmony_ci	int (*post_fw_run)(struct snd_sof_dev *sof_dev); /* optional */
2108c2ecf20Sopenharmony_ci
2118c2ecf20Sopenharmony_ci	/* DSP PM */
2128c2ecf20Sopenharmony_ci	int (*suspend)(struct snd_sof_dev *sof_dev,
2138c2ecf20Sopenharmony_ci		       u32 target_state); /* optional */
2148c2ecf20Sopenharmony_ci	int (*resume)(struct snd_sof_dev *sof_dev); /* optional */
2158c2ecf20Sopenharmony_ci	int (*runtime_suspend)(struct snd_sof_dev *sof_dev); /* optional */
2168c2ecf20Sopenharmony_ci	int (*runtime_resume)(struct snd_sof_dev *sof_dev); /* optional */
2178c2ecf20Sopenharmony_ci	int (*runtime_idle)(struct snd_sof_dev *sof_dev); /* optional */
2188c2ecf20Sopenharmony_ci	int (*set_hw_params_upon_resume)(struct snd_sof_dev *sdev); /* optional */
2198c2ecf20Sopenharmony_ci	int (*set_power_state)(struct snd_sof_dev *sdev,
2208c2ecf20Sopenharmony_ci			       const struct sof_dsp_power_state *target_state); /* optional */
2218c2ecf20Sopenharmony_ci
2228c2ecf20Sopenharmony_ci	/* DSP clocking */
2238c2ecf20Sopenharmony_ci	int (*set_clk)(struct snd_sof_dev *sof_dev, u32 freq); /* optional */
2248c2ecf20Sopenharmony_ci
2258c2ecf20Sopenharmony_ci	/* debug */
2268c2ecf20Sopenharmony_ci	const struct snd_sof_debugfs_map *debug_map; /* optional */
2278c2ecf20Sopenharmony_ci	int debug_map_count; /* optional */
2288c2ecf20Sopenharmony_ci	void (*dbg_dump)(struct snd_sof_dev *sof_dev,
2298c2ecf20Sopenharmony_ci			 u32 flags); /* optional */
2308c2ecf20Sopenharmony_ci	void (*ipc_dump)(struct snd_sof_dev *sof_dev); /* optional */
2318c2ecf20Sopenharmony_ci
2328c2ecf20Sopenharmony_ci	/* host DMA trace initialization */
2338c2ecf20Sopenharmony_ci	int (*trace_init)(struct snd_sof_dev *sdev,
2348c2ecf20Sopenharmony_ci			  u32 *stream_tag); /* optional */
2358c2ecf20Sopenharmony_ci	int (*trace_release)(struct snd_sof_dev *sdev); /* optional */
2368c2ecf20Sopenharmony_ci	int (*trace_trigger)(struct snd_sof_dev *sdev,
2378c2ecf20Sopenharmony_ci			     int cmd); /* optional */
2388c2ecf20Sopenharmony_ci
2398c2ecf20Sopenharmony_ci	/* misc */
2408c2ecf20Sopenharmony_ci	int (*get_bar_index)(struct snd_sof_dev *sdev,
2418c2ecf20Sopenharmony_ci			     u32 type); /* optional */
2428c2ecf20Sopenharmony_ci	int (*get_mailbox_offset)(struct snd_sof_dev *sdev);/* mandatory for common loader code */
2438c2ecf20Sopenharmony_ci	int (*get_window_offset)(struct snd_sof_dev *sdev,
2448c2ecf20Sopenharmony_ci				 u32 id);/* mandatory for common loader code */
2458c2ecf20Sopenharmony_ci
2468c2ecf20Sopenharmony_ci	/* machine driver ops */
2478c2ecf20Sopenharmony_ci	int (*machine_register)(struct snd_sof_dev *sdev,
2488c2ecf20Sopenharmony_ci				void *pdata); /* optional */
2498c2ecf20Sopenharmony_ci	void (*machine_unregister)(struct snd_sof_dev *sdev,
2508c2ecf20Sopenharmony_ci				   void *pdata); /* optional */
2518c2ecf20Sopenharmony_ci	void (*machine_select)(struct snd_sof_dev *sdev); /* optional */
2528c2ecf20Sopenharmony_ci	void (*set_mach_params)(const struct snd_soc_acpi_mach *mach,
2538c2ecf20Sopenharmony_ci				struct device *dev); /* optional */
2548c2ecf20Sopenharmony_ci
2558c2ecf20Sopenharmony_ci	/* DAI ops */
2568c2ecf20Sopenharmony_ci	struct snd_soc_dai_driver *drv;
2578c2ecf20Sopenharmony_ci	int num_drv;
2588c2ecf20Sopenharmony_ci
2598c2ecf20Sopenharmony_ci	/* ALSA HW info flags, will be stored in snd_pcm_runtime.hw.info */
2608c2ecf20Sopenharmony_ci	u32 hw_info;
2618c2ecf20Sopenharmony_ci
2628c2ecf20Sopenharmony_ci	const struct sof_arch_ops *arch_ops;
2638c2ecf20Sopenharmony_ci};
2648c2ecf20Sopenharmony_ci
2658c2ecf20Sopenharmony_ci/* DSP architecture specific callbacks for oops and stack dumps */
2668c2ecf20Sopenharmony_cistruct sof_arch_ops {
2678c2ecf20Sopenharmony_ci	void (*dsp_oops)(struct snd_sof_dev *sdev, void *oops);
2688c2ecf20Sopenharmony_ci	void (*dsp_stack)(struct snd_sof_dev *sdev, void *oops,
2698c2ecf20Sopenharmony_ci			  u32 *stack, u32 stack_words);
2708c2ecf20Sopenharmony_ci};
2718c2ecf20Sopenharmony_ci
2728c2ecf20Sopenharmony_ci#define sof_arch_ops(sdev) ((sdev)->pdata->desc->ops->arch_ops)
2738c2ecf20Sopenharmony_ci
2748c2ecf20Sopenharmony_ci/* DSP device HW descriptor mapping between bus ID and ops */
2758c2ecf20Sopenharmony_cistruct sof_ops_table {
2768c2ecf20Sopenharmony_ci	const struct sof_dev_desc *desc;
2778c2ecf20Sopenharmony_ci	const struct snd_sof_dsp_ops *ops;
2788c2ecf20Sopenharmony_ci};
2798c2ecf20Sopenharmony_ci
2808c2ecf20Sopenharmony_cienum sof_dfsentry_type {
2818c2ecf20Sopenharmony_ci	SOF_DFSENTRY_TYPE_IOMEM = 0,
2828c2ecf20Sopenharmony_ci	SOF_DFSENTRY_TYPE_BUF,
2838c2ecf20Sopenharmony_ci};
2848c2ecf20Sopenharmony_ci
2858c2ecf20Sopenharmony_cienum sof_debugfs_access_type {
2868c2ecf20Sopenharmony_ci	SOF_DEBUGFS_ACCESS_ALWAYS = 0,
2878c2ecf20Sopenharmony_ci	SOF_DEBUGFS_ACCESS_D0_ONLY,
2888c2ecf20Sopenharmony_ci};
2898c2ecf20Sopenharmony_ci
2908c2ecf20Sopenharmony_ci/* FS entry for debug files that can expose DSP memories, registers */
2918c2ecf20Sopenharmony_cistruct snd_sof_dfsentry {
2928c2ecf20Sopenharmony_ci	size_t size;
2938c2ecf20Sopenharmony_ci	enum sof_dfsentry_type type;
2948c2ecf20Sopenharmony_ci	/*
2958c2ecf20Sopenharmony_ci	 * access_type specifies if the
2968c2ecf20Sopenharmony_ci	 * memory -> DSP resource (memory, register etc) is always accessible
2978c2ecf20Sopenharmony_ci	 * or if it is accessible only when the DSP is in D0.
2988c2ecf20Sopenharmony_ci	 */
2998c2ecf20Sopenharmony_ci	enum sof_debugfs_access_type access_type;
3008c2ecf20Sopenharmony_ci#if ENABLE_DEBUGFS_CACHEBUF
3018c2ecf20Sopenharmony_ci	char *cache_buf; /* buffer to cache the contents of debugfs memory */
3028c2ecf20Sopenharmony_ci#endif
3038c2ecf20Sopenharmony_ci	struct snd_sof_dev *sdev;
3048c2ecf20Sopenharmony_ci	struct list_head list;  /* list in sdev dfsentry list */
3058c2ecf20Sopenharmony_ci	union {
3068c2ecf20Sopenharmony_ci		void __iomem *io_mem;
3078c2ecf20Sopenharmony_ci		void *buf;
3088c2ecf20Sopenharmony_ci	};
3098c2ecf20Sopenharmony_ci};
3108c2ecf20Sopenharmony_ci
3118c2ecf20Sopenharmony_ci/* Debug mapping for any DSP memory or registers that can used for debug */
3128c2ecf20Sopenharmony_cistruct snd_sof_debugfs_map {
3138c2ecf20Sopenharmony_ci	const char *name;
3148c2ecf20Sopenharmony_ci	u32 bar;
3158c2ecf20Sopenharmony_ci	u32 offset;
3168c2ecf20Sopenharmony_ci	u32 size;
3178c2ecf20Sopenharmony_ci	/*
3188c2ecf20Sopenharmony_ci	 * access_type specifies if the memory is always accessible
3198c2ecf20Sopenharmony_ci	 * or if it is accessible only when the DSP is in D0.
3208c2ecf20Sopenharmony_ci	 */
3218c2ecf20Sopenharmony_ci	enum sof_debugfs_access_type access_type;
3228c2ecf20Sopenharmony_ci};
3238c2ecf20Sopenharmony_ci
3248c2ecf20Sopenharmony_ci/* mailbox descriptor, used for host <-> DSP IPC */
3258c2ecf20Sopenharmony_cistruct snd_sof_mailbox {
3268c2ecf20Sopenharmony_ci	u32 offset;
3278c2ecf20Sopenharmony_ci	size_t size;
3288c2ecf20Sopenharmony_ci};
3298c2ecf20Sopenharmony_ci
3308c2ecf20Sopenharmony_ci/* IPC message descriptor for host <-> DSP IO */
3318c2ecf20Sopenharmony_cistruct snd_sof_ipc_msg {
3328c2ecf20Sopenharmony_ci	/* message data */
3338c2ecf20Sopenharmony_ci	u32 header;
3348c2ecf20Sopenharmony_ci	void *msg_data;
3358c2ecf20Sopenharmony_ci	void *reply_data;
3368c2ecf20Sopenharmony_ci	size_t msg_size;
3378c2ecf20Sopenharmony_ci	size_t reply_size;
3388c2ecf20Sopenharmony_ci	int reply_error;
3398c2ecf20Sopenharmony_ci
3408c2ecf20Sopenharmony_ci	wait_queue_head_t waitq;
3418c2ecf20Sopenharmony_ci	bool ipc_complete;
3428c2ecf20Sopenharmony_ci};
3438c2ecf20Sopenharmony_ci
3448c2ecf20Sopenharmony_cienum snd_sof_fw_state {
3458c2ecf20Sopenharmony_ci	SOF_FW_BOOT_NOT_STARTED = 0,
3468c2ecf20Sopenharmony_ci	SOF_FW_BOOT_PREPARE,
3478c2ecf20Sopenharmony_ci	SOF_FW_BOOT_IN_PROGRESS,
3488c2ecf20Sopenharmony_ci	SOF_FW_BOOT_FAILED,
3498c2ecf20Sopenharmony_ci	SOF_FW_BOOT_READY_FAILED, /* firmware booted but fw_ready op failed */
3508c2ecf20Sopenharmony_ci	SOF_FW_BOOT_COMPLETE,
3518c2ecf20Sopenharmony_ci};
3528c2ecf20Sopenharmony_ci
3538c2ecf20Sopenharmony_ci/*
3548c2ecf20Sopenharmony_ci * SOF Device Level.
3558c2ecf20Sopenharmony_ci */
3568c2ecf20Sopenharmony_cistruct snd_sof_dev {
3578c2ecf20Sopenharmony_ci	struct device *dev;
3588c2ecf20Sopenharmony_ci	spinlock_t ipc_lock;	/* lock for IPC users */
3598c2ecf20Sopenharmony_ci	spinlock_t hw_lock;	/* lock for HW IO access */
3608c2ecf20Sopenharmony_ci
3618c2ecf20Sopenharmony_ci	/*
3628c2ecf20Sopenharmony_ci	 * ASoC components. plat_drv fields are set dynamically so
3638c2ecf20Sopenharmony_ci	 * can't use const
3648c2ecf20Sopenharmony_ci	 */
3658c2ecf20Sopenharmony_ci	struct snd_soc_component_driver plat_drv;
3668c2ecf20Sopenharmony_ci
3678c2ecf20Sopenharmony_ci	/* current DSP power state */
3688c2ecf20Sopenharmony_ci	struct sof_dsp_power_state dsp_power_state;
3698c2ecf20Sopenharmony_ci
3708c2ecf20Sopenharmony_ci	/* Intended power target of system suspend */
3718c2ecf20Sopenharmony_ci	enum sof_system_suspend_state system_suspend_target;
3728c2ecf20Sopenharmony_ci
3738c2ecf20Sopenharmony_ci	/* DSP firmware boot */
3748c2ecf20Sopenharmony_ci	wait_queue_head_t boot_wait;
3758c2ecf20Sopenharmony_ci	enum snd_sof_fw_state fw_state;
3768c2ecf20Sopenharmony_ci	bool first_boot;
3778c2ecf20Sopenharmony_ci
3788c2ecf20Sopenharmony_ci	/* work queue in case the probe is implemented in two steps */
3798c2ecf20Sopenharmony_ci	struct work_struct probe_work;
3808c2ecf20Sopenharmony_ci
3818c2ecf20Sopenharmony_ci	/* DSP HW differentiation */
3828c2ecf20Sopenharmony_ci	struct snd_sof_pdata *pdata;
3838c2ecf20Sopenharmony_ci
3848c2ecf20Sopenharmony_ci	/* IPC */
3858c2ecf20Sopenharmony_ci	struct snd_sof_ipc *ipc;
3868c2ecf20Sopenharmony_ci	struct snd_sof_mailbox dsp_box;		/* DSP initiated IPC */
3878c2ecf20Sopenharmony_ci	struct snd_sof_mailbox host_box;	/* Host initiated IPC */
3888c2ecf20Sopenharmony_ci	struct snd_sof_mailbox stream_box;	/* Stream position update */
3898c2ecf20Sopenharmony_ci	struct snd_sof_mailbox debug_box;	/* Debug info updates */
3908c2ecf20Sopenharmony_ci	struct snd_sof_ipc_msg *msg;
3918c2ecf20Sopenharmony_ci	int ipc_irq;
3928c2ecf20Sopenharmony_ci	u32 next_comp_id; /* monotonic - reset during S3 */
3938c2ecf20Sopenharmony_ci
3948c2ecf20Sopenharmony_ci	/* memory bases for mmaped DSPs - set by dsp_init() */
3958c2ecf20Sopenharmony_ci	void __iomem *bar[SND_SOF_BARS];	/* DSP base address */
3968c2ecf20Sopenharmony_ci	int mmio_bar;
3978c2ecf20Sopenharmony_ci	int mailbox_bar;
3988c2ecf20Sopenharmony_ci	size_t dsp_oops_offset;
3998c2ecf20Sopenharmony_ci
4008c2ecf20Sopenharmony_ci	/* debug */
4018c2ecf20Sopenharmony_ci	struct dentry *debugfs_root;
4028c2ecf20Sopenharmony_ci	struct list_head dfsentry_list;
4038c2ecf20Sopenharmony_ci
4048c2ecf20Sopenharmony_ci	/* firmware loader */
4058c2ecf20Sopenharmony_ci	struct snd_dma_buffer dmab;
4068c2ecf20Sopenharmony_ci	struct snd_dma_buffer dmab_bdl;
4078c2ecf20Sopenharmony_ci	struct sof_ipc_fw_ready fw_ready;
4088c2ecf20Sopenharmony_ci	struct sof_ipc_fw_version fw_version;
4098c2ecf20Sopenharmony_ci	struct sof_ipc_cc_version *cc_version;
4108c2ecf20Sopenharmony_ci
4118c2ecf20Sopenharmony_ci	/* topology */
4128c2ecf20Sopenharmony_ci	struct snd_soc_tplg_ops *tplg_ops;
4138c2ecf20Sopenharmony_ci	struct list_head pcm_list;
4148c2ecf20Sopenharmony_ci	struct list_head kcontrol_list;
4158c2ecf20Sopenharmony_ci	struct list_head widget_list;
4168c2ecf20Sopenharmony_ci	struct list_head dai_list;
4178c2ecf20Sopenharmony_ci	struct list_head route_list;
4188c2ecf20Sopenharmony_ci	struct snd_soc_component *component;
4198c2ecf20Sopenharmony_ci	u32 enabled_cores_mask; /* keep track of enabled cores */
4208c2ecf20Sopenharmony_ci
4218c2ecf20Sopenharmony_ci	/* FW configuration */
4228c2ecf20Sopenharmony_ci	struct sof_ipc_window *info_window;
4238c2ecf20Sopenharmony_ci
4248c2ecf20Sopenharmony_ci	/* IPC timeouts in ms */
4258c2ecf20Sopenharmony_ci	int ipc_timeout;
4268c2ecf20Sopenharmony_ci	int boot_timeout;
4278c2ecf20Sopenharmony_ci
4288c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_SND_SOC_SOF_DEBUG_PROBES)
4298c2ecf20Sopenharmony_ci	unsigned int extractor_stream_tag;
4308c2ecf20Sopenharmony_ci#endif
4318c2ecf20Sopenharmony_ci
4328c2ecf20Sopenharmony_ci	/* DMA for Trace */
4338c2ecf20Sopenharmony_ci	struct snd_dma_buffer dmatb;
4348c2ecf20Sopenharmony_ci	struct snd_dma_buffer dmatp;
4358c2ecf20Sopenharmony_ci	int dma_trace_pages;
4368c2ecf20Sopenharmony_ci	wait_queue_head_t trace_sleep;
4378c2ecf20Sopenharmony_ci	u32 host_offset;
4388c2ecf20Sopenharmony_ci	bool dtrace_is_supported; /* set with Kconfig or module parameter */
4398c2ecf20Sopenharmony_ci	bool dtrace_is_enabled;
4408c2ecf20Sopenharmony_ci	bool dtrace_error;
4418c2ecf20Sopenharmony_ci	bool dtrace_draining;
4428c2ecf20Sopenharmony_ci
4438c2ecf20Sopenharmony_ci	bool msi_enabled;
4448c2ecf20Sopenharmony_ci
4458c2ecf20Sopenharmony_ci	void *private;			/* core does not touch this */
4468c2ecf20Sopenharmony_ci};
4478c2ecf20Sopenharmony_ci
4488c2ecf20Sopenharmony_ci/*
4498c2ecf20Sopenharmony_ci * Device Level.
4508c2ecf20Sopenharmony_ci */
4518c2ecf20Sopenharmony_ci
4528c2ecf20Sopenharmony_ciint snd_sof_device_probe(struct device *dev, struct snd_sof_pdata *plat_data);
4538c2ecf20Sopenharmony_ciint snd_sof_device_remove(struct device *dev);
4548c2ecf20Sopenharmony_ci
4558c2ecf20Sopenharmony_ciint snd_sof_runtime_suspend(struct device *dev);
4568c2ecf20Sopenharmony_ciint snd_sof_runtime_resume(struct device *dev);
4578c2ecf20Sopenharmony_ciint snd_sof_runtime_idle(struct device *dev);
4588c2ecf20Sopenharmony_ciint snd_sof_resume(struct device *dev);
4598c2ecf20Sopenharmony_ciint snd_sof_suspend(struct device *dev);
4608c2ecf20Sopenharmony_ciint snd_sof_dsp_power_down_notify(struct snd_sof_dev *sdev);
4618c2ecf20Sopenharmony_ciint snd_sof_prepare(struct device *dev);
4628c2ecf20Sopenharmony_civoid snd_sof_complete(struct device *dev);
4638c2ecf20Sopenharmony_ci
4648c2ecf20Sopenharmony_civoid snd_sof_new_platform_drv(struct snd_sof_dev *sdev);
4658c2ecf20Sopenharmony_ci
4668c2ecf20Sopenharmony_ciint snd_sof_create_page_table(struct device *dev,
4678c2ecf20Sopenharmony_ci			      struct snd_dma_buffer *dmab,
4688c2ecf20Sopenharmony_ci			      unsigned char *page_table, size_t size);
4698c2ecf20Sopenharmony_ci
4708c2ecf20Sopenharmony_ci/*
4718c2ecf20Sopenharmony_ci * Firmware loading.
4728c2ecf20Sopenharmony_ci */
4738c2ecf20Sopenharmony_ciint snd_sof_load_firmware(struct snd_sof_dev *sdev);
4748c2ecf20Sopenharmony_ciint snd_sof_load_firmware_raw(struct snd_sof_dev *sdev);
4758c2ecf20Sopenharmony_ciint snd_sof_load_firmware_memcpy(struct snd_sof_dev *sdev);
4768c2ecf20Sopenharmony_ciint snd_sof_run_firmware(struct snd_sof_dev *sdev);
4778c2ecf20Sopenharmony_ciint snd_sof_parse_module_memcpy(struct snd_sof_dev *sdev,
4788c2ecf20Sopenharmony_ci				struct snd_sof_mod_hdr *module);
4798c2ecf20Sopenharmony_civoid snd_sof_fw_unload(struct snd_sof_dev *sdev);
4808c2ecf20Sopenharmony_ciint snd_sof_fw_parse_ext_data(struct snd_sof_dev *sdev, u32 bar, u32 offset);
4818c2ecf20Sopenharmony_ci
4828c2ecf20Sopenharmony_ci/*
4838c2ecf20Sopenharmony_ci * IPC low level APIs.
4848c2ecf20Sopenharmony_ci */
4858c2ecf20Sopenharmony_cistruct snd_sof_ipc *snd_sof_ipc_init(struct snd_sof_dev *sdev);
4868c2ecf20Sopenharmony_civoid snd_sof_ipc_free(struct snd_sof_dev *sdev);
4878c2ecf20Sopenharmony_civoid snd_sof_ipc_reply(struct snd_sof_dev *sdev, u32 msg_id);
4888c2ecf20Sopenharmony_civoid snd_sof_ipc_msgs_rx(struct snd_sof_dev *sdev);
4898c2ecf20Sopenharmony_ciint snd_sof_ipc_stream_pcm_params(struct snd_sof_dev *sdev,
4908c2ecf20Sopenharmony_ci				  struct sof_ipc_pcm_params *params);
4918c2ecf20Sopenharmony_ciint snd_sof_dsp_mailbox_init(struct snd_sof_dev *sdev, u32 dspbox,
4928c2ecf20Sopenharmony_ci			     size_t dspbox_size, u32 hostbox,
4938c2ecf20Sopenharmony_ci			     size_t hostbox_size);
4948c2ecf20Sopenharmony_ciint snd_sof_ipc_valid(struct snd_sof_dev *sdev);
4958c2ecf20Sopenharmony_ciint sof_ipc_tx_message(struct snd_sof_ipc *ipc, u32 header,
4968c2ecf20Sopenharmony_ci		       void *msg_data, size_t msg_bytes, void *reply_data,
4978c2ecf20Sopenharmony_ci		       size_t reply_bytes);
4988c2ecf20Sopenharmony_ciint sof_ipc_tx_message_no_pm(struct snd_sof_ipc *ipc, u32 header,
4998c2ecf20Sopenharmony_ci			     void *msg_data, size_t msg_bytes,
5008c2ecf20Sopenharmony_ci			     void *reply_data, size_t reply_bytes);
5018c2ecf20Sopenharmony_ci
5028c2ecf20Sopenharmony_ci/*
5038c2ecf20Sopenharmony_ci * Trace/debug
5048c2ecf20Sopenharmony_ci */
5058c2ecf20Sopenharmony_ciint snd_sof_init_trace(struct snd_sof_dev *sdev);
5068c2ecf20Sopenharmony_civoid snd_sof_release_trace(struct snd_sof_dev *sdev);
5078c2ecf20Sopenharmony_civoid snd_sof_free_trace(struct snd_sof_dev *sdev);
5088c2ecf20Sopenharmony_ciint snd_sof_dbg_init(struct snd_sof_dev *sdev);
5098c2ecf20Sopenharmony_civoid snd_sof_free_debug(struct snd_sof_dev *sdev);
5108c2ecf20Sopenharmony_ciint snd_sof_debugfs_io_item(struct snd_sof_dev *sdev,
5118c2ecf20Sopenharmony_ci			    void __iomem *base, size_t size,
5128c2ecf20Sopenharmony_ci			    const char *name,
5138c2ecf20Sopenharmony_ci			    enum sof_debugfs_access_type access_type);
5148c2ecf20Sopenharmony_ciint snd_sof_debugfs_buf_item(struct snd_sof_dev *sdev,
5158c2ecf20Sopenharmony_ci			     void *base, size_t size,
5168c2ecf20Sopenharmony_ci			     const char *name, mode_t mode);
5178c2ecf20Sopenharmony_ciint snd_sof_trace_update_pos(struct snd_sof_dev *sdev,
5188c2ecf20Sopenharmony_ci			     struct sof_ipc_dma_trace_posn *posn);
5198c2ecf20Sopenharmony_civoid snd_sof_trace_notify_for_error(struct snd_sof_dev *sdev);
5208c2ecf20Sopenharmony_civoid snd_sof_get_status(struct snd_sof_dev *sdev, u32 panic_code,
5218c2ecf20Sopenharmony_ci			u32 tracep_code, void *oops,
5228c2ecf20Sopenharmony_ci			struct sof_ipc_panic_info *panic_info,
5238c2ecf20Sopenharmony_ci			void *stack, size_t stack_words);
5248c2ecf20Sopenharmony_ciint snd_sof_init_trace_ipc(struct snd_sof_dev *sdev);
5258c2ecf20Sopenharmony_civoid snd_sof_handle_fw_exception(struct snd_sof_dev *sdev);
5268c2ecf20Sopenharmony_ci
5278c2ecf20Sopenharmony_ci/*
5288c2ecf20Sopenharmony_ci * Platform specific ops.
5298c2ecf20Sopenharmony_ci */
5308c2ecf20Sopenharmony_ciextern struct snd_compress_ops sof_compressed_ops;
5318c2ecf20Sopenharmony_ci
5328c2ecf20Sopenharmony_ci/*
5338c2ecf20Sopenharmony_ci * DSP Architectures.
5348c2ecf20Sopenharmony_ci */
5358c2ecf20Sopenharmony_cistatic inline void sof_stack(struct snd_sof_dev *sdev, void *oops, u32 *stack,
5368c2ecf20Sopenharmony_ci			     u32 stack_words)
5378c2ecf20Sopenharmony_ci{
5388c2ecf20Sopenharmony_ci		sof_arch_ops(sdev)->dsp_stack(sdev, oops, stack, stack_words);
5398c2ecf20Sopenharmony_ci}
5408c2ecf20Sopenharmony_ci
5418c2ecf20Sopenharmony_cistatic inline void sof_oops(struct snd_sof_dev *sdev, void *oops)
5428c2ecf20Sopenharmony_ci{
5438c2ecf20Sopenharmony_ci	if (sof_arch_ops(sdev)->dsp_oops)
5448c2ecf20Sopenharmony_ci		sof_arch_ops(sdev)->dsp_oops(sdev, oops);
5458c2ecf20Sopenharmony_ci}
5468c2ecf20Sopenharmony_ci
5478c2ecf20Sopenharmony_ciextern const struct sof_arch_ops sof_xtensa_arch_ops;
5488c2ecf20Sopenharmony_ci
5498c2ecf20Sopenharmony_ci/*
5508c2ecf20Sopenharmony_ci * Utilities
5518c2ecf20Sopenharmony_ci */
5528c2ecf20Sopenharmony_civoid sof_io_write(struct snd_sof_dev *sdev, void __iomem *addr, u32 value);
5538c2ecf20Sopenharmony_civoid sof_io_write64(struct snd_sof_dev *sdev, void __iomem *addr, u64 value);
5548c2ecf20Sopenharmony_ciu32 sof_io_read(struct snd_sof_dev *sdev, void __iomem *addr);
5558c2ecf20Sopenharmony_ciu64 sof_io_read64(struct snd_sof_dev *sdev, void __iomem *addr);
5568c2ecf20Sopenharmony_civoid sof_mailbox_write(struct snd_sof_dev *sdev, u32 offset,
5578c2ecf20Sopenharmony_ci		       void *message, size_t bytes);
5588c2ecf20Sopenharmony_civoid sof_mailbox_read(struct snd_sof_dev *sdev, u32 offset,
5598c2ecf20Sopenharmony_ci		      void *message, size_t bytes);
5608c2ecf20Sopenharmony_civoid sof_block_write(struct snd_sof_dev *sdev, u32 bar, u32 offset, void *src,
5618c2ecf20Sopenharmony_ci		     size_t size);
5628c2ecf20Sopenharmony_civoid sof_block_read(struct snd_sof_dev *sdev, u32 bar, u32 offset, void *dest,
5638c2ecf20Sopenharmony_ci		    size_t size);
5648c2ecf20Sopenharmony_ci
5658c2ecf20Sopenharmony_ciint sof_fw_ready(struct snd_sof_dev *sdev, u32 msg_id);
5668c2ecf20Sopenharmony_ci
5678c2ecf20Sopenharmony_civoid intel_ipc_msg_data(struct snd_sof_dev *sdev,
5688c2ecf20Sopenharmony_ci			struct snd_pcm_substream *substream,
5698c2ecf20Sopenharmony_ci			void *p, size_t sz);
5708c2ecf20Sopenharmony_ciint intel_ipc_pcm_params(struct snd_sof_dev *sdev,
5718c2ecf20Sopenharmony_ci			 struct snd_pcm_substream *substream,
5728c2ecf20Sopenharmony_ci			 const struct sof_ipc_pcm_params_reply *reply);
5738c2ecf20Sopenharmony_ci
5748c2ecf20Sopenharmony_ciint intel_pcm_open(struct snd_sof_dev *sdev,
5758c2ecf20Sopenharmony_ci		   struct snd_pcm_substream *substream);
5768c2ecf20Sopenharmony_ciint intel_pcm_close(struct snd_sof_dev *sdev,
5778c2ecf20Sopenharmony_ci		    struct snd_pcm_substream *substream);
5788c2ecf20Sopenharmony_ci
5798c2ecf20Sopenharmony_ciint sof_machine_check(struct snd_sof_dev *sdev);
5808c2ecf20Sopenharmony_ci
5818c2ecf20Sopenharmony_ci#define sof_dev_dbg_or_err(dev, is_err, fmt, ...)			\
5828c2ecf20Sopenharmony_ci	do {								\
5838c2ecf20Sopenharmony_ci		if (is_err)						\
5848c2ecf20Sopenharmony_ci			dev_err(dev, "error: " fmt, __VA_ARGS__);	\
5858c2ecf20Sopenharmony_ci		else							\
5868c2ecf20Sopenharmony_ci			dev_dbg(dev, fmt, __VA_ARGS__);			\
5878c2ecf20Sopenharmony_ci	} while (0)
5888c2ecf20Sopenharmony_ci
5898c2ecf20Sopenharmony_ci#endif
590