linux/sound/soc/qcom/qdsp6/q6apm.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef __Q6APM_H__
   3#define __Q6APM_H__
   4#include <linux/types.h>
   5#include <linux/slab.h>
   6#include <linux/wait.h>
   7#include <linux/kernel.h>
   8#include <linux/module.h>
   9#include <linux/sched.h>
  10#include <linux/of.h>
  11#include <linux/delay.h>
  12#include <sound/soc.h>
  13#include <linux/of_platform.h>
  14#include <linux/jiffies.h>
  15#include <linux/soc/qcom/apr.h>
  16#include <dt-bindings/sound/qcom,q6dsp-lpass-ports.h>
  17#include "audioreach.h"
  18
  19#define APM_PORT_MAX            127
  20#define APM_PORT_MAX_AUDIO_CHAN_CNT 8
  21#define PCM_CHANNEL_NULL 0
  22#define PCM_CHANNEL_FL    1     /* Front left channel. */
  23#define PCM_CHANNEL_FR    2     /* Front right channel. */
  24#define PCM_CHANNEL_FC    3     /* Front center channel. */
  25#define PCM_CHANNEL_LS   4      /* Left surround channel. */
  26#define PCM_CHANNEL_RS   5      /* Right surround channel. */
  27#define PCM_CHANNEL_LFE  6      /* Low frequency effect channel. */
  28#define PCM_CHANNEL_CS   7      /* Center surround channel; Rear center ch */
  29#define PCM_CHANNEL_LB   8      /* Left back channel; Rear left channel. */
  30#define PCM_CHANNEL_RB   9      /* Right back channel; Rear right channel. */
  31#define PCM_CHANNELS   10       /* Top surround channel. */
  32
  33#define APM_TIMESTAMP_FLAG      0x80000000
  34#define FORMAT_LINEAR_PCM       0x0000
  35/* APM client callback events */
  36#define APM_CMD_EOS                             0x0003
  37#define APM_CLIENT_EVENT_CMD_EOS_DONE           0x1003
  38#define APM_CMD_CLOSE                           0x0004
  39#define APM_CLIENT_EVENT_CMD_CLOSE_DONE         0x1004
  40#define APM_CLIENT_EVENT_CMD_RUN_DONE           0x1008
  41#define APM_CLIENT_EVENT_DATA_WRITE_DONE        0x1009
  42#define APM_CLIENT_EVENT_DATA_READ_DONE         0x100a
  43#define APM_WRITE_TOKEN_MASK                   GENMASK(15, 0)
  44#define APM_WRITE_TOKEN_LEN_MASK               GENMASK(31, 16)
  45#define APM_WRITE_TOKEN_LEN_SHIFT              16
  46
  47#define APM_MAX_SESSIONS                        8
  48
  49struct q6apm {
  50        struct device *dev;
  51        gpr_port_t *port;
  52        gpr_device_t *gdev;
  53        /* For Graph OPEN/START/STOP/CLOSE operations */
  54        wait_queue_head_t wait;
  55        struct gpr_ibasic_rsp_result_t result;
  56
  57        struct mutex cmd_lock;
  58        struct mutex lock;
  59        uint32_t state;
  60
  61        struct idr graph_idr;
  62        struct idr graph_info_idr;
  63        struct idr sub_graphs_idr;
  64        struct idr containers_idr;
  65        struct idr modules_idr;
  66};
  67
  68struct audio_buffer {
  69        phys_addr_t phys;
  70        uint32_t size;          /* size of buffer */
  71};
  72
  73struct audioreach_graph_data {
  74        struct audio_buffer *buf;
  75        uint32_t num_periods;
  76        uint32_t dsp_buf;
  77        uint32_t mem_map_handle;
  78};
  79
  80struct audioreach_graph {
  81        struct audioreach_graph_info *info;
  82        uint32_t id;
  83        int state;
  84        int start_count;
  85        /* Cached Graph data */
  86        void *graph;
  87        struct kref refcount;
  88        struct q6apm *apm;
  89};
  90
  91typedef void (*q6apm_cb) (uint32_t opcode, uint32_t token,
  92                          void *payload, void *priv);
  93struct q6apm_graph {
  94        void *priv;
  95        q6apm_cb cb;
  96        uint32_t id;
  97        struct device *dev;
  98        struct q6apm *apm;
  99        gpr_port_t *port;
 100        struct audioreach_graph_data rx_data;
 101        struct audioreach_graph_data tx_data;
 102        struct gpr_ibasic_rsp_result_t result;
 103        wait_queue_head_t cmd_wait;
 104        struct mutex lock;
 105        struct audioreach_graph *ar_graph;
 106        struct audioreach_graph_info *info;
 107};
 108
 109/* Graph Operations */
 110struct q6apm_graph *q6apm_graph_open(struct device *dev, q6apm_cb cb,
 111                                     void *priv, int graph_id);
 112int q6apm_graph_close(struct q6apm_graph *graph);
 113int q6apm_graph_prepare(struct q6apm_graph *graph);
 114int q6apm_graph_start(struct q6apm_graph *graph);
 115int q6apm_graph_stop(struct q6apm_graph *graph);
 116int q6apm_graph_flush(struct q6apm_graph *graph);
 117
 118/* Media Format */
 119int q6apm_graph_media_format_pcm(struct q6apm_graph *graph,
 120                                 struct audioreach_module_config *cfg);
 121
 122int q6apm_graph_media_format_shmem(struct q6apm_graph *graph,
 123                                   struct audioreach_module_config *cfg);
 124
 125/* read/write related */
 126int q6apm_send_eos_nowait(struct q6apm_graph *graph);
 127int q6apm_read(struct q6apm_graph *graph);
 128int q6apm_write_async(struct q6apm_graph *graph, uint32_t len, uint32_t msw_ts,
 129                      uint32_t lsw_ts, uint32_t wflags);
 130
 131/* Memory Map related */
 132int q6apm_map_memory_regions(struct q6apm_graph *graph,
 133                             unsigned int dir, phys_addr_t phys,
 134                             size_t period_sz, unsigned int periods);
 135int q6apm_unmap_memory_regions(struct q6apm_graph *graph,
 136                               unsigned int dir);
 137/* Helpers */
 138int q6apm_send_cmd_sync(struct q6apm *apm, struct gpr_pkt *pkt,
 139                        uint32_t rsp_opcode);
 140
 141/* Callback for graph specific */
 142struct audioreach_module *q6apm_find_module_by_mid(struct q6apm_graph *graph,
 143                                                    uint32_t mid);
 144
 145void q6apm_set_fe_dai_ops(struct snd_soc_dai_driver *dai_drv);
 146int q6apm_connect_sub_graphs(struct q6apm *apm, u32 src_sgid, u32 dst_sgid,
 147                             bool connect);
 148bool q6apm_is_sub_graphs_connected(struct q6apm *apm, u32 src_sgid,
 149                                   u32 dst_sgid);
 150int q6apm_graph_get_rx_shmem_module_iid(struct q6apm_graph *graph);
 151
 152#endif /* __APM_GRAPH_ */
 153