From 54b7fb7bce7530d429bfb0b83672b26a53f5d00f Mon Sep 17 00:00:00 2001 From: Bhalchandra Gajare Date: Thu, 10 May 2018 14:15:12 -0700 Subject: [PATCH 1/2] uapi: msm_audio_calibration: add new cal type for ADM_LSM New cal type ADM_LSM_AUDPROC_PERSISTENT is added to enable the larger calibration sizes for ADM that need to be kept persistent in memory. Change-Id: Ie23f52d6aad45dc1133a4a6fa692c1331b93d3e8 Signed-off-by: Bhalchandra Gajare --- include/uapi/linux/msm_audio_calibration.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/uapi/linux/msm_audio_calibration.h b/include/uapi/linux/msm_audio_calibration.h index 0672ee311299..9bd64aac8b53 100644 --- a/include/uapi/linux/msm_audio_calibration.h +++ b/include/uapi/linux/msm_audio_calibration.h @@ -103,6 +103,7 @@ enum { AFE_LSM_TX_CAL_TYPE, ADM_LSM_TOPOLOGY_CAL_TYPE, ADM_LSM_AUDPROC_CAL_TYPE, + ADM_LSM_AUDPROC_PERSISTENT_CAL_TYPE, MAX_CAL_TYPES, }; @@ -115,6 +116,7 @@ enum { #define AFE_LSM_TX_CAL_TYPE AFE_LSM_TX_CAL_TYPE #define ADM_LSM_TOPOLOGY_CAL_TYPE ADM_LSM_TOPOLOGY_CAL_TYPE #define ADM_LSM_AUDPROC_CAL_TYPE ADM_LSM_AUDPROC_CAL_TYPE +#define ADM_LSM_AUDPROC_PERSISTENT_CAL_TYPE ADM_LSM_AUDPROC_PERSISTENT_CAL_TYPE #define LSM_CAL_TYPES #define TOPOLOGY_SPECIFIC_CHANNEL_INFO From bbb641427bccc09884da3f458b2c2bd489047c65 Mon Sep 17 00:00:00 2001 From: Bhalchandra Gajare Date: Thu, 10 May 2018 14:16:49 -0700 Subject: [PATCH 2/2] dsp: q6adm: add ADM_LSM_AUDPROC_PERSISTENT cal type ADM supports certain modules that can have very large calibration sizes, in such cases the calibration is expected to be persistent in memory. Add new cal type for this purpose. Change-Id: Ieb2e941036595b7dff4b8bfb341f2ec152cf648a Signed-off-by: Bhalchandra Gajare --- dsp/audio_cal_utils.c | 2 ++ dsp/q6adm.c | 35 ++++++++++++++++++++++++++++++----- include/dsp/q6adm-v2.h | 2 ++ 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/dsp/audio_cal_utils.c b/dsp/audio_cal_utils.c index 77cb1c5b6e1e..47ac5becfc2b 100644 --- a/dsp/audio_cal_utils.c +++ b/dsp/audio_cal_utils.c @@ -63,6 +63,7 @@ size_t get_cal_info_size(int32_t cal_type) break; case ADM_AUDPROC_CAL_TYPE: case ADM_LSM_AUDPROC_CAL_TYPE: + case ADM_LSM_AUDPROC_PERSISTENT_CAL_TYPE: size = sizeof(struct audio_cal_info_audproc); break; case ADM_AUDVOL_CAL_TYPE: @@ -213,6 +214,7 @@ size_t get_user_cal_type_size(int32_t cal_type) break; case ADM_AUDPROC_CAL_TYPE: case ADM_LSM_AUDPROC_CAL_TYPE: + case ADM_LSM_AUDPROC_PERSISTENT_CAL_TYPE: size = sizeof(struct audio_cal_type_audproc); break; case ADM_AUDVOL_CAL_TYPE: diff --git a/dsp/q6adm.c b/dsp/q6adm.c index 7d59fbbce66a..26402f38b1e2 100644 --- a/dsp/q6adm.c +++ b/dsp/q6adm.c @@ -2000,7 +2000,8 @@ static struct cal_block_data *adm_find_cal_by_path(int cal_index, int path) continue; if (cal_index == ADM_AUDPROC_CAL || - cal_index == ADM_LSM_AUDPROC_CAL) { + cal_index == ADM_LSM_AUDPROC_CAL || + cal_index == ADM_LSM_AUDPROC_PERSISTENT_CAL) { audproc_cal_info = cal_block->cal_info; if ((audproc_cal_info->path == path) && (cal_block->cal_data.size > 0)) @@ -2037,7 +2038,8 @@ static struct cal_block_data *adm_find_cal_by_app_type(int cal_index, int path, continue; if (cal_index == ADM_AUDPROC_CAL || - cal_index == ADM_LSM_AUDPROC_CAL) { + cal_index == ADM_LSM_AUDPROC_CAL || + cal_index == ADM_LSM_AUDPROC_PERSISTENT_CAL) { audproc_cal_info = cal_block->cal_info; if ((audproc_cal_info->path == path) && (audproc_cal_info->app_type == app_type) && @@ -2077,7 +2079,8 @@ static struct cal_block_data *adm_find_cal(int cal_index, int path, continue; if (cal_index == ADM_AUDPROC_CAL || - cal_index == ADM_LSM_AUDPROC_CAL) { + cal_index == ADM_LSM_AUDPROC_CAL || + cal_index == ADM_LSM_AUDPROC_PERSISTENT_CAL) { audproc_cal_info = cal_block->cal_info; if ((audproc_cal_info->path == path) && (audproc_cal_info->app_type == app_type) && @@ -2165,12 +2168,18 @@ static void send_adm_cal(int port_id, int copp_idx, int path, int perf_mode, { pr_debug("%s: port id 0x%x copp_idx %d\n", __func__, port_id, copp_idx); - if (passthr_mode != LISTEN) + if (passthr_mode != LISTEN) { send_adm_cal_type(ADM_AUDPROC_CAL, path, port_id, copp_idx, perf_mode, app_type, acdb_id, sample_rate); - else + } else { send_adm_cal_type(ADM_LSM_AUDPROC_CAL, path, port_id, copp_idx, perf_mode, app_type, acdb_id, sample_rate); + + send_adm_cal_type(ADM_LSM_AUDPROC_PERSISTENT_CAL, path, + port_id, copp_idx, perf_mode, app_type, + acdb_id, sample_rate); + } + send_adm_cal_type(ADM_AUDVOL_CAL, path, port_id, copp_idx, perf_mode, app_type, acdb_id, sample_rate); } @@ -3297,6 +3306,9 @@ static int get_cal_type_index(int32_t cal_type) case ADM_RTAC_AUDVOL_CAL_TYPE: ret = ADM_RTAC_AUDVOL_CAL; break; + case ADM_LSM_AUDPROC_PERSISTENT_CAL_TYPE: + ret = ADM_LSM_AUDPROC_PERSISTENT_CAL; + break; default: pr_err("%s: invalid cal type %d!\n", __func__, cal_type); } @@ -3518,6 +3530,12 @@ static int adm_init_cal_data(void) adm_set_cal, NULL, NULL} }, {adm_map_cal_data, adm_unmap_cal_data, cal_utils_match_buf_num} }, + + {{ADM_LSM_AUDPROC_PERSISTENT_CAL_TYPE, + {adm_alloc_cal, adm_dealloc_cal, NULL, + adm_set_cal, NULL, NULL} }, + {adm_map_cal_data, adm_unmap_cal_data, + cal_utils_match_buf_num} }, }; pr_debug("%s:\n", __func__); @@ -3987,6 +4005,13 @@ int adm_store_cal_data(int port_id, int copp_idx, int path, int perf_mode, rc = -ENOMEM; goto unlock; } + } else if (cal_index == ADM_LSM_AUDPROC_PERSISTENT_CAL) { + if (cal_block->cal_data.size > AUD_PROC_PERSIST_BLOCK_SIZE) { + pr_err("%s:persist invalid size exp/actual[%zd, %d]\n", + __func__, cal_block->cal_data.size, *size); + rc = -ENOMEM; + goto unlock; + } } else if (cal_index == ADM_AUDVOL_CAL) { if (cal_block->cal_data.size > AUD_VOL_BLOCK_SIZE) { pr_err("%s:aud_vol:invalid size exp/actual[%zd, %d]\n", diff --git a/include/dsp/q6adm-v2.h b/include/dsp/q6adm-v2.h index bc3fdcfabfc5..3193b7f7efc1 100644 --- a/include/dsp/q6adm-v2.h +++ b/include/dsp/q6adm-v2.h @@ -29,6 +29,7 @@ ((MAX_MODULES_IN_TOPO + 1) * 2 * sizeof(uint32_t)) #define AUD_PROC_BLOCK_SIZE 4096 #define AUD_VOL_BLOCK_SIZE 4096 +#define AUD_PROC_PERSIST_BLOCK_SIZE (2 * 1024 * 1020) #define AUDIO_RX_CALIBRATION_SIZE (AUD_PROC_BLOCK_SIZE + \ AUD_VOL_BLOCK_SIZE) enum { @@ -40,6 +41,7 @@ enum { ADM_RTAC_APR_CAL, ADM_SRS_TRUMEDIA, ADM_RTAC_AUDVOL_CAL, + ADM_LSM_AUDPROC_PERSISTENT_CAL, ADM_MAX_CAL_TYPES };