add sound effect module waves
Subsystems (3)
v3 cover add sound effect module waves
From: "Lu, Han" <[email protected]>
Merged 5 patches(0004 to 0008) of last revision into 3 new patches
Lu, Han (3):
ASoC: Intel: add kcontrol to enable/disable sound effect module waves
ASoC: Intel: add function to set parameter to sound effect module
waves
ASoC: Intel: add kcontrol to set parameter to sound effect module
waves
sound/soc/intel/sst-haswell-ipc.c | 142 ++++++++++++++++++++++++++++++++++++++ sound/soc/intel/sst-haswell-ipc.h | 35 ++++++++++ sound/soc/intel/sst-haswell-pcm.c | 118 +++++++++++++++++++++++++++++++ 3 files changed, 295 insertions(+)
Signature · 1 line
1.9.1
PATCH v3 1/3 ASoC: Intel: add kcontrol to enable/disable sound effect module waves
From: "Lu, Han" <[email protected]>
Add kcontrol to enable/disable module waves. IPC is valid only when module is loaded. Also track module state over suspend so it's state can be restored on resume.
sound/soc/intel/sst-haswell-ipc.c +19 -0
@@ -337,6 +337,10 @@ struct sst_hsw {/* FW log stream */ struct sst_hsw_log_stream log_stream; + +/* flags bit field to track module state when resume from RTD3, +* each bit represent state (enabled/disabled) of single module */ +u32 enabled_modules_rtd3; };#define CREATE_TRACE_POINTS
@@ -1986,6 +1990,21 @@ bool sst_hsw_is_module_active(struct sst_hsw *hsw, u32 module_id)return false; } +void sst_hsw_set_module_enabled_rtd3 (struct sst_hsw *hsw,u32 module_id) +{ + hsw->enabled_modules_rtd3 |= (1 << module_id); +} + +void sst_hsw_set_module_disabled_rtd3 (struct sst_hsw *hsw,u32 module_id) +{ + hsw->enabled_modules_rtd3 &= ~(1 << module_id); +} + +bool sst_hsw_is_module_enabled_rtd3 (struct sst_hsw *hsw,u32 module_id) +{ +return hsw->enabled_modules_rtd3 & (1 << module_id); +} +int sst_hsw_module_load (struct sst_hsw *hsw,u32 module_id,u32 instance_id,char *name) {
sound/soc/intel/sst-haswell-ipc.h +3 -0
@@ -477,6 +477,9 @@ struct sst_dsp *sst_hsw_get_dsp(struct sst_hsw *hsw);void sst_hsw_init_module_state (struct sst_hsw *hsw);bool sst_hsw_is_module_loaded (struct sst_hsw *hsw,u32 module_id);bool sst_hsw_is_module_active (struct sst_hsw *hsw,u32 module_id); +void sst_hsw_set_module_enabled_rtd3 (struct sst_hsw *hsw,u32 module_id); +void sst_hsw_set_module_disabled_rtd3 (struct sst_hsw *hsw,u32 module_id); +bool sst_hsw_is_module_enabled_rtd3 (struct sst_hsw *hsw,u32 module_id);int sst_hsw_module_load (struct sst_hsw *hsw,u32 module_id,u32 instance_id,char *name);
sound/soc/intel/sst-haswell-pcm.c +68 -0
96 lines not on this page · raw message
Signature · 1 line
1.9.1
PATCH v3 2/3 ASoC: Intel: add function to set parameter to sound effect module waves
In reply to [email protected]From: "Lu, Han" <[email protected]>
Add function to set parameters to module waves. The parameters can be set only when module is enabled, and parameter size is limited to 500 Bytes.
sound/soc/intel/sst-haswell-ipc.c +59 -0
@@ -2166,6 +2166,65 @@ int sst_hsw_module_disable(struct sst_hsw *hsw,return ret; } +int sst_hsw_module_set_param (struct sst_hsw *hsw, +u32 module_id,u32 instance_id,u32 parameter_id, +u32 param_size,char *param) +{ +int ret; +unsigned char *data =NULL ; +u32 header =0 ; +u32 payload_size =0 , transfer_parameter_size =0 ; +dma_addr_t dma_addr =0 ; +struct sst_hsw_transfer_parameter *parameter; +struct device *dev = hsw->dev; + + header =IPC_GLB_TYPE (IPC_GLB_MODULE_OPERATION ) | +IPC_MODULE_OPERATION (IPC_MODULE_SET_PARAMETER ) | +IPC_MODULE_ID (module_id); +dev_dbg (dev,"sst_hsw_module_set_param header=%x\n" , header); + + payload_size = param_size + +sizeof (struct sst_hsw_transfer_parameter ) - +sizeof (struct sst_hsw_transfer_list ); +dev_dbg (dev,"parameter size : %d\n" , param_size); +dev_dbg (dev,"payload size : %d\n" , payload_size); + +if (payload_size <=SST_HSW_IPC_MAX_SHORT_PARAMETER_SIZE ) { +/* short parameter, mailbox can contain data */ +dev_dbg (dev,"transfer parameter size : %d\n" , + transfer_parameter_size); + + transfer_parameter_size =ALIGN (payload_size,4 ); +dev_dbg (dev,"transfer parameter aligned size : %d\n" , + transfer_parameter_size); + + parameter =kzalloc (transfer_parameter_size,GFP_KERNEL ); +if (parameter ==NULL ) +return -ENOMEM ; + +memcpy (parameter->data, param, param_size); + }else { +dev_warn (dev,"transfer parameter size too large!" ); +return 0 ; + } + + parameter->parameter_id = parameter_id; + parameter->data_size = param_size; + + ret =ipc_tx_message_wait (hsw, header, + parameter, transfer_parameter_size ,NULL ,0 ); +if (ret <0 ) +dev_err (dev,"ipc: module set parameter failed - %d\n" , ret); + +kfree (parameter); + +if (data) +dma_free_coherent (hsw->dsp->dma_dev, + param_size, (void *)data, dma_addr); + +return ret; +} +static struct sst_dsp_device hsw_dev = { .thread = hsw_irq_thread, .ops = &haswell_ops,
sound/soc/intel/sst-haswell-ipc.h +26 -0
@@ -37,6 +37,7 @@#define SST_HSW_IPC_MAX_PAYLOAD_SIZE 400#define SST_HSW_MAX_INFO_SIZE 64#define SST_HSW_BUILD_HASH_LENGTH 40 +#define SST_HSW_IPC_MAX_SHORT_PARAMETER_SIZE 500struct sst_hsw ;struct sst_hsw_stream ;
@@ -187,6 +188,28 @@ enum sst_hsw_performance_action { SST_HSW_PERF_STOP = 1, }; +struct sst_hsw_transfer_info { +uint32_t destination;/* destination address */ +uint32_t reverse:1 ;/* if 1 data flows from destination */ +uint32_t size:31 ;/* transfer size in bytes.*/ +uint16_t first_page_offset;/* offset to data in the first page. */ +uint8_t packed_pages;/* page addresses. Each occupies 20 bits */ +} __attribute__((packed)); + +struct sst_hsw_transfer_list { +uint32_t transfers_count; +struct sst_hsw_transfer_info transfers; +} __attribute__((packed)); + +struct sst_hsw_transfer_parameter { +uint32_t parameter_id; +uint32_t data_size; +union { +uint8_t data[1 ]; +struct sst_hsw_transfer_list transfer_list; + }; +} __attribute__((packed)); +/* SST firmware module info */ struct sst_hsw_module_info {u8 name[SST_HSW_MAX_INFO_SIZE ];
@@ -487,6 +510,9 @@ int sst_hsw_module_enable(struct sst_hsw *hsw, u32 module_id, u32 instance_id);int sst_hsw_module_disable (struct sst_hsw *hsw,u32 module_id,u32 instance_id); +int sst_hsw_module_set_param (struct sst_hsw *hsw, +u32 module_id,u32 instance_id,u32 parameter_id, +u32 param_size,char *param);/* runtime module management */ struct sst_module_runtime *sst_hsw_runtime_module_create(struct sst_hsw *hsw,
Signature · 1 line
1.9.1
PATCH v3 3/3 ASoC: Intel: add kcontrol to set parameter to sound effect module waves
In reply to [email protected]From: "Lu, Han" <[email protected]>
Each kcontrol command includes a line of parameters up to 128 bytes. kcontrol command to set param:
cset "name='Waves Set Param' <0x01,0xff,...>"
or
cset-bin-file "name='Waves Set Param' <path/to/binary/config/file>"
The parameter lines are stored in a buffer array, so can be read back from buffer rather than from DSP, and be relaunched to DSP when resume from RTD3. The buffer size is 160 parameter lines.
kcontrol command to reset the buffer:
cset "name='Waves Set Param' 0xff"
alsa-lib v1.0.29 or commit 6ea14c36 and f47480af are required to support the kcontrol commands.
sound/soc/intel/sst-haswell-ipc.c +64 -0
@@ -341,6 +341,11 @@ struct sst_hsw {/* flags bit field to track module state when resume from RTD3, * each bit represent state (enabled/disabled) of single module */ u32 enabled_modules_rtd3; + +/* buffer to store parameter lines */ +u32 param_idx_w;/* write index */ +u32 param_idx_r;/* read index */ +u8 param_buf[WAVES_PARAM_LINES ][WAVES_PARAM_COUNT ]; };#define CREATE_TRACE_POINTS
@@ -2005,6 +2010,62 @@ bool sst_hsw_is_module_enabled_rtd3(struct sst_hsw *hsw, u32 module_id)return hsw->enabled_modules_rtd3 & (1 << module_id); } +void sst_hsw_reset_param_buf (struct sst_hsw *hsw) +{ + hsw->param_idx_w =0 ; + hsw->param_idx_r =0 ; +memset ((void *)hsw->param_buf,0 ,sizeof (hsw->param_buf)); +} + +int sst_hsw_store_param_line (struct sst_hsw *hsw,u8 *buf) +{ +/* save line to the first available position of param buffer */ +if (hsw->param_idx_w >WAVES_PARAM_LINES -1 ) { +dev_warn (hsw->dev,"warning: param buffer overflow!\n" ); +return -EPERM ; + } +memcpy (hsw->param_buf[hsw->param_idx_w], buf,WAVES_PARAM_COUNT ); + hsw->param_idx_w++; +return 0 ; +} + +int sst_hsw_load_param_line (struct sst_hsw *hsw,u8 *buf) +{ +u8 id =0 ; + +/* read the first matching line from param buffer */ +while (hsw->param_idx_r <WAVES_PARAM_LINES ) { + id = hsw->param_buf[hsw->param_idx_r][0 ]; + hsw->param_idx_r++; +if (buf[0 ] == id) { +memcpy (buf, hsw->param_buf[hsw->param_idx_r], +WAVES_PARAM_COUNT ); +break ; + } + } +if (hsw->param_idx_r >WAVES_PARAM_LINES -1 ) { +dev_dbg (hsw->dev,"end of buffer, roll to the beginning\n" ); + hsw->param_idx_r =0 ; +return 0 ; + } +return 0 ; +} + +int sst_hsw_launch_param_buf (struct sst_hsw *hsw) +{ +int ret, idx; + +/* put all param lines to DSP through ipc */ +for (idx =0 ; idx < hsw->param_idx_w; idx++) { + ret =sst_hsw_module_set_param (hsw, +SST_HSW_MODULE_WAVES ,0 , hsw->param_buf[idx][0 ], +WAVES_PARAM_COUNT , hsw->param_buf[idx]); +if (ret <0 ) +return ret; + } +return 0 ; +} +int sst_hsw_module_load (struct sst_hsw *hsw,u32 module_id,u32 instance_id,char *name) {
@@ -2304,6 +2365,9 @@ int sst_hsw_dsp_init(struct device *dev, struct sst_pdata *pdata)if (ret <0 ) goto boot_err; +/* init param buffer */ +sst_hsw_reset_param_buf (hsw); +/* wait for DSP boot completion */ sst_dsp_boot (hsw->dsp); ret = wait_event_timeout(hsw->boot_wait, hsw->boot_complete,
sound/soc/intel/sst-haswell-ipc.h +6 -0
@@ -38,6 +38,8 @@#define SST_HSW_MAX_INFO_SIZE 64#define SST_HSW_BUILD_HASH_LENGTH 40#define SST_HSW_IPC_MAX_SHORT_PARAMETER_SIZE 500 +#define WAVES_PARAM_COUNT 128 +#define WAVES_PARAM_LINES 160struct sst_hsw ;struct sst_hsw_stream ;
@@ -503,6 +505,10 @@ bool sst_hsw_is_module_active(struct sst_hsw *hsw, u32 module_id);void sst_hsw_set_module_enabled_rtd3 (struct sst_hsw *hsw,u32 module_id);void sst_hsw_set_module_disabled_rtd3 (struct sst_hsw *hsw,u32 module_id);bool sst_hsw_is_module_enabled_rtd3 (struct sst_hsw *hsw,u32 module_id); +void sst_hsw_reset_param_buf (struct sst_hsw *hsw); +int sst_hsw_store_param_line (struct sst_hsw *hsw,u8 *buf); +int sst_hsw_load_param_line (struct sst_hsw *hsw,u8 *buf); +int sst_hsw_launch_param_buf (struct sst_hsw *hsw);int sst_hsw_module_load (struct sst_hsw *hsw,u32 module_id,u32 instance_id,char *name);
sound/soc/intel/sst-haswell-pcm.c +50 -0
68 lines not on this page · raw message
Signature · 1 line
1.9.1
Quoted 3 lines · On Thu, Mar 12, 2015 at 01:52:59PM +0800, [email protected] wrote:
From: "Lu, Han" <[email protected]>
Merged 5 patches(0004 to 0008) of last revision into 3 new patches
Applied all, thanks.