From 34a11c755a9218d0bb8de93ea1dc1d294b68a88b Mon Sep 17 00:00:00 2001 From: Ramlal Karra Date: Mon, 13 Apr 2020 13:47:07 +0530 Subject: [PATCH] dsp: q6adm: add ADM_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: I2d1fb219a3748d0ead5ca2199da2b55669f2550e Signed-off-by: Ramlal Karra --- dsp/audio_cal_utils.c | 4 +++- dsp/q6adm.c | 31 +++++++++++++++++++++++++++---- include/dsp/q6adm-v2.h | 1 + 3 files changed, 31 insertions(+), 5 deletions(-) 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 };