From 09f30ee1a0ace077f181b966ede1a960403b9755 Mon Sep 17 00:00:00 2001 From: Krishna Kishor Jha Date: Thu, 11 Aug 2022 13:03:46 +0530 Subject: [PATCH] audio-kernel: Do SRC with MFC 1) Doing SRC with MFC when FE and BE SampleRates are different. MFC module is expected to add as fist module in COPP and output SR of MFC is configured same as app_type SR. 2) Adding MFC module V2 version details to system. Change-Id: I7c03fa28ec32892645ead9baf59eb927ca3e4891 --- asoc/msm-pcm-routing-auto.c | 31 ++++++++++++++++++++----------- include/dsp/apr_audio-v2.h | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 11 deletions(-) mode change 100644 => 100755 asoc/msm-pcm-routing-auto.c mode change 100644 => 100755 include/dsp/apr_audio-v2.h diff --git a/asoc/msm-pcm-routing-auto.c b/asoc/msm-pcm-routing-auto.c old mode 100644 new mode 100755 index cb220eeab6d8..5819804020bd --- a/asoc/msm-pcm-routing-auto.c +++ b/asoc/msm-pcm-routing-auto.c @@ -2475,14 +2475,20 @@ int msm_pcm_routing_reg_phy_stream(int fedai_id, int perf_mode, bits_per_sample = msm_routing_get_bit_width( msm_bedais[i].format); + topology = msm_routing_get_adm_topology(fedai_id, + session_type, + i); app_type = fe_dai_app_type_cfg[fedai_id][session_type][i].app_type; if (app_type) { app_type_idx = msm_pcm_routing_get_app_type_idx(app_type); - sample_rate = - fe_dai_app_type_cfg[fedai_id][session_type][i] - .sample_rate; + if ((fe_dai_app_type_cfg[fedai_id][session_type][i].sample_rate != msm_bedais[i].sample_rate) && + (topology == AUDIO_COPP_MFC)) { + pr_debug("%s: FE and BE SR is not equal", __func__); + sample_rate = msm_bedais[i].sample_rate; + } else + sample_rate = fe_dai_app_type_cfg[fedai_id][session_type][i].sample_rate; bits_per_sample = (fe_dai_app_type_cfg[fedai_id][session_type][i].bit_width) ? fe_dai_app_type_cfg[fedai_id][session_type][i].bit_width : @@ -2496,9 +2502,7 @@ int msm_pcm_routing_reg_phy_stream(int fedai_id, int perf_mode, acdb_dev_id = fe_dai_app_type_cfg[fedai_id][session_type][i] .acdb_dev_id; - topology = msm_routing_get_adm_topology(fedai_id, - session_type, - i); + be_bit_width = msm_routing_get_bit_width( msm_bedais[i].format); copp_perf_mode = get_copp_perf_mode(fedai_id, session_type, i); @@ -2563,11 +2567,16 @@ int msm_pcm_routing_reg_phy_stream(int fedai_id, int perf_mode, &session_copp_map[fedai_id][session_type][i]); if (msm_is_resample_needed( - sample_rate, - msm_bedais[i].sample_rate)) - adm_copp_mfc_cfg(port_id, copp_idx, - msm_bedais[i].sample_rate); - + fe_dai_app_type_cfg[fedai_id][session_type][i].sample_rate, + msm_bedais[i].sample_rate)) { + if ((session_type == SESSION_TYPE_TX) && (topology == AUDIO_COPP_MFC)) { + adm_copp_mfc_cfg(port_id, copp_idx, + fe_dai_app_type_cfg[fedai_id][session_type][i].sample_rate); + } else { + adm_copp_mfc_cfg(port_id, copp_idx, + msm_bedais[i].sample_rate); + } + } for (j = 0; j < MAX_COPPS_PER_PORT; j++) { unsigned long copp = session_copp_map[fedai_id][session_type][i]; diff --git a/include/dsp/apr_audio-v2.h b/include/dsp/apr_audio-v2.h old mode 100644 new mode 100755 index f37ce1c96371..b6bdfeaa2aa5 --- a/include/dsp/apr_audio-v2.h +++ b/include/dsp/apr_audio-v2.h @@ -846,6 +846,10 @@ struct audproc_softvolume_params { */ #define AUDPROC_PARAM_ID_MFC_OUTPUT_MEDIA_FORMAT 0x00010913 +/* ID of the Output Media Format V2 parameters used by AUDPROC_MODULE_ID_MFC. + */ +#define AUDPROC_PARAM_ID_MFC_OUTPUT_MEDIA_FORMAT_V2 0x00010942 + /* Param ID of Channel Mixer used by AUDPROC_MODULE_ID_MFC */ #define AUDPROC_CHMIXER_PARAM_ID_COEFF 0x00010342 @@ -881,6 +885,33 @@ struct adm_cmd_set_pp_params_v5 { */ } __packed; +/* Payload of the AUDPROC_PARAM_ID_MFC_OUTPUT_MEDIA_FORMAT_V2 parameter in the + Media Format Converter Module. Following this will be the variable payload for channel_map. + */ +struct audproc_mfc_output_media_fmt_v2_t +{ + uint32_t sampling_rate; + /**< @h2xmle_description {Sampling rate in samples per second.} + @h2xmle_range {0..384000} */ + + uint16_t bits_per_sample; + /**< @h2xmle_description {Number of bits used to store each sample.} + @h2xmle_rangeList {"16 bits per sample (Q15 format)"= 16;"24 bits per sample (Q27 format)"=24;"32 bits per sample (Q31 format)"=32 + @h2xmle_default {16} + */ + + uint16_t num_channels; + /**< @h2xmle_description {Number of channels.} + @h2xmle_default {1} + @h2xmle_range {1..32} */ + + uint16_t channel_type[0]; + /**< @h2xmle_description {Channel mapping array. Specify a channel mapping for each output channel.If the number of channels is not a multiple of four, zero padding must be added to the channel type array to align the packet to a multiple of 32 bits.} + @h2xmle_variableArraySize {num_channels} + @h2xmle_range {1..63} + @h2xmle_default {1}*/ +} __packed; + /* Maximum number of channels supported by MFC media fmt params */ #define AUDPROC_MFC_OUT_CHANNELS_MAX 8 @@ -5716,6 +5747,7 @@ struct afe_param_id_lpass_core_shared_clk_cfg { #define NULL_POPP_TOPOLOGY 0x00010C68 #define NULL_COPP_TOPOLOGY 0x00010312 +#define AUDIO_COPP_MFC 0x10000098 #define DEFAULT_COPP_TOPOLOGY 0x00010314 #define DEFAULT_POPP_TOPOLOGY 0x00010BE4 #define COMPRESSED_PASSTHROUGH_DEFAULT_TOPOLOGY 0x0001076B