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 <rkarra@codeaurora.org>
This commit is contained in:
Ramlal Karra
2020-04-13 13:47:07 +05:30
committad av Gerrit - the friendly Code Review server
förälder 74a0ee0121
incheckning 34a11c755a
3 ändrade filer med 31 tillägg och 5 borttagningar

Visa fil

@@ -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 <linux/slab.h>
#include <linux/fs.h>
@@ -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:

Visa fil

@@ -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);

Visa fil

@@ -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
};