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