blob: d5d6ad63b164f5a2473efc327f15c4320b1c75f1 [file] [log] [blame]
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (c) 2013-2020, The Linux Foundation. All rights reserved.
*/
#ifndef __Q6LSM_H__
#define __Q6LSM_H__
#include <linux/list.h>
#include <linux/msm_ion.h>
#include <dsp/apr_audio-v2.h>
#include <sound/lsm_params.h>
#include <ipc/apr.h>
#define MAX_NUM_CONFIDENCE 20
#define ADM_LSM_PORT_ID 0xADCB
#define LSM_MAX_NUM_CHANNELS 8
#define LSM_V3P0_MAX_NUM_CHANNELS 9
#define LSM_API_VERSION_V3 3
#define MAX_LSM_SESSIONS 8
typedef void (*lsm_app_cb)(uint32_t opcode, uint32_t token,
uint32_t *payload, uint16_t client_size, void *priv);
struct lsm_sound_model {
dma_addr_t phys;
void *data;
size_t size; /* size of buffer */
uint32_t actual_size; /* actual number of bytes read by DSP */
struct dma_buf *dma_buf;
uint32_t mem_map_handle;
};
struct snd_lsm_event_status_v2 {
uint16_t status;
uint16_t payload_size;
uint8_t confidence_value[0];
};
struct lsm_lab_buffer {
dma_addr_t phys;
void *data;
size_t size;
struct dma_buf *dma_buf;
uint32_t mem_map_handle;
};
struct lsm_hw_params {
u16 sample_rate;
u16 sample_size;
u32 buf_sz;
u32 period_count;
u16 num_chs;
};
struct lsm_cal_data_info {
dma_addr_t phys;
void *data;
size_t size;
struct dma_buf *dma_buf;
uint32_t mem_map_handle;
};
struct lsm_stage_config {
uint32_t app_type;
uint32_t topology_id;
bool lpi_enable;
bool lab_enable;
struct lsm_sound_model sound_model;
struct lsm_cal_data_info cal_info;
};
struct lsm_client {
int session;
lsm_app_cb cb;
atomic_t cmd_state;
void *priv;
struct apr_svc *apr;
struct apr_svc *mmap_apr;
struct mutex cmd_lock;
wait_queue_head_t cmd_wait;
uint32_t cmd_err_code;
uint16_t mode;
uint16_t connect_to_port;
uint8_t num_confidence_levels;
uint8_t *confidence_levels;
bool opened;
bool started;
uint32_t app_id;
bool lab_enable;
bool lab_started;
struct lsm_lab_buffer *lab_buffer;
struct lsm_hw_params out_hw_params;
struct lsm_hw_params in_hw_params;
bool use_topology;
int session_state;
bool poll_enable;
int perf_mode;
uint32_t event_mode;
uint32_t event_type;
uint32_t num_stages;
struct lsm_stage_config stage_cfg[LSM_MAX_STAGES_PER_SESSION];
uint64_t fe_id;
uint16_t unprocessed_data;
void *get_param_payload;
size_t param_size;
};
struct lsm_stream_cmd_open_tx {
struct apr_hdr hdr;
uint16_t app_id;
uint16_t reserved;
uint32_t sampling_rate;
} __packed;
struct lsm_stream_cmd_open_tx_v2 {
struct apr_hdr hdr;
uint32_t topology_id;
} __packed;
struct lsm_stream_stage_info {
uint32_t topology_id;
uint32_t island_enable;
} __packed;
struct lsm_stream_cmd_open_tx_v3 {
struct apr_hdr hdr;
uint32_t num_stages;
struct lsm_stream_stage_info stage_info[0];
} __packed;
struct lsm_custom_topologies {
struct apr_hdr hdr;
uint32_t data_payload_addr_lsw;
uint32_t data_payload_addr_msw;
uint32_t mem_map_handle;
uint32_t buffer_size;
} __packed;
struct lsm_session_cmd_set_params_v2 {
struct apr_hdr apr_hdr;
uint32_t payload_size;
struct mem_mapping_hdr mem_hdr;
u32 param_data[0];
} __packed;
struct lsm_session_cmd_set_params_v3 {
struct apr_hdr apr_hdr;
struct mem_mapping_hdr mem_hdr;
uint32_t payload_size;
u32 param_data[0];
} __packed;
struct lsm_session_cmd_get_params_v2 {
struct apr_hdr apr_hdr;
struct mem_mapping_hdr mem_hdr;
struct param_hdr_v2 param_info;
} __packed;
struct lsm_session_cmd_get_params_v3 {
struct apr_hdr apr_hdr;
struct mem_mapping_hdr mem_hdr;
struct param_hdr_v3 param_info;
} __packed;
struct lsm_param_op_mode {
uint32_t minor_version;
uint16_t mode;
uint16_t reserved;
} __packed;
struct lsm_param_connect_to_port {
uint32_t minor_version;
/* AFE port id that receives voice wake up data */
uint16_t port_id;
uint16_t unprocessed_data;
} __packed;
struct lsm_param_poll_enable {
uint32_t minor_version;
/* indicates to voice wakeup that HW MAD/SW polling is enabled or not */
uint32_t polling_enable;
} __packed;
struct lsm_param_fwk_mode_cfg {
uint32_t minor_version;
uint32_t mode;
} __packed;
struct lsm_param_media_fmt {
uint32_t minor_version;
uint32_t sample_rate;
uint16_t num_channels;
uint16_t bit_width;
uint8_t channel_mapping[LSM_MAX_NUM_CHANNELS];
} __packed;
struct lsm_param_media_fmt_v2 {
uint32_t minor_version;
uint32_t sample_rate;
uint16_t bit_width;
uint16_t num_channels;
uint8_t channel_mapping[0];
} __packed;
struct lsm_param_confidence_levels {
uint8_t num_confidence_levels;
uint8_t confidence_levels[0];
} __packed;
struct lsm_param_epd_thres {
uint32_t minor_version;
uint32_t epd_begin;
uint32_t epd_end;
} __packed;
struct lsm_param_gain {
uint32_t minor_version;
uint16_t gain;
uint16_t reserved;
} __packed;
struct lsm_cmd_reg_snd_model {
struct apr_hdr hdr;
uint32_t model_size;
uint32_t model_addr_lsw;
uint32_t model_addr_msw;
uint32_t mem_map_handle;
} __packed;
struct lsm_param_lab_enable {
uint16_t enable;
uint16_t reserved;
} __packed;
struct lsm_param_lab_config {
uint32_t minor_version;
uint32_t wake_up_latency_ms;
} __packed;
struct lsm_param_lab_out_ch_cfg {
uint32_t minor_version;
uint32_t num_channels;
uint8_t channel_indices[0];
} __packed;
struct lsm_cmd_read {
struct apr_hdr hdr;
uint32_t buf_addr_lsw;
uint32_t buf_addr_msw;
uint32_t mem_map_handle;
uint32_t buf_size;
} __packed;
struct lsm_cmd_read_done {
struct apr_hdr hdr;
uint32_t status;
uint32_t buf_addr_lsw;
uint32_t buf_addr_msw;
uint32_t mem_map_handle;
uint32_t total_size;
uint32_t offset;
uint32_t timestamp_lsw;
uint32_t timestamp_msw;
uint32_t flags;
} __packed;
struct lsm_param_det_event_type {
uint32_t minor_version;
uint32_t event_type;
uint32_t mode;
} __packed;
struct lsm_client *q6lsm_client_alloc(lsm_app_cb cb, void *priv);
void q6lsm_client_free(struct lsm_client *client);
int q6lsm_open(struct lsm_client *client, uint16_t app_id);
int q6lsm_start(struct lsm_client *client, bool wait);
int q6lsm_stop(struct lsm_client *client, bool wait);
int q6lsm_snd_model_buf_alloc(struct lsm_client *client, size_t len,
struct lsm_params_info_v2 *p_info);
int q6lsm_snd_model_buf_free(struct lsm_client *client,
struct lsm_params_info_v2 *p_info);
int q6lsm_close(struct lsm_client *client);
int q6lsm_register_sound_model(struct lsm_client *client,
enum lsm_detection_mode mode,
bool detectfailure);
int q6lsm_set_data(struct lsm_client *client,
enum lsm_detection_mode mode,
bool detectfailure);
int q6lsm_deregister_sound_model(struct lsm_client *client);
void set_lsm_port(int lsm_port);
int get_lsm_port(void);
int q6lsm_lab_control(struct lsm_client *client, u32 enable,
struct lsm_params_info_v2 *p_info);
int q6lsm_stop_lab(struct lsm_client *client);
int q6lsm_read(struct lsm_client *client, struct lsm_cmd_read *read);
int q6lsm_lab_buffer_alloc(struct lsm_client *client, bool alloc);
int q6lsm_set_one_param(struct lsm_client *client,
struct lsm_params_info_v2 *p_info, void *data,
uint32_t param_type);
int q6lsm_get_one_param(struct lsm_client *client,
struct lsm_params_get_info *p_info,
uint32_t param_type);
void q6lsm_sm_set_param_data(struct lsm_client *client,
struct lsm_params_info_v2 *p_info,
size_t *offset);
int q6lsm_set_port_connected(struct lsm_client *client);
int q6lsm_set_fwk_mode_cfg(struct lsm_client *client, uint32_t event_mode);
int q6lsm_set_media_fmt_params(struct lsm_client *client);
int q6lsm_set_media_fmt_v2_params(struct lsm_client *client);
int q6lsm_lab_out_ch_cfg(struct lsm_client *client, u8 *ch_map,
struct lsm_params_info_v2 *p_info);
bool q6lsm_adsp_supports_multi_stage_detection(void);
int q6lsm_set_afe_data_format(uint64_t fe_id, uint16_t afe_data_format);
void q6lsm_get_afe_data_format(uint64_t fe_id, uint16_t *afe_data_format);
#endif /* __Q6LSM_H__ */