diff --git a/dsp/audio_cal_utils.c b/dsp/audio_cal_utils.c index 7e243e88609b..fab5186ab889 100644 --- a/dsp/audio_cal_utils.c +++ b/dsp/audio_cal_utils.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2014-2019, The Linux Foundation. All rights reserved. + * Copyright (c) 2014-2020, The Linux Foundation. All rights reserved. */ #include #include @@ -57,6 +57,7 @@ size_t get_cal_info_size(int32_t cal_type) case ADM_AUDPROC_CAL_TYPE: case ADM_LSM_AUDPROC_CAL_TYPE: case ADM_LSM_AUDPROC_PERSISTENT_CAL_TYPE: + case ADM_AUDPROC_PERSISTENT_CAL_TYPE: size = sizeof(struct audio_cal_info_audproc); break; case ADM_AUDVOL_CAL_TYPE: @@ -211,6 +212,7 @@ size_t get_user_cal_type_size(int32_t cal_type) case ADM_AUDPROC_CAL_TYPE: case ADM_LSM_AUDPROC_CAL_TYPE: case ADM_LSM_AUDPROC_PERSISTENT_CAL_TYPE: + case ADM_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 9a4a7f914a35..f62f03a07e52 100644 --- a/dsp/q6adm.c +++ b/dsp/q6adm.c @@ -2149,7 +2149,8 @@ static struct cal_block_data *adm_find_cal_by_path(int cal_index, int path) if (cal_index == ADM_AUDPROC_CAL || cal_index == ADM_LSM_AUDPROC_CAL || - cal_index == ADM_LSM_AUDPROC_PERSISTENT_CAL) { + cal_index == ADM_LSM_AUDPROC_PERSISTENT_CAL || + cal_index == ADM_AUDPROC_PERSISTENT_CAL) { audproc_cal_info = cal_block->cal_info; if ((audproc_cal_info->path == path) && (cal_block->cal_data.size > 0)) @@ -2187,7 +2188,8 @@ static struct cal_block_data *adm_find_cal_by_app_type(int cal_index, int path, if (cal_index == ADM_AUDPROC_CAL || cal_index == ADM_LSM_AUDPROC_CAL || - cal_index == ADM_LSM_AUDPROC_PERSISTENT_CAL) { + cal_index == ADM_LSM_AUDPROC_PERSISTENT_CAL || + cal_index == ADM_AUDPROC_PERSISTENT_CAL) { audproc_cal_info = cal_block->cal_info; if ((audproc_cal_info->path == path) && (audproc_cal_info->app_type == app_type) && @@ -2228,7 +2230,8 @@ static struct cal_block_data *adm_find_cal(int cal_index, int path, if (cal_index == ADM_AUDPROC_CAL || cal_index == ADM_LSM_AUDPROC_CAL || - cal_index == ADM_LSM_AUDPROC_PERSISTENT_CAL) { + cal_index == ADM_LSM_AUDPROC_PERSISTENT_CAL|| + cal_index == ADM_AUDPROC_PERSISTENT_CAL) { audproc_cal_info = cal_block->cal_info; if ((audproc_cal_info->path == path) && (audproc_cal_info->app_type == app_type) && @@ -2319,6 +2322,9 @@ static void send_adm_cal(int port_id, int copp_idx, int path, int perf_mode, if (passthr_mode != LISTEN) { send_adm_cal_type(ADM_AUDPROC_CAL, path, port_id, copp_idx, perf_mode, app_type, acdb_id, sample_rate); + send_adm_cal_type(ADM_AUDPROC_PERSISTENT_CAL, path, + port_id, copp_idx, perf_mode, app_type, + acdb_id, sample_rate); } else { send_adm_cal_type(ADM_LSM_AUDPROC_CAL, path, port_id, copp_idx, perf_mode, app_type, acdb_id, sample_rate); @@ -4134,6 +4140,9 @@ static int get_cal_type_index(int32_t cal_type) case ADM_LSM_AUDPROC_PERSISTENT_CAL_TYPE: ret = ADM_LSM_AUDPROC_PERSISTENT_CAL; break; + case ADM_AUDPROC_PERSISTENT_CAL_TYPE: + ret = ADM_AUDPROC_PERSISTENT_CAL; + break; default: pr_err("%s: invalid cal type %d!\n", __func__, cal_type); } @@ -4361,6 +4370,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_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__); @@ -4922,7 +4937,15 @@ 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_AUDVOL_CAL) { + } else if (cal_index == ADM_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", __func__, cal_block->cal_data.size, *size); diff --git a/include/dsp/q6adm-v2.h b/include/dsp/q6adm-v2.h index 9f5fef8cfbd6..efc1d382387a 100644 --- a/include/dsp/q6adm-v2.h +++ b/include/dsp/q6adm-v2.h @@ -35,6 +35,7 @@ enum { ADM_SRS_TRUMEDIA, ADM_RTAC_AUDVOL_CAL, ADM_LSM_AUDPROC_PERSISTENT_CAL, + ADM_AUDPROC_PERSISTENT_CAL, ADM_MAX_CAL_TYPES };