14fac9b31SCezary Rojewski /* SPDX-License-Identifier: GPL-2.0-only */ 24fac9b31SCezary Rojewski /* 34fac9b31SCezary Rojewski * Copyright(c) 2020 Intel Corporation. All rights reserved. 44fac9b31SCezary Rojewski * 54fac9b31SCezary Rojewski * Author: Cezary Rojewski <cezary.rojewski@intel.com> 64fac9b31SCezary Rojewski */ 74fac9b31SCezary Rojewski 84fac9b31SCezary Rojewski #ifndef __SND_SOC_INTEL_CATPT_CORE_H 94fac9b31SCezary Rojewski #define __SND_SOC_INTEL_CATPT_CORE_H 104fac9b31SCezary Rojewski 114fac9b31SCezary Rojewski #include <linux/dma/dw.h> 1292946c1dSCezary Rojewski #include <linux/irqreturn.h> 1392946c1dSCezary Rojewski #include "messages.h" 144fac9b31SCezary Rojewski #include "registers.h" 154fac9b31SCezary Rojewski 164fac9b31SCezary Rojewski struct catpt_dev; 174fac9b31SCezary Rojewski 188f80a834SCezary Rojewski extern const struct attribute_group *catpt_attr_groups[]; 198f80a834SCezary Rojewski 204fac9b31SCezary Rojewski void catpt_sram_init(struct resource *sram, u32 start, u32 size); 214fac9b31SCezary Rojewski void catpt_sram_free(struct resource *sram); 224fac9b31SCezary Rojewski struct resource * 234fac9b31SCezary Rojewski catpt_request_region(struct resource *root, resource_size_t size); 244fac9b31SCezary Rojewski 2592946c1dSCezary Rojewski struct catpt_ipc_msg { 2692946c1dSCezary Rojewski union { 2792946c1dSCezary Rojewski u32 header; 2892946c1dSCezary Rojewski union catpt_global_msg rsp; 2992946c1dSCezary Rojewski }; 3092946c1dSCezary Rojewski void *data; 3192946c1dSCezary Rojewski size_t size; 3292946c1dSCezary Rojewski }; 3392946c1dSCezary Rojewski 3492946c1dSCezary Rojewski struct catpt_ipc { 3592946c1dSCezary Rojewski struct device *dev; 3692946c1dSCezary Rojewski 3792946c1dSCezary Rojewski struct catpt_ipc_msg rx; 3892946c1dSCezary Rojewski struct catpt_fw_ready config; 3992946c1dSCezary Rojewski u32 default_timeout; 4092946c1dSCezary Rojewski bool ready; 4192946c1dSCezary Rojewski 4292946c1dSCezary Rojewski spinlock_t lock; 4392946c1dSCezary Rojewski struct mutex mutex; 4492946c1dSCezary Rojewski struct completion done_completion; 4592946c1dSCezary Rojewski struct completion busy_completion; 4692946c1dSCezary Rojewski }; 4792946c1dSCezary Rojewski 4892946c1dSCezary Rojewski void catpt_ipc_init(struct catpt_ipc *ipc, struct device *dev); 4992946c1dSCezary Rojewski 504fac9b31SCezary Rojewski struct catpt_module_type { 514fac9b31SCezary Rojewski bool loaded; 524fac9b31SCezary Rojewski u32 entry_point; 534fac9b31SCezary Rojewski u32 persistent_size; 544fac9b31SCezary Rojewski u32 scratch_size; 554fac9b31SCezary Rojewski /* DRAM, initial module state */ 564fac9b31SCezary Rojewski u32 state_offset; 574fac9b31SCezary Rojewski u32 state_size; 584fac9b31SCezary Rojewski 594fac9b31SCezary Rojewski struct list_head node; 604fac9b31SCezary Rojewski }; 614fac9b31SCezary Rojewski 624fac9b31SCezary Rojewski struct catpt_spec { 634fac9b31SCezary Rojewski struct snd_soc_acpi_mach *machines; 644fac9b31SCezary Rojewski u8 core_id; 654fac9b31SCezary Rojewski u32 host_dram_offset; 664fac9b31SCezary Rojewski u32 host_iram_offset; 674fac9b31SCezary Rojewski u32 host_shim_offset; 684fac9b31SCezary Rojewski u32 host_dma_offset[CATPT_DMA_COUNT]; 694fac9b31SCezary Rojewski u32 host_ssp_offset[CATPT_SSP_COUNT]; 704fac9b31SCezary Rojewski u32 dram_mask; 714fac9b31SCezary Rojewski u32 iram_mask; 724fac9b31SCezary Rojewski u32 d3srampgd_bit; 734fac9b31SCezary Rojewski u32 d3pgd_bit; 744fac9b31SCezary Rojewski void (*pll_shutdown)(struct catpt_dev *cdev, bool enable); 754fac9b31SCezary Rojewski }; 764fac9b31SCezary Rojewski 774fac9b31SCezary Rojewski struct catpt_dev { 784fac9b31SCezary Rojewski struct device *dev; 794fac9b31SCezary Rojewski struct dw_dma_chip *dmac; 8092946c1dSCezary Rojewski struct catpt_ipc ipc; 814fac9b31SCezary Rojewski 824fac9b31SCezary Rojewski void __iomem *pci_ba; 834fac9b31SCezary Rojewski void __iomem *lpe_ba; 844fac9b31SCezary Rojewski u32 lpe_base; 854fac9b31SCezary Rojewski int irq; 864fac9b31SCezary Rojewski 874fac9b31SCezary Rojewski const struct catpt_spec *spec; 884fac9b31SCezary Rojewski struct completion fw_ready; 894fac9b31SCezary Rojewski 904fac9b31SCezary Rojewski struct resource dram; 914fac9b31SCezary Rojewski struct resource iram; 924fac9b31SCezary Rojewski struct resource *scratch; 93ba202a7bSCezary Rojewski 94a9aa6fb3SCezary Rojewski struct catpt_mixer_stream_info mixer; 95a9aa6fb3SCezary Rojewski struct catpt_module_type modules[CATPT_MODULE_COUNT]; 96a9aa6fb3SCezary Rojewski struct catpt_ssp_device_format devfmt[CATPT_SSP_COUNT]; 97ba202a7bSCezary Rojewski struct list_head stream_list; 98ba202a7bSCezary Rojewski spinlock_t list_lock; 99ba202a7bSCezary Rojewski struct mutex clk_mutex; 100a9aa6fb3SCezary Rojewski 101a9aa6fb3SCezary Rojewski struct catpt_dx_context dx_ctx; 102a9aa6fb3SCezary Rojewski void *dxbuf_vaddr; 103a9aa6fb3SCezary Rojewski dma_addr_t dxbuf_paddr; 1044fac9b31SCezary Rojewski }; 1054fac9b31SCezary Rojewski 1064fac9b31SCezary Rojewski int catpt_dmac_probe(struct catpt_dev *cdev); 1074fac9b31SCezary Rojewski void catpt_dmac_remove(struct catpt_dev *cdev); 1084fac9b31SCezary Rojewski struct dma_chan *catpt_dma_request_config_chan(struct catpt_dev *cdev); 1094fac9b31SCezary Rojewski int catpt_dma_memcpy_todsp(struct catpt_dev *cdev, struct dma_chan *chan, 1104fac9b31SCezary Rojewski dma_addr_t dst_addr, dma_addr_t src_addr, 1114fac9b31SCezary Rojewski size_t size); 1124fac9b31SCezary Rojewski int catpt_dma_memcpy_fromdsp(struct catpt_dev *cdev, struct dma_chan *chan, 1134fac9b31SCezary Rojewski dma_addr_t dst_addr, dma_addr_t src_addr, 1144fac9b31SCezary Rojewski size_t size); 1154fac9b31SCezary Rojewski 116ba202a7bSCezary Rojewski void lpt_dsp_pll_shutdown(struct catpt_dev *cdev, bool enable); 117ba202a7bSCezary Rojewski void wpt_dsp_pll_shutdown(struct catpt_dev *cdev, bool enable); 118ba202a7bSCezary Rojewski int catpt_dsp_power_up(struct catpt_dev *cdev); 119ba202a7bSCezary Rojewski int catpt_dsp_power_down(struct catpt_dev *cdev); 120ba202a7bSCezary Rojewski int catpt_dsp_stall(struct catpt_dev *cdev, bool stall); 121ba202a7bSCezary Rojewski void catpt_dsp_update_srampge(struct catpt_dev *cdev, struct resource *sram, 122ba202a7bSCezary Rojewski unsigned long mask); 123ba202a7bSCezary Rojewski int catpt_dsp_update_lpclock(struct catpt_dev *cdev); 124ba202a7bSCezary Rojewski irqreturn_t catpt_dsp_irq_handler(int irq, void *dev_id); 125ba202a7bSCezary Rojewski irqreturn_t catpt_dsp_irq_thread(int irq, void *dev_id); 12692946c1dSCezary Rojewski 12792946c1dSCezary Rojewski /* 12892946c1dSCezary Rojewski * IPC handlers may return positive values which denote successful 12992946c1dSCezary Rojewski * HOST <-> DSP communication yet failure to process specific request. 13092946c1dSCezary Rojewski * Use below macro to convert returned non-zero values appropriately 13192946c1dSCezary Rojewski */ 13292946c1dSCezary Rojewski #define CATPT_IPC_ERROR(err) (((err) < 0) ? (err) : -EREMOTEIO) 13392946c1dSCezary Rojewski 13492946c1dSCezary Rojewski int catpt_dsp_send_msg_timeout(struct catpt_dev *cdev, 13592946c1dSCezary Rojewski struct catpt_ipc_msg request, 13692946c1dSCezary Rojewski struct catpt_ipc_msg *reply, int timeout); 13792946c1dSCezary Rojewski int catpt_dsp_send_msg(struct catpt_dev *cdev, struct catpt_ipc_msg request, 13892946c1dSCezary Rojewski struct catpt_ipc_msg *reply); 13992946c1dSCezary Rojewski 14092946c1dSCezary Rojewski int catpt_first_boot_firmware(struct catpt_dev *cdev); 14192946c1dSCezary Rojewski int catpt_boot_firmware(struct catpt_dev *cdev, bool restore); 142a9aa6fb3SCezary Rojewski int catpt_store_streams_context(struct catpt_dev *cdev, struct dma_chan *chan); 143a9aa6fb3SCezary Rojewski int catpt_store_module_states(struct catpt_dev *cdev, struct dma_chan *chan); 144a9aa6fb3SCezary Rojewski int catpt_store_memdumps(struct catpt_dev *cdev, struct dma_chan *chan); 145a9aa6fb3SCezary Rojewski int catpt_coredump(struct catpt_dev *cdev); 146a9aa6fb3SCezary Rojewski 14764b9b1b0SCezary Rojewski #include <sound/memalloc.h> 14864b9b1b0SCezary Rojewski #include <uapi/sound/asound.h> 149ba202a7bSCezary Rojewski 150ba202a7bSCezary Rojewski struct snd_pcm_substream; 151ba202a7bSCezary Rojewski struct catpt_stream_template; 152ba202a7bSCezary Rojewski 153ba202a7bSCezary Rojewski struct catpt_stream_runtime { 154ba202a7bSCezary Rojewski struct snd_pcm_substream *substream; 155ba202a7bSCezary Rojewski 156ba202a7bSCezary Rojewski struct catpt_stream_template *template; 157ba202a7bSCezary Rojewski struct catpt_stream_info info; 158ba202a7bSCezary Rojewski struct resource *persistent; 159ba202a7bSCezary Rojewski struct snd_dma_buffer pgtbl; 160ba202a7bSCezary Rojewski 161ba202a7bSCezary Rojewski bool allocated; 162ba202a7bSCezary Rojewski bool prepared; 163ba202a7bSCezary Rojewski 164ba202a7bSCezary Rojewski struct list_head node; 165ba202a7bSCezary Rojewski }; 166ba202a7bSCezary Rojewski 167ba202a7bSCezary Rojewski int catpt_register_plat_component(struct catpt_dev *cdev); 168ba202a7bSCezary Rojewski void catpt_stream_update_position(struct catpt_dev *cdev, 169a126750fSCezary Rojewski struct catpt_stream_runtime *stream, 170a126750fSCezary Rojewski struct catpt_notify_position *pos); 171a126750fSCezary Rojewski struct catpt_stream_runtime * 172a126750fSCezary Rojewski catpt_stream_find(struct catpt_dev *cdev, u8 stream_hw_id); 173a126750fSCezary Rojewski int catpt_arm_stream_templates(struct catpt_dev *cdev); 174a126750fSCezary Rojewski 175a126750fSCezary Rojewski #endif 176a126750fSCezary Rojewski