xref: /openbmc/linux/sound/soc/intel/avs/avs.h (revision 060f35a317ef09101b128f399dce7ed13d019461)
19fe51c55SCezary Rojewski /* SPDX-License-Identifier: GPL-2.0-only */
29fe51c55SCezary Rojewski /*
39fe51c55SCezary Rojewski  * Copyright(c) 2021-2022 Intel Corporation. All rights reserved.
49fe51c55SCezary Rojewski  *
59fe51c55SCezary Rojewski  * Authors: Cezary Rojewski <cezary.rojewski@intel.com>
69fe51c55SCezary Rojewski  *          Amadeusz Slawinski <amadeuszx.slawinski@linux.intel.com>
79fe51c55SCezary Rojewski  */
89fe51c55SCezary Rojewski 
99fe51c55SCezary Rojewski #ifndef __SOUND_SOC_INTEL_AVS_H
109fe51c55SCezary Rojewski #define __SOUND_SOC_INTEL_AVS_H
119fe51c55SCezary Rojewski 
129e3c15beSCezary Rojewski #include <linux/debugfs.h>
139fe51c55SCezary Rojewski #include <linux/device.h>
14b27f4523SCezary Rojewski #include <linux/firmware.h>
154b86115cSCezary Rojewski #include <linux/kfifo.h>
169fe51c55SCezary Rojewski #include <sound/hda_codec.h>
17b27f4523SCezary Rojewski #include <sound/hda_register.h>
1834ae2cd5SCezary Rojewski #include <sound/soc-component.h>
192879516fSCezary Rojewski #include "messages.h"
20b27f4523SCezary Rojewski #include "registers.h"
219fe51c55SCezary Rojewski 
229fe51c55SCezary Rojewski struct avs_dev;
2334ae2cd5SCezary Rojewski struct avs_tplg;
2481a29910SCezary Rojewski struct avs_tplg_library;
2581a29910SCezary Rojewski struct avs_soc_component;
26335c4cbdSCezary Rojewski struct avs_ipc_msg;
279fe51c55SCezary Rojewski 
28d56829e9SPiotr Maziarz #ifdef CONFIG_ACPI
29d56829e9SPiotr Maziarz #define AVS_S0IX_SUPPORTED \
30d56829e9SPiotr Maziarz 	(acpi_gbl_FADT.flags & ACPI_FADT_LOW_POWER_S0)
31d56829e9SPiotr Maziarz #else
32d56829e9SPiotr Maziarz #define AVS_S0IX_SUPPORTED false
33d56829e9SPiotr Maziarz #endif
34d56829e9SPiotr Maziarz 
352879516fSCezary Rojewski /*
362879516fSCezary Rojewski  * struct avs_dsp_ops - Platform-specific DSP operations
372879516fSCezary Rojewski  *
382879516fSCezary Rojewski  * @power: Power on or off DSP cores
392879516fSCezary Rojewski  * @reset: Enter or exit reset state on DSP cores
402879516fSCezary Rojewski  * @stall: Stall or run DSP cores
412879516fSCezary Rojewski  * @irq_handler: Top half of IPC servicing
422879516fSCezary Rojewski  * @irq_thread: Bottom half of IPC servicing
432879516fSCezary Rojewski  * @int_control: Enable or disable IPC interrupts
442879516fSCezary Rojewski  */
459fe51c55SCezary Rojewski struct avs_dsp_ops {
469fe51c55SCezary Rojewski 	int (* const power)(struct avs_dev *, u32, bool);
479fe51c55SCezary Rojewski 	int (* const reset)(struct avs_dev *, u32, bool);
489fe51c55SCezary Rojewski 	int (* const stall)(struct avs_dev *, u32, bool);
492879516fSCezary Rojewski 	irqreturn_t (* const irq_handler)(int, void *);
502879516fSCezary Rojewski 	irqreturn_t (* const irq_thread)(int, void *);
512879516fSCezary Rojewski 	void (* const int_control)(struct avs_dev *, bool);
52b27f4523SCezary Rojewski 	int (* const load_basefw)(struct avs_dev *, struct firmware *);
53b27f4523SCezary Rojewski 	int (* const load_lib)(struct avs_dev *, struct firmware *, u32);
54b27f4523SCezary Rojewski 	int (* const transfer_mods)(struct avs_dev *, bool, struct avs_module_entry *, u32);
554b86115cSCezary Rojewski 	int (* const enable_logs)(struct avs_dev *, enum avs_log_enable, u32, u32, unsigned long,
564b86115cSCezary Rojewski 				  u32 *);
574b86115cSCezary Rojewski 	int (* const log_buffer_offset)(struct avs_dev *, u32);
584b86115cSCezary Rojewski 	int (* const log_buffer_status)(struct avs_dev *, union avs_notify_msg *);
592f1f570cSCezary Rojewski 	int (* const coredump)(struct avs_dev *, union avs_notify_msg *);
60335c4cbdSCezary Rojewski 	bool (* const d0ix_toggle)(struct avs_dev *, struct avs_ipc_msg *, bool);
61335c4cbdSCezary Rojewski 	int (* const set_d0ix)(struct avs_dev *, bool);
629fe51c55SCezary Rojewski };
639fe51c55SCezary Rojewski 
649fe51c55SCezary Rojewski #define avs_dsp_op(adev, op, ...) \
659fe51c55SCezary Rojewski 	((adev)->spec->dsp_ops->op(adev, ## __VA_ARGS__))
669fe51c55SCezary Rojewski 
67b5a41d42SCezary Rojewski extern const struct avs_dsp_ops avs_skl_dsp_ops;
68b5a41d42SCezary Rojewski extern const struct avs_dsp_ops avs_apl_dsp_ops;
69b3e29075SCezary Rojewski 
7065794fe1SCezary Rojewski #define AVS_PLATATTR_CLDMA		BIT_ULL(0)
71092cf7b2SCezary Rojewski #define AVS_PLATATTR_IMR		BIT_ULL(1)
7265794fe1SCezary Rojewski 
739fe51c55SCezary Rojewski #define avs_platattr_test(adev, attr) \
749fe51c55SCezary Rojewski 	((adev)->spec->attributes & AVS_PLATATTR_##attr)
759fe51c55SCezary Rojewski 
76*b9db15cfSCezary Rojewski struct avs_sram_spec {
77*b9db15cfSCezary Rojewski 	const u32 base_offset;
78*b9db15cfSCezary Rojewski 	const u32 window_size;
79*b9db15cfSCezary Rojewski 	const u32 rom_status_offset;
80*b9db15cfSCezary Rojewski };
81*b9db15cfSCezary Rojewski 
82*b9db15cfSCezary Rojewski struct avs_hipc_spec {
83*b9db15cfSCezary Rojewski 	const u32 req_offset;
84*b9db15cfSCezary Rojewski 	const u32 req_ext_offset;
85*b9db15cfSCezary Rojewski 	const u32 req_busy_mask;
86*b9db15cfSCezary Rojewski 	const u32 ack_offset;
87*b9db15cfSCezary Rojewski 	const u32 ack_done_mask;
88*b9db15cfSCezary Rojewski 	const u32 rsp_offset;
89*b9db15cfSCezary Rojewski 	const u32 rsp_busy_mask;
90*b9db15cfSCezary Rojewski 	const u32 ctl_offset;
91*b9db15cfSCezary Rojewski };
92*b9db15cfSCezary Rojewski 
939fe51c55SCezary Rojewski /* Platform specific descriptor */
949fe51c55SCezary Rojewski struct avs_spec {
959fe51c55SCezary Rojewski 	const char *name;
969fe51c55SCezary Rojewski 
979fe51c55SCezary Rojewski 	const struct avs_dsp_ops *const dsp_ops;
98b27f4523SCezary Rojewski 	struct avs_fw_version min_fw_version; /* anything below is rejected */
999fe51c55SCezary Rojewski 
1009fe51c55SCezary Rojewski 	const u32 core_init_mask;	/* used during DSP boot */
1019fe51c55SCezary Rojewski 	const u64 attributes;		/* bitmask of AVS_PLATATTR_* */
102*b9db15cfSCezary Rojewski 	const struct avs_sram_spec *sram;
103*b9db15cfSCezary Rojewski 	const struct avs_hipc_spec *hipc;
1049fe51c55SCezary Rojewski };
1059fe51c55SCezary Rojewski 
106c1a427e8SCezary Rojewski struct avs_fw_entry {
107c1a427e8SCezary Rojewski 	char *name;
108c1a427e8SCezary Rojewski 	const struct firmware *fw;
109c1a427e8SCezary Rojewski 
110c1a427e8SCezary Rojewski 	struct list_head node;
111c1a427e8SCezary Rojewski };
112c1a427e8SCezary Rojewski 
1139fe51c55SCezary Rojewski /*
1149fe51c55SCezary Rojewski  * struct avs_dev - Intel HD-Audio driver data
1159fe51c55SCezary Rojewski  *
1169fe51c55SCezary Rojewski  * @dev: PCI device
1179fe51c55SCezary Rojewski  * @dsp_ba: DSP bar address
1189fe51c55SCezary Rojewski  * @spec: platform-specific descriptor
119c1a427e8SCezary Rojewski  * @fw_cfg: Firmware configuration, obtained through FW_CONFIG message
120c1a427e8SCezary Rojewski  * @hw_cfg: Hardware configuration, obtained through HW_CONFIG message
121c1a427e8SCezary Rojewski  * @mods_info: Available module-types, obtained through MODULES_INFO message
122c1a427e8SCezary Rojewski  * @mod_idas: Module instance ID pool, one per module-type
123c1a427e8SCezary Rojewski  * @modres_mutex: For synchronizing any @mods_info updates
124c1a427e8SCezary Rojewski  * @ppl_ida: Pipeline instance ID pool
125c1a427e8SCezary Rojewski  * @fw_list: List of libraries loaded, including base firmware
1269fe51c55SCezary Rojewski  */
1279fe51c55SCezary Rojewski struct avs_dev {
1289fe51c55SCezary Rojewski 	struct hda_bus base;
1299fe51c55SCezary Rojewski 	struct device *dev;
1309fe51c55SCezary Rojewski 
1319fe51c55SCezary Rojewski 	void __iomem *dsp_ba;
1329fe51c55SCezary Rojewski 	const struct avs_spec *spec;
1332879516fSCezary Rojewski 	struct avs_ipc *ipc;
1342879516fSCezary Rojewski 
135c1a427e8SCezary Rojewski 	struct avs_fw_cfg fw_cfg;
136c1a427e8SCezary Rojewski 	struct avs_hw_cfg hw_cfg;
137c1a427e8SCezary Rojewski 	struct avs_mods_info *mods_info;
138c1a427e8SCezary Rojewski 	struct ida **mod_idas;
139c1a427e8SCezary Rojewski 	struct mutex modres_mutex;
140c1a427e8SCezary Rojewski 	struct ida ppl_ida;
141c1a427e8SCezary Rojewski 	struct list_head fw_list;
142215e67b2SCezary Rojewski 	int *core_refs;		/* reference count per core */
143b27f4523SCezary Rojewski 	char **lib_names;
144730cb320SCezary Rojewski 	int num_lp_paths;
145c1a427e8SCezary Rojewski 
1462879516fSCezary Rojewski 	struct completion fw_ready;
1471affc44eSCezary Rojewski 	struct work_struct probe_work;
1480ef88207SCezary Rojewski 
149274d79e5SCezary Rojewski 	struct nhlt_acpi_table *nhlt;
1500ef88207SCezary Rojewski 	struct list_head comp_list;
1510ef88207SCezary Rojewski 	struct mutex comp_list_mutex;
1520ef88207SCezary Rojewski 	struct list_head path_list;
1530ef88207SCezary Rojewski 	spinlock_t path_list_lock;
1540ef88207SCezary Rojewski 	struct mutex path_mutex;
1554b86115cSCezary Rojewski 
1569e3c15beSCezary Rojewski 	spinlock_t trace_lock;	/* serialize debug window I/O between each LOG_BUFFER_STATUS */
1579e3c15beSCezary Rojewski #ifdef CONFIG_DEBUG_FS
1589e3c15beSCezary Rojewski 	struct kfifo trace_fifo;
1599e3c15beSCezary Rojewski 	wait_queue_head_t trace_waitq;
1609e3c15beSCezary Rojewski 	u32 aging_timer_period;
1619e3c15beSCezary Rojewski 	u32 fifo_full_timer_period;
1629e3c15beSCezary Rojewski 	u32 logged_resources;	/* context dependent: core or library */
1635a565ba2SCezary Rojewski 	struct dentry *debugfs_root;
164700462f5SCezary Rojewski 	/* probes */
165700462f5SCezary Rojewski 	struct hdac_ext_stream *extractor;
166700462f5SCezary Rojewski 	unsigned int num_probe_streams;
1679e3c15beSCezary Rojewski #endif
1689fe51c55SCezary Rojewski };
1699fe51c55SCezary Rojewski 
1709fe51c55SCezary Rojewski /* from hda_bus to avs_dev */
1719fe51c55SCezary Rojewski #define hda_to_avs(hda) container_of(hda, struct avs_dev, base)
1729fe51c55SCezary Rojewski /* from hdac_bus to avs_dev */
1739fe51c55SCezary Rojewski #define hdac_to_avs(hdac) hda_to_avs(to_hda_bus(hdac))
1749fe51c55SCezary Rojewski /* from device to avs_dev */
1759fe51c55SCezary Rojewski #define to_avs_dev(dev) \
1769fe51c55SCezary Rojewski ({ \
1779fe51c55SCezary Rojewski 	struct hdac_bus *__bus = dev_get_drvdata(dev); \
1789fe51c55SCezary Rojewski 	hdac_to_avs(__bus); \
1799fe51c55SCezary Rojewski })
1809fe51c55SCezary Rojewski 
1819fe51c55SCezary Rojewski int avs_dsp_core_power(struct avs_dev *adev, u32 core_mask, bool power);
1829fe51c55SCezary Rojewski int avs_dsp_core_reset(struct avs_dev *adev, u32 core_mask, bool reset);
1839fe51c55SCezary Rojewski int avs_dsp_core_stall(struct avs_dev *adev, u32 core_mask, bool stall);
1849fe51c55SCezary Rojewski int avs_dsp_core_enable(struct avs_dev *adev, u32 core_mask);
1859fe51c55SCezary Rojewski int avs_dsp_core_disable(struct avs_dev *adev, u32 core_mask);
1869fe51c55SCezary Rojewski 
1872879516fSCezary Rojewski /* Inter Process Communication */
1882879516fSCezary Rojewski 
1892879516fSCezary Rojewski struct avs_ipc_msg {
1902879516fSCezary Rojewski 	union {
1912879516fSCezary Rojewski 		u64 header;
1922879516fSCezary Rojewski 		union avs_global_msg glb;
1932879516fSCezary Rojewski 		union avs_reply_msg rsp;
1942879516fSCezary Rojewski 	};
1952879516fSCezary Rojewski 	void *data;
1962879516fSCezary Rojewski 	size_t size;
1972879516fSCezary Rojewski };
1982879516fSCezary Rojewski 
1992879516fSCezary Rojewski /*
2002879516fSCezary Rojewski  * struct avs_ipc - DSP IPC context
2012879516fSCezary Rojewski  *
2022879516fSCezary Rojewski  * @dev: PCI device
2032879516fSCezary Rojewski  * @rx: Reply message cache
2042879516fSCezary Rojewski  * @default_timeout_ms: default message timeout in MS
2052879516fSCezary Rojewski  * @ready: whether firmware is ready and communication is open
2062879516fSCezary Rojewski  * @rx_completed: whether RX for previously sent TX has been received
2072879516fSCezary Rojewski  * @rx_lock: for serializing manipulation of rx_* fields
2082879516fSCezary Rojewski  * @msg_lock: for synchronizing request handling
2092879516fSCezary Rojewski  * @done_completion: DONE-part of IPC i.e. ROM and ACKs from FW
2102879516fSCezary Rojewski  * @busy_completion: BUSY-part of IPC i.e. receiving responses from FW
2112879516fSCezary Rojewski  */
2122879516fSCezary Rojewski struct avs_ipc {
2132879516fSCezary Rojewski 	struct device *dev;
2142879516fSCezary Rojewski 
2152879516fSCezary Rojewski 	struct avs_ipc_msg rx;
2162879516fSCezary Rojewski 	u32 default_timeout_ms;
2172879516fSCezary Rojewski 	bool ready;
2182f1f570cSCezary Rojewski 	atomic_t recovering;
2192879516fSCezary Rojewski 
2202879516fSCezary Rojewski 	bool rx_completed;
2212879516fSCezary Rojewski 	spinlock_t rx_lock;
2222879516fSCezary Rojewski 	struct mutex msg_mutex;
2232879516fSCezary Rojewski 	struct completion done_completion;
2242879516fSCezary Rojewski 	struct completion busy_completion;
2252f1f570cSCezary Rojewski 
2262f1f570cSCezary Rojewski 	struct work_struct recovery_work;
227335c4cbdSCezary Rojewski 	struct delayed_work d0ix_work;
228335c4cbdSCezary Rojewski 	atomic_t d0ix_disable_depth;
229335c4cbdSCezary Rojewski 	bool in_d0ix;
2302879516fSCezary Rojewski };
2312879516fSCezary Rojewski 
2322879516fSCezary Rojewski #define AVS_EIPC	EREMOTEIO
2332879516fSCezary Rojewski /*
2342879516fSCezary Rojewski  * IPC handlers may return positive value (firmware error code) what denotes
2352879516fSCezary Rojewski  * successful HOST <-> DSP communication yet failure to process specific request.
2362879516fSCezary Rojewski  *
2372879516fSCezary Rojewski  * Below macro converts returned value to linux kernel error code.
2382879516fSCezary Rojewski  * All IPC callers MUST use it as soon as firmware error code is consumed.
2392879516fSCezary Rojewski  */
2402879516fSCezary Rojewski #define AVS_IPC_RET(ret) \
2412879516fSCezary Rojewski 	(((ret) <= 0) ? (ret) : -AVS_EIPC)
2422879516fSCezary Rojewski 
avs_ipc_err(struct avs_dev * adev,struct avs_ipc_msg * tx,const char * name,int error)2432879516fSCezary Rojewski static inline void avs_ipc_err(struct avs_dev *adev, struct avs_ipc_msg *tx,
2442879516fSCezary Rojewski 			       const char *name, int error)
2452879516fSCezary Rojewski {
2462879516fSCezary Rojewski 	/*
2472879516fSCezary Rojewski 	 * If IPC channel is blocked e.g.: due to ongoing recovery,
2482879516fSCezary Rojewski 	 * -EPERM error code is expected and thus it's not an actual error.
2492d27a1caSCezary Rojewski 	 *
2502d27a1caSCezary Rojewski 	 * Unsupported IPCs are of no harm either.
2512879516fSCezary Rojewski 	 */
2522d27a1caSCezary Rojewski 	if (error == -EPERM || error == AVS_IPC_NOT_SUPPORTED)
2532879516fSCezary Rojewski 		dev_dbg(adev->dev, "%s 0x%08x 0x%08x failed: %d\n", name,
2542879516fSCezary Rojewski 			tx->glb.primary, tx->glb.ext.val, error);
2552879516fSCezary Rojewski 	else
2562879516fSCezary Rojewski 		dev_err(adev->dev, "%s 0x%08x 0x%08x failed: %d\n", name,
2572879516fSCezary Rojewski 			tx->glb.primary, tx->glb.ext.val, error);
2582879516fSCezary Rojewski }
2592879516fSCezary Rojewski 
2602879516fSCezary Rojewski irqreturn_t avs_dsp_irq_handler(int irq, void *dev_id);
2612879516fSCezary Rojewski irqreturn_t avs_dsp_irq_thread(int irq, void *dev_id);
2622879516fSCezary Rojewski void avs_dsp_process_response(struct avs_dev *adev, u64 header);
2632879516fSCezary Rojewski int avs_dsp_send_msg_timeout(struct avs_dev *adev,
2642879516fSCezary Rojewski 			     struct avs_ipc_msg *request,
2652879516fSCezary Rojewski 			     struct avs_ipc_msg *reply, int timeout);
2662879516fSCezary Rojewski int avs_dsp_send_msg(struct avs_dev *adev,
2672879516fSCezary Rojewski 		     struct avs_ipc_msg *request, struct avs_ipc_msg *reply);
268335c4cbdSCezary Rojewski /* Two variants below are for messages that control DSP power states. */
269335c4cbdSCezary Rojewski int avs_dsp_send_pm_msg_timeout(struct avs_dev *adev, struct avs_ipc_msg *request,
270335c4cbdSCezary Rojewski 				struct avs_ipc_msg *reply, int timeout, bool wake_d0i0);
271335c4cbdSCezary Rojewski int avs_dsp_send_pm_msg(struct avs_dev *adev, struct avs_ipc_msg *request,
272335c4cbdSCezary Rojewski 			struct avs_ipc_msg *reply, bool wake_d0i0);
2732879516fSCezary Rojewski int avs_dsp_send_rom_msg_timeout(struct avs_dev *adev,
2742879516fSCezary Rojewski 				 struct avs_ipc_msg *request, int timeout);
2752879516fSCezary Rojewski int avs_dsp_send_rom_msg(struct avs_dev *adev, struct avs_ipc_msg *request);
2762879516fSCezary Rojewski void avs_dsp_interrupt_control(struct avs_dev *adev, bool enable);
2772879516fSCezary Rojewski int avs_ipc_init(struct avs_ipc *ipc, struct device *dev);
2782879516fSCezary Rojewski void avs_ipc_block(struct avs_ipc *ipc);
2792879516fSCezary Rojewski 
280335c4cbdSCezary Rojewski int avs_dsp_disable_d0ix(struct avs_dev *adev);
281335c4cbdSCezary Rojewski int avs_dsp_enable_d0ix(struct avs_dev *adev);
282335c4cbdSCezary Rojewski 
283b5a41d42SCezary Rojewski int avs_skl_log_buffer_offset(struct avs_dev *adev, u32 core);
284b3e29075SCezary Rojewski 
285c1a427e8SCezary Rojewski /* Firmware resources management */
286c1a427e8SCezary Rojewski 
287c1a427e8SCezary Rojewski int avs_get_module_entry(struct avs_dev *adev, const guid_t *uuid, struct avs_module_entry *entry);
288c1a427e8SCezary Rojewski int avs_get_module_id_entry(struct avs_dev *adev, u32 module_id, struct avs_module_entry *entry);
289c1a427e8SCezary Rojewski int avs_get_module_id(struct avs_dev *adev, const guid_t *uuid);
290c1a427e8SCezary Rojewski bool avs_is_module_ida_empty(struct avs_dev *adev, u32 module_id);
291c1a427e8SCezary Rojewski 
292c1a427e8SCezary Rojewski int avs_module_info_init(struct avs_dev *adev, bool purge);
293c1a427e8SCezary Rojewski void avs_module_info_free(struct avs_dev *adev);
294c1a427e8SCezary Rojewski int avs_module_id_alloc(struct avs_dev *adev, u16 module_id);
295c1a427e8SCezary Rojewski void avs_module_id_free(struct avs_dev *adev, u16 module_id, u8 instance_id);
296c1a427e8SCezary Rojewski int avs_request_firmware(struct avs_dev *adev, const struct firmware **fw_p, const char *name);
297c1a427e8SCezary Rojewski void avs_release_last_firmware(struct avs_dev *adev);
298c1a427e8SCezary Rojewski void avs_release_firmwares(struct avs_dev *adev);
299c1a427e8SCezary Rojewski 
300215e67b2SCezary Rojewski int avs_dsp_init_module(struct avs_dev *adev, u16 module_id, u8 ppl_instance_id,
301215e67b2SCezary Rojewski 			u8 core_id, u8 domain, void *param, u32 param_size,
302320f4d86SAmadeusz Sławiński 			u8 *instance_id);
303320f4d86SAmadeusz Sławiński void avs_dsp_delete_module(struct avs_dev *adev, u16 module_id, u8 instance_id,
304215e67b2SCezary Rojewski 			   u8 ppl_instance_id, u8 core_id);
305215e67b2SCezary Rojewski int avs_dsp_create_pipeline(struct avs_dev *adev, u16 req_size, u8 priority,
306215e67b2SCezary Rojewski 			    bool lp, u16 attributes, u8 *instance_id);
307215e67b2SCezary Rojewski int avs_dsp_delete_pipeline(struct avs_dev *adev, u8 instance_id);
308215e67b2SCezary Rojewski 
309b27f4523SCezary Rojewski /* Firmware loading */
310b27f4523SCezary Rojewski 
311b27f4523SCezary Rojewski void avs_hda_clock_gating_enable(struct avs_dev *adev, bool enable);
312b27f4523SCezary Rojewski void avs_hda_power_gating_enable(struct avs_dev *adev, bool enable);
313b27f4523SCezary Rojewski void avs_hda_l1sen_enable(struct avs_dev *adev, bool enable);
314b27f4523SCezary Rojewski 
31581a29910SCezary Rojewski int avs_dsp_load_libraries(struct avs_dev *adev, struct avs_tplg_library *libs, u32 num_libs);
316b27f4523SCezary Rojewski int avs_dsp_boot_firmware(struct avs_dev *adev, bool purge);
317b27f4523SCezary Rojewski int avs_dsp_first_boot_firmware(struct avs_dev *adev);
318b27f4523SCezary Rojewski 
31965794fe1SCezary Rojewski int avs_cldma_load_basefw(struct avs_dev *adev, struct firmware *fw);
32065794fe1SCezary Rojewski int avs_cldma_load_library(struct avs_dev *adev, struct firmware *lib, u32 id);
32165794fe1SCezary Rojewski int avs_cldma_transfer_modules(struct avs_dev *adev, bool load,
32265794fe1SCezary Rojewski 			       struct avs_module_entry *mods, u32 num_mods);
323092cf7b2SCezary Rojewski int avs_hda_load_basefw(struct avs_dev *adev, struct firmware *fw);
324092cf7b2SCezary Rojewski int avs_hda_load_library(struct avs_dev *adev, struct firmware *lib, u32 id);
325092cf7b2SCezary Rojewski int avs_hda_transfer_modules(struct avs_dev *adev, bool load,
326092cf7b2SCezary Rojewski 			     struct avs_module_entry *mods, u32 num_mods);
32765794fe1SCezary Rojewski 
32834ae2cd5SCezary Rojewski /* Soc component members */
32934ae2cd5SCezary Rojewski 
33034ae2cd5SCezary Rojewski struct avs_soc_component {
33134ae2cd5SCezary Rojewski 	struct snd_soc_component base;
33234ae2cd5SCezary Rojewski 	struct avs_tplg *tplg;
33334ae2cd5SCezary Rojewski 
33434ae2cd5SCezary Rojewski 	struct list_head node;
33534ae2cd5SCezary Rojewski };
33634ae2cd5SCezary Rojewski 
33734ae2cd5SCezary Rojewski #define to_avs_soc_component(comp) \
33834ae2cd5SCezary Rojewski 	container_of(comp, struct avs_soc_component, base)
33934ae2cd5SCezary Rojewski 
340d73d1b67SCezary Rojewski extern const struct snd_soc_dai_ops avs_dai_fe_ops;
341d73d1b67SCezary Rojewski 
342ed914a2aSCezary Rojewski int avs_soc_component_register(struct device *dev, const char *name,
343ed914a2aSCezary Rojewski 			       const struct snd_soc_component_driver *drv,
344ed914a2aSCezary Rojewski 			       struct snd_soc_dai_driver *cpu_dais, int num_cpu_dais);
345b9062f98SCezary Rojewski int avs_dmic_platform_register(struct avs_dev *adev, const char *name);
346b9062f98SCezary Rojewski int avs_i2s_platform_register(struct avs_dev *adev, const char *name, unsigned long port_mask,
347b9062f98SCezary Rojewski 			      unsigned long *tdms);
348d070002aSCezary Rojewski int avs_hda_platform_register(struct avs_dev *adev, const char *name);
349b9062f98SCezary Rojewski 
350beed9836SCezary Rojewski int avs_register_all_boards(struct avs_dev *adev);
351beed9836SCezary Rojewski void avs_unregister_all_boards(struct avs_dev *adev);
352beed9836SCezary Rojewski 
3534b86115cSCezary Rojewski /* Firmware tracing helpers */
3544b86115cSCezary Rojewski 
3554b86115cSCezary Rojewski #define avs_log_buffer_size(adev) \
3564b86115cSCezary Rojewski 	((adev)->fw_cfg.trace_log_bytes / (adev)->hw_cfg.dsp_cores)
3574b86115cSCezary Rojewski 
3584b86115cSCezary Rojewski #define avs_log_buffer_addr(adev, core) \
3594b86115cSCezary Rojewski ({ \
3604b86115cSCezary Rojewski 	s32 __offset = avs_dsp_op(adev, log_buffer_offset, core); \
3614b86115cSCezary Rojewski 	(__offset < 0) ? NULL : \
3624b86115cSCezary Rojewski 			 (avs_sram_addr(adev, AVS_DEBUG_WINDOW) + __offset); \
3634b86115cSCezary Rojewski })
3644b86115cSCezary Rojewski 
avs_log_buffer_status_locked(struct avs_dev * adev,union avs_notify_msg * msg)365bb03099bSCezary Rojewski static inline int avs_log_buffer_status_locked(struct avs_dev *adev, union avs_notify_msg *msg)
366bb03099bSCezary Rojewski {
367bb03099bSCezary Rojewski 	unsigned long flags;
368bb03099bSCezary Rojewski 	int ret;
369bb03099bSCezary Rojewski 
370f7de161fSCezary Rojewski 	spin_lock_irqsave(&adev->trace_lock, flags);
371bb03099bSCezary Rojewski 	ret = avs_dsp_op(adev, log_buffer_status, msg);
372f7de161fSCezary Rojewski 	spin_unlock_irqrestore(&adev->trace_lock, flags);
373bb03099bSCezary Rojewski 
374bb03099bSCezary Rojewski 	return ret;
375bb03099bSCezary Rojewski }
376bb03099bSCezary Rojewski 
377b5a41d42SCezary Rojewski struct avs_apl_log_buffer_layout {
378c8c960c1SCezary Rojewski 	u32 read_ptr;
379c8c960c1SCezary Rojewski 	u32 write_ptr;
380c8c960c1SCezary Rojewski 	u8 buffer[];
381c8c960c1SCezary Rojewski } __packed;
382c8c960c1SCezary Rojewski 
383b5a41d42SCezary Rojewski #define avs_apl_log_payload_size(adev) \
384b5a41d42SCezary Rojewski 	(avs_log_buffer_size(adev) - sizeof(struct avs_apl_log_buffer_layout))
385c8c960c1SCezary Rojewski 
386b5a41d42SCezary Rojewski #define avs_apl_log_payload_addr(addr) \
387b5a41d42SCezary Rojewski 	(addr + sizeof(struct avs_apl_log_buffer_layout))
388c8c960c1SCezary Rojewski 
3899e3c15beSCezary Rojewski #ifdef CONFIG_DEBUG_FS
390b3eefa5dSCezary Rojewski #define AVS_SET_ENABLE_LOGS_OP(name) \
391b5a41d42SCezary Rojewski 	.enable_logs = avs_##name##_enable_logs
392b3eefa5dSCezary Rojewski 
3939e3c15beSCezary Rojewski bool avs_logging_fw(struct avs_dev *adev);
3949e3c15beSCezary Rojewski void avs_dump_fw_log(struct avs_dev *adev, const void __iomem *src, unsigned int len);
3959e3c15beSCezary Rojewski void avs_dump_fw_log_wakeup(struct avs_dev *adev, const void __iomem *src, unsigned int len);
396ed914a2aSCezary Rojewski 
397ed914a2aSCezary Rojewski int avs_probe_platform_register(struct avs_dev *adev, const char *name);
3985a565ba2SCezary Rojewski 
3995a565ba2SCezary Rojewski void avs_debugfs_init(struct avs_dev *adev);
4005a565ba2SCezary Rojewski void avs_debugfs_exit(struct avs_dev *adev);
4019e3c15beSCezary Rojewski #else
402b3eefa5dSCezary Rojewski #define AVS_SET_ENABLE_LOGS_OP(name)
403b3eefa5dSCezary Rojewski 
avs_logging_fw(struct avs_dev * adev)4049e3c15beSCezary Rojewski static inline bool avs_logging_fw(struct avs_dev *adev)
4059e3c15beSCezary Rojewski {
4069e3c15beSCezary Rojewski 	return false;
4079e3c15beSCezary Rojewski }
4089e3c15beSCezary Rojewski 
avs_dump_fw_log(struct avs_dev * adev,const void __iomem * src,unsigned int len)4099e3c15beSCezary Rojewski static inline void avs_dump_fw_log(struct avs_dev *adev, const void __iomem *src, unsigned int len)
4109e3c15beSCezary Rojewski {
4119e3c15beSCezary Rojewski }
4129e3c15beSCezary Rojewski 
4139e3c15beSCezary Rojewski static inline void
avs_dump_fw_log_wakeup(struct avs_dev * adev,const void __iomem * src,unsigned int len)4149e3c15beSCezary Rojewski avs_dump_fw_log_wakeup(struct avs_dev *adev, const void __iomem *src, unsigned int len)
4159e3c15beSCezary Rojewski {
4169e3c15beSCezary Rojewski }
417ed914a2aSCezary Rojewski 
avs_probe_platform_register(struct avs_dev * adev,const char * name)418ed914a2aSCezary Rojewski static inline int avs_probe_platform_register(struct avs_dev *adev, const char *name)
419ed914a2aSCezary Rojewski {
420ed914a2aSCezary Rojewski 	return 0;
421ed914a2aSCezary Rojewski }
4225a565ba2SCezary Rojewski 
avs_debugfs_init(struct avs_dev * adev)4235a565ba2SCezary Rojewski static inline void avs_debugfs_init(struct avs_dev *adev) { }
avs_debugfs_exit(struct avs_dev * adev)4245a565ba2SCezary Rojewski static inline void avs_debugfs_exit(struct avs_dev *adev) { }
4259e3c15beSCezary Rojewski #endif
4269e3c15beSCezary Rojewski 
4279fe51c55SCezary Rojewski #endif /* __SOUND_SOC_INTEL_AVS_H */
428