summaryrefslogtreecommitdiff
path: root/sound/soc/fsl/fsl_dsp.h
diff options
context:
space:
mode:
Diffstat (limited to 'sound/soc/fsl/fsl_dsp.h')
-rw-r--r--sound/soc/fsl/fsl_dsp.h172
1 files changed, 172 insertions, 0 deletions
diff --git a/sound/soc/fsl/fsl_dsp.h b/sound/soc/fsl/fsl_dsp.h
new file mode 100644
index 000000000000..e56293096d9d
--- /dev/null
+++ b/sound/soc/fsl/fsl_dsp.h
@@ -0,0 +1,172 @@
+/* SPDX-License-Identifier: (GPL-2.0+ OR MIT)*/
+/*
+ * Copyright (C) 2017 Cadence Design Systems, Inc.
+ * Copyright 2018-2020 NXP
+ *
+ */
+
+#ifndef FSL_DSP_H
+#define FSL_DSP_H
+#include <uapi/linux/mxc_dsp.h>
+#include <linux/firmware/imx/ipc.h>
+#include "fsl_dsp_proxy.h"
+#include "fsl_dsp_platform.h"
+#include "fsl_dsp_audiomix.h"
+
+
+#define FSL_DSP_COMP_NAME "fsl-dsp-component"
+
+typedef void (*memcpy_func) (void *dest, const void *src, size_t n);
+typedef void (*memset_func) (void *s, int c, size_t n);
+
+/* ...maximal number of IPC clients per proxy */
+#define XF_CFG_MAX_IPC_CLIENTS (1 << 4)
+
+enum {
+ DSP_IMX8QXP_TYPE = 0,
+ DSP_IMX8QM_TYPE,
+ DSP_IMX8MP_TYPE,
+};
+
+/* ...proxy client data */
+struct xf_client {
+ /* ...pointer to proxy interface */
+ struct xf_proxy *proxy;
+
+ /* ...allocated proxy client id */
+ u32 id;
+
+ /* ...pending response queue */
+ struct xf_msg_queue queue;
+ /* ...response waiting queue */
+ wait_queue_head_t wait;
+
+ /* ...virtual memory mapping */
+ unsigned long vm_start;
+ /* ...counter of memory mappings (no real use of it yet - tbd) */
+ atomic_t vm_use;
+
+ /* ...global structure pointer */
+ void *global;
+ struct xf_message m;
+
+ struct snd_compr_stream *cstream;
+
+ struct work_struct work;
+ struct completion compr_complete;
+
+ int input_bytes;
+ int consume_bytes;
+ int offset;
+ atomic_t buffer_cnt;
+ int ping_pong_offset;
+};
+
+union xf_client_link {
+ /* ...index of next client in free list */
+ u32 next;
+
+ /* ...reference to proxy data for allocated client */
+ struct xf_client *client;
+};
+
+struct fsl_dsp {
+ struct device *dev;
+ const char *fw_name;
+ const char *audio_iface;
+ void __iomem *regs;
+ void __iomem *mu_base_virtaddr;
+ struct imx_sc_ipc *dsp_ipcHandle;
+ struct imx_audiomix_dsp_data *audiomix;
+ unsigned int dsp_mu_id;
+ int dsp_mu_init;
+ int dsp_is_lpa;
+ atomic_long_t refcnt;
+ unsigned long paddr;
+ unsigned long dram0;
+ unsigned long dram1;
+ unsigned long iram;
+ unsigned long sram;
+ void *sdram_vir_addr;
+ unsigned long sdram_phys_addr;
+ int sdram_reserved_size;
+ void *dram_reserved_vir_addr;
+ unsigned long dram_reserved_phys_addr;
+ int dram_reserved_size;
+ void *ocram_vir_addr;
+ unsigned long ocram_phys_addr;
+ int ocram_reserved_size;
+ void *msg_buf_virt;
+ dma_addr_t msg_buf_phys;
+ int msg_buf_size;
+ void *scratch_buf_virt;
+ dma_addr_t scratch_buf_phys;
+ int scratch_buf_size;
+ void *dsp_config_virt;
+ dma_addr_t dsp_config_phys;
+ int dsp_config_size;
+ int dsp_board_type;
+ unsigned int fixup_offset;
+
+ /* ...proxy data structures */
+ struct xf_proxy proxy;
+
+ /* ...mutex lock */
+ struct mutex dsp_mutex;
+
+ struct dsp_data dsp_data;
+
+ /* ...global clients pool (item[0] serves as list terminator) */
+ union xf_client_link xf_client_map[XF_CFG_MAX_IPC_CLIENTS];
+
+ struct clk *esai_ipg_clk;
+ struct clk *esai_mclk;
+ struct clk *asrc_mem_clk;
+ struct clk *asrc_ipg_clk;
+ struct clk *asrck_clk[4];
+ struct clk *dsp_ocrama_clk;
+ struct clk *dsp_root_clk;
+ struct clk *audio_root_clk;
+ struct clk *audio_axi_clk;
+ struct clk *debug_clk;
+ struct clk *mu2_clk;
+ struct clk *sdma_root_clk;
+ struct clk *sai_ipg_clk;
+ struct clk *sai_mclk;
+ struct clk *uart_ipg_clk;
+ struct clk *uart_per_clk;
+
+ struct device **pd_dev;
+ struct device_link **pd_dev_link;
+ int num_domains;
+};
+
+#define IRAM_OFFSET 0x10000
+#define IRAM_SIZE 2048
+
+#define DRAM0_OFFSET 0x0
+#define DRAM0_SIZE 0x8000
+
+#define DRAM1_OFFSET 0x8000
+#define DRAM1_SIZE 0x8000
+
+#define SYSRAM_OFFSET 0x18000
+#define SYSRAM_SIZE 0x40000
+
+#define SYSROM_OFFSET 0x58000
+#define SYSROM_SIZE 0x30000
+
+#define MSG_BUF_SIZE 8192
+#define INPUT_BUF_SIZE 4096
+#define OUTPUT_BUF_SIZE 16384
+#define DSP_CONFIG_SIZE 8192
+
+void *memcpy_dsp(void *dest, const void *src, size_t count);
+void *memset_dsp(void *dest, int c, size_t count);
+struct xf_client *xf_client_lookup(struct fsl_dsp *dsp_priv, u32 id);
+struct xf_client *xf_client_alloc(struct fsl_dsp *dsp_priv);
+
+int fsl_dsp_open_func(struct fsl_dsp *dsp_priv, struct xf_client *client);
+int fsl_dsp_close_func(struct xf_client *client);
+
+#endif