Commit f6fa56e2 authored by Ramesh Babu's avatar Ramesh Babu Committed by Mark Brown

ASoC: Intel: Skylake: Parse and update module config structure

A dsp path and the modules in the path can support various pcm
configurations. The list of supported pcm configurations from topology
manifest would be stored and later selected runtime based on the hw
pcm params. For legacy, module data is filled in the 0th index of
resource and interface table.

To accommodate both models, change the relevant structures and populate
them by parsing newly defined tokens. This change is backward compatible
with the existing model where driver computes the resources required by
each dsp module.
Signed-off-by: default avatarRamesh Babu <ramesh.babu@intel.com>
Signed-off-by: default avatarShreyas NC <shreyas.nc@intel.com>
Signed-off-by: default avatarGuneshwor Singh <guneshwor.o.singh@intel.com>
Acked-By: default avatarVinod Koul <vinod.koul@intel.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent db6ed55d
...@@ -443,9 +443,12 @@ static void skl_set_base_module_format(struct skl_sst *ctx, ...@@ -443,9 +443,12 @@ static void skl_set_base_module_format(struct skl_sst *ctx,
struct skl_module_cfg *mconfig, struct skl_module_cfg *mconfig,
struct skl_base_cfg *base_cfg) struct skl_base_cfg *base_cfg)
{ {
struct skl_module_fmt *format = &mconfig->in_fmt[0]; struct skl_module *module = mconfig->module;
struct skl_module_res *res = &module->resources[mconfig->res_idx];
struct skl_module_iface *fmt = &module->formats[mconfig->fmt_idx];
struct skl_module_fmt *format = &fmt->inputs[0].fmt;
base_cfg->audio_fmt.number_of_channels = (u8)format->channels; base_cfg->audio_fmt.number_of_channels = format->channels;
base_cfg->audio_fmt.s_freq = format->s_freq; base_cfg->audio_fmt.s_freq = format->s_freq;
base_cfg->audio_fmt.bit_depth = format->bit_depth; base_cfg->audio_fmt.bit_depth = format->bit_depth;
...@@ -460,10 +463,10 @@ static void skl_set_base_module_format(struct skl_sst *ctx, ...@@ -460,10 +463,10 @@ static void skl_set_base_module_format(struct skl_sst *ctx,
base_cfg->audio_fmt.interleaving = format->interleaving_style; base_cfg->audio_fmt.interleaving = format->interleaving_style;
base_cfg->cps = mconfig->mcps; base_cfg->cps = res->cps;
base_cfg->ibs = mconfig->ibs; base_cfg->ibs = res->ibs;
base_cfg->obs = mconfig->obs; base_cfg->obs = res->obs;
base_cfg->is_pages = mconfig->mem_pages; base_cfg->is_pages = res->is_pages;
} }
/* /*
...@@ -551,6 +554,9 @@ static void skl_setup_cpr_gateway_cfg(struct skl_sst *ctx, ...@@ -551,6 +554,9 @@ static void skl_setup_cpr_gateway_cfg(struct skl_sst *ctx,
struct skl_cpr_cfg *cpr_mconfig) struct skl_cpr_cfg *cpr_mconfig)
{ {
u32 dma_io_buf; u32 dma_io_buf;
struct skl_module_res *res;
int res_idx = mconfig->res_idx;
struct skl *skl = get_skl_ctx(ctx->dev);
cpr_mconfig->gtw_cfg.node_id = skl_get_node_id(ctx, mconfig); cpr_mconfig->gtw_cfg.node_id = skl_get_node_id(ctx, mconfig);
...@@ -559,19 +565,27 @@ static void skl_setup_cpr_gateway_cfg(struct skl_sst *ctx, ...@@ -559,19 +565,27 @@ static void skl_setup_cpr_gateway_cfg(struct skl_sst *ctx,
return; return;
} }
if (skl->nr_modules) {
res = &mconfig->module->resources[mconfig->res_idx];
cpr_mconfig->gtw_cfg.dma_buffer_size = res->dma_buffer_size;
goto skip_buf_size_calc;
} else {
res = &mconfig->module->resources[res_idx];
}
switch (mconfig->hw_conn_type) { switch (mconfig->hw_conn_type) {
case SKL_CONN_SOURCE: case SKL_CONN_SOURCE:
if (mconfig->dev_type == SKL_DEVICE_HDAHOST) if (mconfig->dev_type == SKL_DEVICE_HDAHOST)
dma_io_buf = mconfig->ibs; dma_io_buf = res->ibs;
else else
dma_io_buf = mconfig->obs; dma_io_buf = res->obs;
break; break;
case SKL_CONN_SINK: case SKL_CONN_SINK:
if (mconfig->dev_type == SKL_DEVICE_HDAHOST) if (mconfig->dev_type == SKL_DEVICE_HDAHOST)
dma_io_buf = mconfig->obs; dma_io_buf = res->obs;
else else
dma_io_buf = mconfig->ibs; dma_io_buf = res->ibs;
break; break;
default: default:
...@@ -586,11 +600,12 @@ static void skl_setup_cpr_gateway_cfg(struct skl_sst *ctx, ...@@ -586,11 +600,12 @@ static void skl_setup_cpr_gateway_cfg(struct skl_sst *ctx,
/* fallback to 2ms default value */ /* fallback to 2ms default value */
if (!cpr_mconfig->gtw_cfg.dma_buffer_size) { if (!cpr_mconfig->gtw_cfg.dma_buffer_size) {
if (mconfig->hw_conn_type == SKL_CONN_SOURCE) if (mconfig->hw_conn_type == SKL_CONN_SOURCE)
cpr_mconfig->gtw_cfg.dma_buffer_size = 2 * mconfig->obs; cpr_mconfig->gtw_cfg.dma_buffer_size = 2 * res->obs;
else else
cpr_mconfig->gtw_cfg.dma_buffer_size = 2 * mconfig->ibs; cpr_mconfig->gtw_cfg.dma_buffer_size = 2 * res->ibs;
} }
skip_buf_size_calc:
cpr_mconfig->cpr_feature_mask = 0; cpr_mconfig->cpr_feature_mask = 0;
cpr_mconfig->gtw_cfg.config_length = 0; cpr_mconfig->gtw_cfg.config_length = 0;
...@@ -638,7 +653,9 @@ static void skl_setup_out_format(struct skl_sst *ctx, ...@@ -638,7 +653,9 @@ static void skl_setup_out_format(struct skl_sst *ctx,
struct skl_module_cfg *mconfig, struct skl_module_cfg *mconfig,
struct skl_audio_data_format *out_fmt) struct skl_audio_data_format *out_fmt)
{ {
struct skl_module_fmt *format = &mconfig->out_fmt[0]; struct skl_module *module = mconfig->module;
struct skl_module_iface *fmt = &module->formats[mconfig->fmt_idx];
struct skl_module_fmt *format = &fmt->outputs[0].fmt;
out_fmt->number_of_channels = (u8)format->channels; out_fmt->number_of_channels = (u8)format->channels;
out_fmt->s_freq = format->s_freq; out_fmt->s_freq = format->s_freq;
...@@ -663,7 +680,9 @@ static void skl_set_src_format(struct skl_sst *ctx, ...@@ -663,7 +680,9 @@ static void skl_set_src_format(struct skl_sst *ctx,
struct skl_module_cfg *mconfig, struct skl_module_cfg *mconfig,
struct skl_src_module_cfg *src_mconfig) struct skl_src_module_cfg *src_mconfig)
{ {
struct skl_module_fmt *fmt = &mconfig->out_fmt[0]; struct skl_module *module = mconfig->module;
struct skl_module_iface *iface = &module->formats[mconfig->fmt_idx];
struct skl_module_fmt *fmt = &iface->outputs[0].fmt;
skl_set_base_module_format(ctx, mconfig, skl_set_base_module_format(ctx, mconfig,
(struct skl_base_cfg *)src_mconfig); (struct skl_base_cfg *)src_mconfig);
...@@ -680,7 +699,9 @@ static void skl_set_updown_mixer_format(struct skl_sst *ctx, ...@@ -680,7 +699,9 @@ static void skl_set_updown_mixer_format(struct skl_sst *ctx,
struct skl_module_cfg *mconfig, struct skl_module_cfg *mconfig,
struct skl_up_down_mixer_cfg *mixer_mconfig) struct skl_up_down_mixer_cfg *mixer_mconfig)
{ {
struct skl_module_fmt *fmt = &mconfig->out_fmt[0]; struct skl_module *module = mconfig->module;
struct skl_module_iface *iface = &module->formats[mconfig->fmt_idx];
struct skl_module_fmt *fmt = &iface->outputs[0].fmt;
int i = 0; int i = 0;
skl_set_base_module_format(ctx, mconfig, skl_set_base_module_format(ctx, mconfig,
...@@ -1013,8 +1034,8 @@ int skl_unbind_modules(struct skl_sst *ctx, ...@@ -1013,8 +1034,8 @@ int skl_unbind_modules(struct skl_sst *ctx,
struct skl_ipc_bind_unbind_msg msg; struct skl_ipc_bind_unbind_msg msg;
struct skl_module_inst_id src_id = src_mcfg->id; struct skl_module_inst_id src_id = src_mcfg->id;
struct skl_module_inst_id dst_id = dst_mcfg->id; struct skl_module_inst_id dst_id = dst_mcfg->id;
int in_max = dst_mcfg->max_in_queue; int in_max = dst_mcfg->module->max_input_pins;
int out_max = src_mcfg->max_out_queue; int out_max = src_mcfg->module->max_output_pins;
int src_index, dst_index, src_pin_state, dst_pin_state; int src_index, dst_index, src_pin_state, dst_pin_state;
skl_dump_bind_info(ctx, src_mcfg, dst_mcfg); skl_dump_bind_info(ctx, src_mcfg, dst_mcfg);
...@@ -1075,8 +1096,8 @@ int skl_bind_modules(struct skl_sst *ctx, ...@@ -1075,8 +1096,8 @@ int skl_bind_modules(struct skl_sst *ctx,
{ {
int ret; int ret;
struct skl_ipc_bind_unbind_msg msg; struct skl_ipc_bind_unbind_msg msg;
int in_max = dst_mcfg->max_in_queue; int in_max = dst_mcfg->module->max_input_pins;
int out_max = src_mcfg->max_out_queue; int out_max = src_mcfg->module->max_output_pins;
int src_index, dst_index; int src_index, dst_index;
skl_dump_bind_info(ctx, src_mcfg, dst_mcfg); skl_dump_bind_info(ctx, src_mcfg, dst_mcfg);
......
...@@ -1233,7 +1233,8 @@ static int skl_get_module_info(struct skl *skl, struct skl_module_cfg *mconfig) ...@@ -1233,7 +1233,8 @@ static int skl_get_module_info(struct skl *skl, struct skl_module_cfg *mconfig)
list_for_each_entry(module, &ctx->uuid_list, list) { list_for_each_entry(module, &ctx->uuid_list, list) {
if (uuid_le_cmp(*uuid_mod, module->uuid) == 0) { if (uuid_le_cmp(*uuid_mod, module->uuid) == 0) {
mconfig->id.module_id = module->id; mconfig->id.module_id = module->id;
mconfig->is_loadable = module->is_loadable; if (mconfig->module)
mconfig->module->loadable = module->is_loadable;
return 0; return 0;
} }
} }
......
This diff is collapsed.
...@@ -273,6 +273,23 @@ struct skl_pipe_params { ...@@ -273,6 +273,23 @@ struct skl_pipe_params {
unsigned int link_bps; unsigned int link_bps;
}; };
struct skl_pipe_fmt {
u32 freq;
u8 channels;
u8 bps;
};
struct skl_pipe_mcfg {
u8 res_idx;
u8 fmt_idx;
};
struct skl_path_config {
u8 mem_pages;
struct skl_pipe_fmt in_fmt;
struct skl_pipe_fmt out_fmt;
};
struct skl_pipe { struct skl_pipe {
u8 ppl_id; u8 ppl_id;
u8 pipe_priority; u8 pipe_priority;
...@@ -281,6 +298,10 @@ struct skl_pipe { ...@@ -281,6 +298,10 @@ struct skl_pipe {
u8 lp_mode; u8 lp_mode;
struct skl_pipe_params *p_params; struct skl_pipe_params *p_params;
enum skl_pipe_state state; enum skl_pipe_state state;
u8 direction;
u8 cur_config_idx;
u8 nr_cfgs;
struct skl_path_config configs[SKL_MAX_PATH_CONFIGS];
struct list_head w_list; struct list_head w_list;
bool passthru; bool passthru;
}; };
...@@ -347,6 +368,9 @@ struct skl_module { ...@@ -347,6 +368,9 @@ struct skl_module {
struct skl_module_cfg { struct skl_module_cfg {
u8 guid[16]; u8 guid[16];
struct skl_module_inst_id id; struct skl_module_inst_id id;
struct skl_module *module;
int res_idx;
int fmt_idx;
u8 domain; u8 domain;
bool homogenous_inputs; bool homogenous_inputs;
bool homogenous_outputs; bool homogenous_outputs;
...@@ -381,6 +405,7 @@ struct skl_module_cfg { ...@@ -381,6 +405,7 @@ struct skl_module_cfg {
enum skl_module_state m_state; enum skl_module_state m_state;
struct skl_pipe *pipe; struct skl_pipe *pipe;
struct skl_specific_cfg formats_config; struct skl_specific_cfg formats_config;
struct skl_pipe_mcfg mod_cfg[SKL_MAX_MODULES_IN_PIPE];
}; };
struct skl_algo_data { struct skl_algo_data {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment