Commit 67866ff9 authored by Mark Brown's avatar Mark Brown

Merge series "ASoC topology header parsing refinement" from Keyon Jie <yang.jie@linux.intel.com>:

This small series is to optimize the header logging during the topology
parsing. This is verified work fine on both SOF and SST drivers.

Change History:
v3:
- Remove using the separated soc_pass_load() function and merge it to the
  soc_tplg_load_header() body.
- Add more Tested-by tags.

v2:
- Change the internal used array to be 'static' to fix the issue
  reported by: kbuild test robot <lkp@intel.com>
- Add testing coverage including Intel SST driver also.

v1:
- Initial version.

Keyon Jie (2):
  ASoC: topology: refine and log the header in the correct pass
  ASoC: topology: remove the redundant pass checks

 sound/soc/soc-topology.c | 96 ++++++++++++++++------------------------
 1 file changed, 38 insertions(+), 58 deletions(-)

--
2.25.1
parents 36124fb1 c2cbd0a7
...@@ -246,7 +246,7 @@ static inline void soc_control_err(struct soc_tplg *tplg, ...@@ -246,7 +246,7 @@ static inline void soc_control_err(struct soc_tplg *tplg,
} }
/* pass vendor data to component driver for processing */ /* pass vendor data to component driver for processing */
static int soc_tplg_vendor_load_(struct soc_tplg *tplg, static int soc_tplg_vendor_load(struct soc_tplg *tplg,
struct snd_soc_tplg_hdr *hdr) struct snd_soc_tplg_hdr *hdr)
{ {
int ret = 0; int ret = 0;
...@@ -268,16 +268,6 @@ static int soc_tplg_vendor_load_(struct soc_tplg *tplg, ...@@ -268,16 +268,6 @@ static int soc_tplg_vendor_load_(struct soc_tplg *tplg,
return ret; return ret;
} }
/* pass vendor data to component driver for processing */
static int soc_tplg_vendor_load(struct soc_tplg *tplg,
struct snd_soc_tplg_hdr *hdr)
{
if (tplg->pass != SOC_TPLG_PASS_VENDOR)
return 0;
return soc_tplg_vendor_load_(tplg, hdr);
}
/* optionally pass new dynamic widget to component driver. This is mainly for /* optionally pass new dynamic widget to component driver. This is mainly for
* external widgets where we can assign private data/ops */ * external widgets where we can assign private data/ops */
static int soc_tplg_widget_load(struct soc_tplg *tplg, static int soc_tplg_widget_load(struct soc_tplg *tplg,
...@@ -1127,12 +1117,6 @@ static int soc_tplg_kcontrol_elems_load(struct soc_tplg *tplg, ...@@ -1127,12 +1117,6 @@ static int soc_tplg_kcontrol_elems_load(struct soc_tplg *tplg,
int ret; int ret;
int i; int i;
if (tplg->pass != SOC_TPLG_PASS_MIXER) {
tplg->pos += le32_to_cpu(hdr->size) +
le32_to_cpu(hdr->payload_size);
return 0;
}
dev_dbg(tplg->dev, "ASoC: adding %d kcontrols at 0x%lx\n", hdr->count, dev_dbg(tplg->dev, "ASoC: adding %d kcontrols at 0x%lx\n", hdr->count,
soc_tplg_get_offset(tplg)); soc_tplg_get_offset(tplg));
...@@ -1204,14 +1188,6 @@ static int soc_tplg_dapm_graph_elems_load(struct soc_tplg *tplg, ...@@ -1204,14 +1188,6 @@ static int soc_tplg_dapm_graph_elems_load(struct soc_tplg *tplg,
count = le32_to_cpu(hdr->count); count = le32_to_cpu(hdr->count);
if (tplg->pass != SOC_TPLG_PASS_GRAPH) {
tplg->pos +=
le32_to_cpu(hdr->size) +
le32_to_cpu(hdr->payload_size);
return 0;
}
if (soc_tplg_check_elem_count(tplg, if (soc_tplg_check_elem_count(tplg,
sizeof(struct snd_soc_tplg_dapm_graph_elem), sizeof(struct snd_soc_tplg_dapm_graph_elem),
count, le32_to_cpu(hdr->payload_size), "graph")) { count, le32_to_cpu(hdr->payload_size), "graph")) {
...@@ -1741,9 +1717,6 @@ static int soc_tplg_dapm_widget_elems_load(struct soc_tplg *tplg, ...@@ -1741,9 +1717,6 @@ static int soc_tplg_dapm_widget_elems_load(struct soc_tplg *tplg,
count = le32_to_cpu(hdr->count); count = le32_to_cpu(hdr->count);
if (tplg->pass != SOC_TPLG_PASS_WIDGET)
return 0;
dev_dbg(tplg->dev, "ASoC: adding %d DAPM widgets\n", count); dev_dbg(tplg->dev, "ASoC: adding %d DAPM widgets\n", count);
for (i = 0; i < count; i++) { for (i = 0; i < count; i++) {
...@@ -2101,9 +2074,6 @@ static int soc_tplg_pcm_elems_load(struct soc_tplg *tplg, ...@@ -2101,9 +2074,6 @@ static int soc_tplg_pcm_elems_load(struct soc_tplg *tplg,
count = le32_to_cpu(hdr->count); count = le32_to_cpu(hdr->count);
if (tplg->pass != SOC_TPLG_PASS_PCM_DAI)
return 0;
/* check the element size and count */ /* check the element size and count */
pcm = (struct snd_soc_tplg_pcm *)tplg->pos; pcm = (struct snd_soc_tplg_pcm *)tplg->pos;
size = le32_to_cpu(pcm->size); size = le32_to_cpu(pcm->size);
...@@ -2386,12 +2356,6 @@ static int soc_tplg_link_elems_load(struct soc_tplg *tplg, ...@@ -2386,12 +2356,6 @@ static int soc_tplg_link_elems_load(struct soc_tplg *tplg,
count = le32_to_cpu(hdr->count); count = le32_to_cpu(hdr->count);
if (tplg->pass != SOC_TPLG_PASS_LINK) {
tplg->pos += le32_to_cpu(hdr->size) +
le32_to_cpu(hdr->payload_size);
return 0;
}
/* check the element size and count */ /* check the element size and count */
link = (struct snd_soc_tplg_link_config *)tplg->pos; link = (struct snd_soc_tplg_link_config *)tplg->pos;
size = le32_to_cpu(link->size); size = le32_to_cpu(link->size);
...@@ -2528,9 +2492,6 @@ static int soc_tplg_dai_elems_load(struct soc_tplg *tplg, ...@@ -2528,9 +2492,6 @@ static int soc_tplg_dai_elems_load(struct soc_tplg *tplg,
count = le32_to_cpu(hdr->count); count = le32_to_cpu(hdr->count);
if (tplg->pass != SOC_TPLG_PASS_BE_DAI)
return 0;
/* config the existing BE DAIs */ /* config the existing BE DAIs */
for (i = 0; i < count; i++) { for (i = 0; i < count; i++) {
dai = (struct snd_soc_tplg_dai *)tplg->pos; dai = (struct snd_soc_tplg_dai *)tplg->pos;
...@@ -2610,9 +2571,6 @@ static int soc_tplg_manifest_load(struct soc_tplg *tplg, ...@@ -2610,9 +2571,6 @@ static int soc_tplg_manifest_load(struct soc_tplg *tplg,
bool abi_match; bool abi_match;
int ret = 0; int ret = 0;
if (tplg->pass != SOC_TPLG_PASS_MANIFEST)
return 0;
manifest = (struct snd_soc_tplg_manifest *)tplg->pos; manifest = (struct snd_soc_tplg_manifest *)tplg->pos;
/* check ABI version by size, create a new manifest if abi not match */ /* check ABI version by size, create a new manifest if abi not match */
...@@ -2685,12 +2643,6 @@ static int soc_valid_header(struct soc_tplg *tplg, ...@@ -2685,12 +2643,6 @@ static int soc_valid_header(struct soc_tplg *tplg,
return -EINVAL; return -EINVAL;
} }
if (tplg->pass == le32_to_cpu(hdr->type))
dev_dbg(tplg->dev,
"ASoC: Got 0x%x bytes of type %d version %d vendor %d at pass %d\n",
hdr->payload_size, hdr->type, hdr->version,
hdr->vendor_type, tplg->pass);
return 1; return 1;
} }
...@@ -2698,6 +2650,10 @@ static int soc_valid_header(struct soc_tplg *tplg, ...@@ -2698,6 +2650,10 @@ static int soc_valid_header(struct soc_tplg *tplg,
static int soc_tplg_load_header(struct soc_tplg *tplg, static int soc_tplg_load_header(struct soc_tplg *tplg,
struct snd_soc_tplg_hdr *hdr) struct snd_soc_tplg_hdr *hdr)
{ {
int (*elem_load)(struct soc_tplg *tplg,
struct snd_soc_tplg_hdr *hdr);
unsigned int hdr_pass;
tplg->pos = tplg->hdr_pos + sizeof(struct snd_soc_tplg_hdr); tplg->pos = tplg->hdr_pos + sizeof(struct snd_soc_tplg_hdr);
/* check for matching ID */ /* check for matching ID */
...@@ -2711,24 +2667,48 @@ static int soc_tplg_load_header(struct soc_tplg *tplg, ...@@ -2711,24 +2667,48 @@ static int soc_tplg_load_header(struct soc_tplg *tplg,
case SND_SOC_TPLG_TYPE_MIXER: case SND_SOC_TPLG_TYPE_MIXER:
case SND_SOC_TPLG_TYPE_ENUM: case SND_SOC_TPLG_TYPE_ENUM:
case SND_SOC_TPLG_TYPE_BYTES: case SND_SOC_TPLG_TYPE_BYTES:
return soc_tplg_kcontrol_elems_load(tplg, hdr); hdr_pass = SOC_TPLG_PASS_MIXER;
elem_load = soc_tplg_kcontrol_elems_load;
break;
case SND_SOC_TPLG_TYPE_DAPM_GRAPH: case SND_SOC_TPLG_TYPE_DAPM_GRAPH:
return soc_tplg_dapm_graph_elems_load(tplg, hdr); hdr_pass = SOC_TPLG_PASS_GRAPH;
elem_load = soc_tplg_dapm_graph_elems_load;
break;
case SND_SOC_TPLG_TYPE_DAPM_WIDGET: case SND_SOC_TPLG_TYPE_DAPM_WIDGET:
return soc_tplg_dapm_widget_elems_load(tplg, hdr); hdr_pass = SOC_TPLG_PASS_WIDGET;
elem_load = soc_tplg_dapm_widget_elems_load;
break;
case SND_SOC_TPLG_TYPE_PCM: case SND_SOC_TPLG_TYPE_PCM:
return soc_tplg_pcm_elems_load(tplg, hdr); hdr_pass = SOC_TPLG_PASS_PCM_DAI;
elem_load = soc_tplg_pcm_elems_load;
break;
case SND_SOC_TPLG_TYPE_DAI: case SND_SOC_TPLG_TYPE_DAI:
return soc_tplg_dai_elems_load(tplg, hdr); hdr_pass = SOC_TPLG_PASS_BE_DAI;
elem_load = soc_tplg_dai_elems_load;
break;
case SND_SOC_TPLG_TYPE_DAI_LINK: case SND_SOC_TPLG_TYPE_DAI_LINK:
case SND_SOC_TPLG_TYPE_BACKEND_LINK: case SND_SOC_TPLG_TYPE_BACKEND_LINK:
/* physical link configurations */ /* physical link configurations */
return soc_tplg_link_elems_load(tplg, hdr); hdr_pass = SOC_TPLG_PASS_LINK;
elem_load = soc_tplg_link_elems_load;
break;
case SND_SOC_TPLG_TYPE_MANIFEST: case SND_SOC_TPLG_TYPE_MANIFEST:
return soc_tplg_manifest_load(tplg, hdr); hdr_pass = SOC_TPLG_PASS_MANIFEST;
elem_load = soc_tplg_manifest_load;
break;
default: default:
/* bespoke vendor data object */ /* bespoke vendor data object */
return soc_tplg_vendor_load(tplg, hdr); hdr_pass = SOC_TPLG_PASS_VENDOR;
elem_load = soc_tplg_vendor_load;
break;
}
if (tplg->pass == hdr_pass) {
dev_dbg(tplg->dev,
"ASoC: Got 0x%x bytes of type %d version %d vendor %d at pass %d\n",
hdr->payload_size, hdr->type, hdr->version,
hdr->vendor_type, tplg->pass);
return elem_load(tplg, hdr);
} }
return 0; return 0;
......
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