ASoC: Intel: Skylake: Make MCPS and CPS params obsolete
authorCezary Rojewski <cezary.rojewski@intel.com>
Tue, 23 Jul 2019 14:58:53 +0000 (16:58 +0200)
committerMark Brown <broonie@kernel.org>
Wed, 24 Jul 2019 18:43:03 +0000 (19:43 +0100)
As per FW Interface Modules Configuration, init instance IPC request
requires base initial module configuration. This configuration structure
is made of:
- cpc (chunks per cycle)
- ibs (input buffer size)
- obs (output buffer size)
- is_pages (memory pages required)
- audio_fmt (self explanatory)

Skylake topology accepts following tokens: MCPS, CPS and CPC. All of
these are directly connected. Moreover, assigning one of these allows
to calculate the remaining two. In simplest scenario and assuming 1ms
scheduling, following is true:

CPS = CPC times 1000
MCPS = CPS times 1000 000
Note: these calculations vary depending on scenario and scheduling
requirements.

Given the current implementation, userspace is allowed to provide
different values for all three causing informational chaos. On top of
that, struct skl_base_cfg which represents base module configuration,
incorrectly takes CPS param instead of CPC.

This ambiguity may lead to user unintentionally providing improper
values to DSP firmware and thus impacting module scheduling in
unexpected fashion. Fix by making MCPS and CPS topology params obsolete
and relying solely on CPC value.

Signed-off-by: Cezary Rojewski <cezary.rojewski@intel.com>
Link: https://lore.kernel.org/r/20190723145854.8527-7-cezary.rojewski@intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/intel/skylake/skl-debug.c
sound/soc/intel/skylake/skl-messages.c
sound/soc/intel/skylake/skl-topology.c
sound/soc/intel/skylake/skl-topology.h

index c43aa4081232d2817ed3d3359c26cb1fe55848c4..fb232428109f89cdaf788de94c4d61503cf77fa6 100644 (file)
@@ -66,6 +66,8 @@ static ssize_t module_read(struct file *file, char __user *user_buf,
                           size_t count, loff_t *ppos)
 {
        struct skl_module_cfg *mconfig = file->private_data;
+       struct skl_module *module = mconfig->module;
+       struct skl_module_res *res = &module->resources[mconfig->res_idx];
        char *buf;
        ssize_t ret;
 
@@ -79,8 +81,8 @@ static ssize_t module_read(struct file *file, char __user *user_buf,
                        mconfig->id.pvt_id);
 
        ret += snprintf(buf + ret, MOD_BUF - ret,
-                       "Resources:\n\tMCPS %#x\n\tIBS %#x\n\tOBS %#x\t\n",
-                       mconfig->mcps, mconfig->ibs, mconfig->obs);
+                       "Resources:\n\tCPC %#x\n\tIBS %#x\n\tOBS %#x\t\n",
+                       res->cpc, res->ibs, res->obs);
 
        ret += snprintf(buf + ret, MOD_BUF - ret,
                        "Module data:\n\tCore %d\n\tIn queue %d\n\t"
index 07762543fb139090a781a212ba58afde57ecce5a..e8cc710f092bf455ca164a02323b6af5c5c8a52e 100644 (file)
@@ -477,7 +477,7 @@ static void skl_set_base_module_format(struct skl_dev *skl,
 
        base_cfg->audio_fmt.interleaving = format->interleaving_style;
 
-       base_cfg->cps = res->cps;
+       base_cfg->cpc = res->cpc;
        base_cfg->ibs = res->ibs;
        base_cfg->obs = res->obs;
        base_cfg->is_pages = res->is_pages;
index 53a024c0464d1042866479c902db8f29e8696b25..118866cd5075422279298fc776e7792ab7dc6781 100644 (file)
@@ -2205,10 +2205,6 @@ static int skl_tplg_fill_res_tkn(struct device *dev,
                return -EINVAL;
 
        switch (tkn_elem->token) {
-       case SKL_TKN_MM_U32_CPS:
-               res->cps = tkn_elem->value;
-               break;
-
        case SKL_TKN_MM_U32_DMA_SIZE:
                res->dma_buffer_size = tkn_elem->value;
                break;
@@ -2229,10 +2225,6 @@ static int skl_tplg_fill_res_tkn(struct device *dev,
                res->ibs = tkn_elem->value;
                break;
 
-       case SKL_TKN_U32_MAX_MCPS:
-               res->cps = tkn_elem->value;
-               break;
-
        case SKL_TKN_MM_U32_RES_PIN_ID:
        case SKL_TKN_MM_U32_PIN_BUF:
                ret = skl_tplg_manifest_pin_res_tkn(dev, tkn_elem, res,
@@ -2241,6 +2233,11 @@ static int skl_tplg_fill_res_tkn(struct device *dev,
                        return ret;
                break;
 
+       case SKL_TKN_MM_U32_CPS:
+       case SKL_TKN_U32_MAX_MCPS:
+               /* ignore unused tokens */
+               break;
+
        default:
                dev_err(dev, "Not a res type token: %d", tkn_elem->token);
                return -EINVAL;
@@ -2693,7 +2690,7 @@ static int skl_tplg_get_pvt_data_v4(struct snd_soc_tplg_dapm_widget *tplg_w,
                return ret;
        mconfig->id.module_id = -1;
        mconfig->id.instance_id = dfw->instance_id;
-       mconfig->module->resources[0].cps = dfw->max_mcps;
+       mconfig->module->resources[0].cpc = dfw->max_mcps / 1000;
        mconfig->module->resources[0].ibs = dfw->ibs;
        mconfig->module->resources[0].obs = dfw->obs;
        mconfig->core_id = dfw->core_id;
index e2a2fc5c5545c93d392a6b015f024f0d518e2460..99a0277191cacaab1fa07be7ba5a1eddf78a8e04 100644 (file)
@@ -101,7 +101,7 @@ struct skl_audio_data_format {
 } __packed;
 
 struct skl_base_cfg {
-       u32 cps;
+       u32 cpc;
        u32 ibs;
        u32 obs;
        u32 is_pages;
@@ -343,7 +343,6 @@ struct skl_module_pin_resources {
 struct skl_module_res {
        u8 id;
        u32 is_pages;
-       u32 cps;
        u32 ibs;
        u32 obs;
        u32 dma_buffer_size;
@@ -384,7 +383,6 @@ struct skl_module_cfg {
        u8 out_queue_mask;
        u8 in_queue;
        u8 out_queue;
-       u32 mcps;
        u32 ibs;
        u32 obs;
        u8 is_loadable;