All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 1/3] ASoC: topology: Improve backwards compatibility with v4 topology files
@ 2018-05-24 19:49 ` Guenter Roeck
  0 siblings, 0 replies; 26+ messages in thread
From: Guenter Roeck @ 2018-05-24 19:49 UTC (permalink / raw)
  To: Takashi Iwai, Mark Brown, Liam Girdwood
  Cc: Jaroslav Kysela, Chintan Patel, alsa-devel, linux-kernel,
	Pierre-Louis Bossart, Guenter Roeck

From: Guenter Roeck <groeck@chromium.org>

Commit dc31e741db49 ("ASoC: topology: ABI - Add the types for BE
DAI") introduced sound topology files version 5. Initially, this
change made the topology code incompatible with v4 topology files.
Backwards compatibility with v4 configuration files was
subsequently added with commit 288b8da7e992 ("ASoC: topology:
Support topology file of ABI v4").

Unfortunately, backwards compatibility was never fully implemented.

First, the manifest size in (Skylake) v4 configuration files is set
to 0, which causes manifest_new_ver() to bail out with error messages
similar to the following.

snd_soc_skl 0000:00:1f.3: ASoC: invalid manifest size
snd_soc_skl 0000:00:1f.3: tplg component load failed-22
snd_soc_skl 0000:00:1f.3: Failed to init topology!
snd_soc_skl 0000:00:1f.3: ASoC: failed to probe component -22
skl_n88l25_m98357a skl_n88l25_m98357a: ASoC: failed to instantiate card -22
skl_n88l25_m98357a: probe of skl_n88l25_m98357a failed with error -22

After this problem is fixed, the following error message is seen instead.

snd_soc_skl 0000:00:1f.3: ASoC: old version of manifest
snd_soc_skl 0000:00:1f.3: Invalid descriptor token 1093938482
snd_soc_skl 0000:00:1f.3: ASoC: failed to load widget media0_in cpr 0
snd_soc_skl 0000:00:1f.3: tPlg component load failed-22

This message is seen because backwards compatibility for loading widgets
was never implemented.

The lack of audio support when running the upstream kernel on recent
Chromebooks has been reported in various forums, and can be traced back
to this problem. Attempts to fix the problem, usually by providing v5
configuration files, were only partially successful.

Let's implement backward compatibility properly to solve the problem
for good.

Signed-off-by: Guenter Roeck <groeck@chromium.org>
---
Tested on Caroline (Samsung Chromebook Pro) and Chell (HP Chromebook 13
G1) running v4.17-rc6 plus this patch, with original (v4) configuration
files. Also tested on several other Chromebooks with this patch on top
of chromeos-4.14.

v2:
- Move on from RFC/RFT to real patch
- Move v4 structure definitions into header file
- Add support for copying private capabilities
- Declare skl_dfw_v4_module_caps as __packed
- Drop duplicate assignment of mconfig->pipe->state

 sound/soc/intel/skylake/skl-topology.c       | 169 +++++++++++++++++++
 sound/soc/intel/skylake/skl-tplg-interface.h |  74 ++++++++
 sound/soc/soc-topology.c                     |   7 +-
 3 files changed, 248 insertions(+), 2 deletions(-)

diff --git a/sound/soc/intel/skylake/skl-topology.c b/sound/soc/intel/skylake/skl-topology.c
index 3b1dca419883..9e4c2cb88dea 100644
--- a/sound/soc/intel/skylake/skl-topology.c
+++ b/sound/soc/intel/skylake/skl-topology.c
@@ -19,6 +19,7 @@
 #include <linux/slab.h>
 #include <linux/types.h>
 #include <linux/firmware.h>
+#include <linux/uuid.h>
 #include <sound/soc.h>
 #include <sound/soc-topology.h>
 #include <uapi/sound/snd_sst_tokens.h>
@@ -2724,6 +2725,167 @@ static int skl_tplg_get_desc_blocks(struct device *dev,
 	return -EINVAL;
 }
 
+/* Functions to parse private data from configuration file format v4 */
+
+/*
+ * Add pipeline from topology binary into driver pipeline list
+ *
+ * If already added we return that instance
+ * Otherwise we create a new instance and add into driver list
+ */
+static int skl_tplg_add_pipe_v4(struct device *dev,
+				struct skl_module_cfg *mconfig, struct skl *skl,
+				struct skl_dfw_v4_pipe *dfw_pipe)
+{
+	struct skl_pipeline *ppl;
+	struct skl_pipe *pipe;
+	struct skl_pipe_params *params;
+
+	list_for_each_entry(ppl, &skl->ppl_list, node) {
+		if (ppl->pipe->ppl_id == dfw_pipe->pipe_id) {
+			mconfig->pipe = ppl->pipe;
+			return 0;
+		}
+	}
+
+	ppl = devm_kzalloc(dev, sizeof(*ppl), GFP_KERNEL);
+	if (!ppl)
+		return -ENOMEM;
+
+	pipe = devm_kzalloc(dev, sizeof(*pipe), GFP_KERNEL);
+	if (!pipe)
+		return -ENOMEM;
+
+	params = devm_kzalloc(dev, sizeof(*params), GFP_KERNEL);
+	if (!params)
+		return -ENOMEM;
+
+	pipe->ppl_id = dfw_pipe->pipe_id;
+	pipe->memory_pages = dfw_pipe->memory_pages;
+	pipe->pipe_priority = dfw_pipe->pipe_priority;
+	pipe->conn_type = dfw_pipe->conn_type;
+	pipe->state = SKL_PIPE_INVALID;
+	pipe->p_params = params;
+	INIT_LIST_HEAD(&pipe->w_list);
+
+	ppl->pipe = pipe;
+	list_add(&ppl->node, &skl->ppl_list);
+
+	mconfig->pipe = pipe;
+
+	return 0;
+}
+
+static void skl_fill_module_pin_info_v4(struct skl_dfw_v4_module_pin *dfw_pin,
+					struct skl_module_pin *m_pin,
+					bool is_dynamic, int max_pin)
+{
+	int i;
+
+	for (i = 0; i < max_pin; i++) {
+		m_pin[i].id.module_id = dfw_pin[i].module_id;
+		m_pin[i].id.instance_id = dfw_pin[i].instance_id;
+		m_pin[i].in_use = false;
+		m_pin[i].is_dynamic = is_dynamic;
+		m_pin[i].pin_state = SKL_PIN_UNBIND;
+	}
+}
+
+static void skl_tplg_fill_fmt_v4(struct skl_module_pin_fmt *dst_fmt,
+				 struct skl_dfw_v4_module_fmt *src_fmt,
+				 int pins)
+{
+	int i;
+
+	for (i = 0; i < pins; i++) {
+		dst_fmt[i].fmt.channels  = src_fmt[i].channels;
+		dst_fmt[i].fmt.s_freq = src_fmt[i].freq;
+		dst_fmt[i].fmt.bit_depth = src_fmt[i].bit_depth;
+		dst_fmt[i].fmt.valid_bit_depth = src_fmt[i].valid_bit_depth;
+		dst_fmt[i].fmt.ch_cfg = src_fmt[i].ch_cfg;
+		dst_fmt[i].fmt.ch_map = src_fmt[i].ch_map;
+		dst_fmt[i].fmt.interleaving_style =
+						src_fmt[i].interleaving_style;
+		dst_fmt[i].fmt.sample_type = src_fmt[i].sample_type;
+	}
+}
+
+static int skl_tplg_get_pvt_data_v4(struct snd_soc_tplg_dapm_widget *tplg_w,
+				    struct skl *skl, struct device *dev,
+				    struct skl_module_cfg *mconfig)
+{
+	struct skl_dfw_v4_module *dfw =
+				(struct skl_dfw_v4_module *)tplg_w->priv.data;
+	int ret;
+
+	dev_dbg(dev, "Parsing Skylake v4 widget topology data\n");
+
+	ret = guid_parse(dfw->uuid, (guid_t *)mconfig->guid);
+	if (ret)
+		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].ibs = dfw->ibs;
+	mconfig->module->resources[0].obs = dfw->obs;
+	mconfig->core_id = dfw->core_id;
+	mconfig->module->max_input_pins = dfw->max_in_queue;
+	mconfig->module->max_output_pins = dfw->max_out_queue;
+	mconfig->module->loadable = dfw->is_loadable;
+	skl_tplg_fill_fmt_v4(mconfig->module->formats[0].inputs, dfw->in_fmt,
+			     MAX_IN_QUEUE);
+	skl_tplg_fill_fmt_v4(mconfig->module->formats[0].outputs, dfw->out_fmt,
+			     MAX_OUT_QUEUE);
+
+	mconfig->params_fixup = dfw->params_fixup;
+	mconfig->converter = dfw->converter;
+	mconfig->m_type = dfw->module_type;
+	mconfig->vbus_id = dfw->vbus_id;
+	mconfig->module->resources[0].is_pages = dfw->mem_pages;
+
+	ret = skl_tplg_add_pipe_v4(dev, mconfig, skl, &dfw->pipe);
+	if (ret)
+		return ret;
+
+	mconfig->dev_type = dfw->dev_type;
+	mconfig->hw_conn_type = dfw->hw_conn_type;
+	mconfig->time_slot = dfw->time_slot;
+	mconfig->formats_config.caps_size = dfw->caps.caps_size;
+
+	mconfig->m_in_pin = devm_kzalloc(dev,
+				MAX_IN_QUEUE * sizeof(*mconfig->m_in_pin),
+				GFP_KERNEL);
+	if (!mconfig->m_in_pin)
+		return -ENOMEM;
+
+	mconfig->m_out_pin = devm_kzalloc(dev,
+				MAX_OUT_QUEUE * sizeof(*mconfig->m_out_pin),
+				GFP_KERNEL);
+	if (!mconfig->m_out_pin)
+		return -ENOMEM;
+
+	skl_fill_module_pin_info_v4(dfw->in_pin, mconfig->m_in_pin,
+				    dfw->is_dynamic_in_pin,
+				    mconfig->module->max_input_pins);
+	skl_fill_module_pin_info_v4(dfw->out_pin, mconfig->m_out_pin,
+				    dfw->is_dynamic_out_pin,
+				    mconfig->module->max_output_pins);
+
+	if (mconfig->formats_config.caps_size) {
+		mconfig->formats_config.set_params = dfw->caps.set_params;
+		mconfig->formats_config.param_id = dfw->caps.param_id;
+		mconfig->formats_config.caps =
+		devm_kzalloc(dev, mconfig->formats_config.caps_size,
+			     GFP_KERNEL);
+		if (!mconfig->formats_config.caps)
+			return -ENOMEM;
+		memcpy(mconfig->formats_config.caps, dfw->caps.caps,
+		       dfw->caps.caps_size);
+	}
+
+	return 0;
+}
+
 /*
  * Parse the private data for the token and corresponding value.
  * The private data can have multiple data blocks. So, a data block
@@ -2739,6 +2901,13 @@ static int skl_tplg_get_pvt_data(struct snd_soc_tplg_dapm_widget *tplg_w,
 	char *data;
 	int ret;
 
+	/*
+	 * v4 configuration files have a valid UUID at the start of
+	 * the widget's private data.
+	 */
+	if (uuid_is_valid((char *)tplg_w->priv.data))
+		return skl_tplg_get_pvt_data_v4(tplg_w, skl, dev, mconfig);
+
 	/* Read the NUM_DATA_BLOCKS descriptor */
 	array = (struct snd_soc_tplg_vendor_array *)tplg_w->priv.data;
 	ret = skl_tplg_get_desc_blocks(dev, array);
diff --git a/sound/soc/intel/skylake/skl-tplg-interface.h b/sound/soc/intel/skylake/skl-tplg-interface.h
index f8d1749a2e0c..b0e3d376594c 100644
--- a/sound/soc/intel/skylake/skl-tplg-interface.h
+++ b/sound/soc/intel/skylake/skl-tplg-interface.h
@@ -169,4 +169,78 @@ enum skl_tuple_type {
 	SKL_TYPE_DATA
 };
 
+/* v4 configuration data */
+
+struct skl_dfw_v4_module_pin {
+	u16 module_id;
+	u16 instance_id;
+} __packed;
+
+struct skl_dfw_v4_module_fmt {
+	u32 channels;
+	u32 freq;
+	u32 bit_depth;
+	u32 valid_bit_depth;
+	u32 ch_cfg;
+	u32 interleaving_style;
+	u32 sample_type;
+	u32 ch_map;
+} __packed;
+
+struct skl_dfw_v4_module_caps {
+	u32 set_params:2;
+	u32 rsvd:30;
+	u32 param_id;
+	u32 caps_size;
+	u32 caps[HDA_SST_CFG_MAX];
+} __packed;
+
+struct skl_dfw_v4_pipe {
+	u8 pipe_id;
+	u8 pipe_priority;
+	u16 conn_type:4;
+	u16 rsvd:4;
+	u16 memory_pages:8;
+} __packed;
+
+struct skl_dfw_v4_module {
+	char uuid[SKL_UUID_STR_SZ];
+
+	u16 module_id;
+	u16 instance_id;
+	u32 max_mcps;
+	u32 mem_pages;
+	u32 obs;
+	u32 ibs;
+	u32 vbus_id;
+
+	u32 max_in_queue:8;
+	u32 max_out_queue:8;
+	u32 time_slot:8;
+	u32 core_id:4;
+	u32 rsvd1:4;
+
+	u32 module_type:8;
+	u32 conn_type:4;
+	u32 dev_type:4;
+	u32 hw_conn_type:4;
+	u32 rsvd2:12;
+
+	u32 params_fixup:8;
+	u32 converter:8;
+	u32 input_pin_type:1;
+	u32 output_pin_type:1;
+	u32 is_dynamic_in_pin:1;
+	u32 is_dynamic_out_pin:1;
+	u32 is_loadable:1;
+	u32 rsvd3:11;
+
+	struct skl_dfw_v4_pipe pipe;
+	struct skl_dfw_v4_module_fmt in_fmt[MAX_IN_QUEUE];
+	struct skl_dfw_v4_module_fmt out_fmt[MAX_OUT_QUEUE];
+	struct skl_dfw_v4_module_pin in_pin[MAX_IN_QUEUE];
+	struct skl_dfw_v4_module_pin out_pin[MAX_OUT_QUEUE];
+	struct skl_dfw_v4_module_caps caps;
+} __packed;
+
 #endif
diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c
index 986b8b2f90fb..d66b2e5ccd67 100644
--- a/sound/soc/soc-topology.c
+++ b/sound/soc/soc-topology.c
@@ -2293,8 +2293,11 @@ static int manifest_new_ver(struct soc_tplg *tplg,
 	*manifest = NULL;
 
 	if (src->size != sizeof(*src_v4)) {
-		dev_err(tplg->dev, "ASoC: invalid manifest size\n");
-		return -EINVAL;
+		dev_warn(tplg->dev, "ASoC: invalid manifest size %d\n",
+			 src->size);
+		if (src->size)
+			return -EINVAL;
+		src->size = sizeof(*src_v4);
 	}
 
 	dev_warn(tplg->dev, "ASoC: old version of manifest\n");
-- 
2.17.0.441.gb46fe60e1d-goog

^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH v2 1/3] ASoC: topology: Improve backwards compatibility with v4 topology files
@ 2018-05-24 19:49 ` Guenter Roeck
  0 siblings, 0 replies; 26+ messages in thread
From: Guenter Roeck @ 2018-05-24 19:49 UTC (permalink / raw)
  To: Takashi Iwai, Mark Brown, Liam Girdwood
  Cc: alsa-devel, Pierre-Louis Bossart, linux-kernel, Chintan Patel,
	Guenter Roeck

From: Guenter Roeck <groeck@chromium.org>

Commit dc31e741db49 ("ASoC: topology: ABI - Add the types for BE
DAI") introduced sound topology files version 5. Initially, this
change made the topology code incompatible with v4 topology files.
Backwards compatibility with v4 configuration files was
subsequently added with commit 288b8da7e992 ("ASoC: topology:
Support topology file of ABI v4").

Unfortunately, backwards compatibility was never fully implemented.

First, the manifest size in (Skylake) v4 configuration files is set
to 0, which causes manifest_new_ver() to bail out with error messages
similar to the following.

snd_soc_skl 0000:00:1f.3: ASoC: invalid manifest size
snd_soc_skl 0000:00:1f.3: tplg component load failed-22
snd_soc_skl 0000:00:1f.3: Failed to init topology!
snd_soc_skl 0000:00:1f.3: ASoC: failed to probe component -22
skl_n88l25_m98357a skl_n88l25_m98357a: ASoC: failed to instantiate card -22
skl_n88l25_m98357a: probe of skl_n88l25_m98357a failed with error -22

After this problem is fixed, the following error message is seen instead.

snd_soc_skl 0000:00:1f.3: ASoC: old version of manifest
snd_soc_skl 0000:00:1f.3: Invalid descriptor token 1093938482
snd_soc_skl 0000:00:1f.3: ASoC: failed to load widget media0_in cpr 0
snd_soc_skl 0000:00:1f.3: tPlg component load failed-22

This message is seen because backwards compatibility for loading widgets
was never implemented.

The lack of audio support when running the upstream kernel on recent
Chromebooks has been reported in various forums, and can be traced back
to this problem. Attempts to fix the problem, usually by providing v5
configuration files, were only partially successful.

Let's implement backward compatibility properly to solve the problem
for good.

Signed-off-by: Guenter Roeck <groeck@chromium.org>
---
Tested on Caroline (Samsung Chromebook Pro) and Chell (HP Chromebook 13
G1) running v4.17-rc6 plus this patch, with original (v4) configuration
files. Also tested on several other Chromebooks with this patch on top
of chromeos-4.14.

v2:
- Move on from RFC/RFT to real patch
- Move v4 structure definitions into header file
- Add support for copying private capabilities
- Declare skl_dfw_v4_module_caps as __packed
- Drop duplicate assignment of mconfig->pipe->state

 sound/soc/intel/skylake/skl-topology.c       | 169 +++++++++++++++++++
 sound/soc/intel/skylake/skl-tplg-interface.h |  74 ++++++++
 sound/soc/soc-topology.c                     |   7 +-
 3 files changed, 248 insertions(+), 2 deletions(-)

diff --git a/sound/soc/intel/skylake/skl-topology.c b/sound/soc/intel/skylake/skl-topology.c
index 3b1dca419883..9e4c2cb88dea 100644
--- a/sound/soc/intel/skylake/skl-topology.c
+++ b/sound/soc/intel/skylake/skl-topology.c
@@ -19,6 +19,7 @@
 #include <linux/slab.h>
 #include <linux/types.h>
 #include <linux/firmware.h>
+#include <linux/uuid.h>
 #include <sound/soc.h>
 #include <sound/soc-topology.h>
 #include <uapi/sound/snd_sst_tokens.h>
@@ -2724,6 +2725,167 @@ static int skl_tplg_get_desc_blocks(struct device *dev,
 	return -EINVAL;
 }
 
+/* Functions to parse private data from configuration file format v4 */
+
+/*
+ * Add pipeline from topology binary into driver pipeline list
+ *
+ * If already added we return that instance
+ * Otherwise we create a new instance and add into driver list
+ */
+static int skl_tplg_add_pipe_v4(struct device *dev,
+				struct skl_module_cfg *mconfig, struct skl *skl,
+				struct skl_dfw_v4_pipe *dfw_pipe)
+{
+	struct skl_pipeline *ppl;
+	struct skl_pipe *pipe;
+	struct skl_pipe_params *params;
+
+	list_for_each_entry(ppl, &skl->ppl_list, node) {
+		if (ppl->pipe->ppl_id == dfw_pipe->pipe_id) {
+			mconfig->pipe = ppl->pipe;
+			return 0;
+		}
+	}
+
+	ppl = devm_kzalloc(dev, sizeof(*ppl), GFP_KERNEL);
+	if (!ppl)
+		return -ENOMEM;
+
+	pipe = devm_kzalloc(dev, sizeof(*pipe), GFP_KERNEL);
+	if (!pipe)
+		return -ENOMEM;
+
+	params = devm_kzalloc(dev, sizeof(*params), GFP_KERNEL);
+	if (!params)
+		return -ENOMEM;
+
+	pipe->ppl_id = dfw_pipe->pipe_id;
+	pipe->memory_pages = dfw_pipe->memory_pages;
+	pipe->pipe_priority = dfw_pipe->pipe_priority;
+	pipe->conn_type = dfw_pipe->conn_type;
+	pipe->state = SKL_PIPE_INVALID;
+	pipe->p_params = params;
+	INIT_LIST_HEAD(&pipe->w_list);
+
+	ppl->pipe = pipe;
+	list_add(&ppl->node, &skl->ppl_list);
+
+	mconfig->pipe = pipe;
+
+	return 0;
+}
+
+static void skl_fill_module_pin_info_v4(struct skl_dfw_v4_module_pin *dfw_pin,
+					struct skl_module_pin *m_pin,
+					bool is_dynamic, int max_pin)
+{
+	int i;
+
+	for (i = 0; i < max_pin; i++) {
+		m_pin[i].id.module_id = dfw_pin[i].module_id;
+		m_pin[i].id.instance_id = dfw_pin[i].instance_id;
+		m_pin[i].in_use = false;
+		m_pin[i].is_dynamic = is_dynamic;
+		m_pin[i].pin_state = SKL_PIN_UNBIND;
+	}
+}
+
+static void skl_tplg_fill_fmt_v4(struct skl_module_pin_fmt *dst_fmt,
+				 struct skl_dfw_v4_module_fmt *src_fmt,
+				 int pins)
+{
+	int i;
+
+	for (i = 0; i < pins; i++) {
+		dst_fmt[i].fmt.channels  = src_fmt[i].channels;
+		dst_fmt[i].fmt.s_freq = src_fmt[i].freq;
+		dst_fmt[i].fmt.bit_depth = src_fmt[i].bit_depth;
+		dst_fmt[i].fmt.valid_bit_depth = src_fmt[i].valid_bit_depth;
+		dst_fmt[i].fmt.ch_cfg = src_fmt[i].ch_cfg;
+		dst_fmt[i].fmt.ch_map = src_fmt[i].ch_map;
+		dst_fmt[i].fmt.interleaving_style =
+						src_fmt[i].interleaving_style;
+		dst_fmt[i].fmt.sample_type = src_fmt[i].sample_type;
+	}
+}
+
+static int skl_tplg_get_pvt_data_v4(struct snd_soc_tplg_dapm_widget *tplg_w,
+				    struct skl *skl, struct device *dev,
+				    struct skl_module_cfg *mconfig)
+{
+	struct skl_dfw_v4_module *dfw =
+				(struct skl_dfw_v4_module *)tplg_w->priv.data;
+	int ret;
+
+	dev_dbg(dev, "Parsing Skylake v4 widget topology data\n");
+
+	ret = guid_parse(dfw->uuid, (guid_t *)mconfig->guid);
+	if (ret)
+		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].ibs = dfw->ibs;
+	mconfig->module->resources[0].obs = dfw->obs;
+	mconfig->core_id = dfw->core_id;
+	mconfig->module->max_input_pins = dfw->max_in_queue;
+	mconfig->module->max_output_pins = dfw->max_out_queue;
+	mconfig->module->loadable = dfw->is_loadable;
+	skl_tplg_fill_fmt_v4(mconfig->module->formats[0].inputs, dfw->in_fmt,
+			     MAX_IN_QUEUE);
+	skl_tplg_fill_fmt_v4(mconfig->module->formats[0].outputs, dfw->out_fmt,
+			     MAX_OUT_QUEUE);
+
+	mconfig->params_fixup = dfw->params_fixup;
+	mconfig->converter = dfw->converter;
+	mconfig->m_type = dfw->module_type;
+	mconfig->vbus_id = dfw->vbus_id;
+	mconfig->module->resources[0].is_pages = dfw->mem_pages;
+
+	ret = skl_tplg_add_pipe_v4(dev, mconfig, skl, &dfw->pipe);
+	if (ret)
+		return ret;
+
+	mconfig->dev_type = dfw->dev_type;
+	mconfig->hw_conn_type = dfw->hw_conn_type;
+	mconfig->time_slot = dfw->time_slot;
+	mconfig->formats_config.caps_size = dfw->caps.caps_size;
+
+	mconfig->m_in_pin = devm_kzalloc(dev,
+				MAX_IN_QUEUE * sizeof(*mconfig->m_in_pin),
+				GFP_KERNEL);
+	if (!mconfig->m_in_pin)
+		return -ENOMEM;
+
+	mconfig->m_out_pin = devm_kzalloc(dev,
+				MAX_OUT_QUEUE * sizeof(*mconfig->m_out_pin),
+				GFP_KERNEL);
+	if (!mconfig->m_out_pin)
+		return -ENOMEM;
+
+	skl_fill_module_pin_info_v4(dfw->in_pin, mconfig->m_in_pin,
+				    dfw->is_dynamic_in_pin,
+				    mconfig->module->max_input_pins);
+	skl_fill_module_pin_info_v4(dfw->out_pin, mconfig->m_out_pin,
+				    dfw->is_dynamic_out_pin,
+				    mconfig->module->max_output_pins);
+
+	if (mconfig->formats_config.caps_size) {
+		mconfig->formats_config.set_params = dfw->caps.set_params;
+		mconfig->formats_config.param_id = dfw->caps.param_id;
+		mconfig->formats_config.caps =
+		devm_kzalloc(dev, mconfig->formats_config.caps_size,
+			     GFP_KERNEL);
+		if (!mconfig->formats_config.caps)
+			return -ENOMEM;
+		memcpy(mconfig->formats_config.caps, dfw->caps.caps,
+		       dfw->caps.caps_size);
+	}
+
+	return 0;
+}
+
 /*
  * Parse the private data for the token and corresponding value.
  * The private data can have multiple data blocks. So, a data block
@@ -2739,6 +2901,13 @@ static int skl_tplg_get_pvt_data(struct snd_soc_tplg_dapm_widget *tplg_w,
 	char *data;
 	int ret;
 
+	/*
+	 * v4 configuration files have a valid UUID at the start of
+	 * the widget's private data.
+	 */
+	if (uuid_is_valid((char *)tplg_w->priv.data))
+		return skl_tplg_get_pvt_data_v4(tplg_w, skl, dev, mconfig);
+
 	/* Read the NUM_DATA_BLOCKS descriptor */
 	array = (struct snd_soc_tplg_vendor_array *)tplg_w->priv.data;
 	ret = skl_tplg_get_desc_blocks(dev, array);
diff --git a/sound/soc/intel/skylake/skl-tplg-interface.h b/sound/soc/intel/skylake/skl-tplg-interface.h
index f8d1749a2e0c..b0e3d376594c 100644
--- a/sound/soc/intel/skylake/skl-tplg-interface.h
+++ b/sound/soc/intel/skylake/skl-tplg-interface.h
@@ -169,4 +169,78 @@ enum skl_tuple_type {
 	SKL_TYPE_DATA
 };
 
+/* v4 configuration data */
+
+struct skl_dfw_v4_module_pin {
+	u16 module_id;
+	u16 instance_id;
+} __packed;
+
+struct skl_dfw_v4_module_fmt {
+	u32 channels;
+	u32 freq;
+	u32 bit_depth;
+	u32 valid_bit_depth;
+	u32 ch_cfg;
+	u32 interleaving_style;
+	u32 sample_type;
+	u32 ch_map;
+} __packed;
+
+struct skl_dfw_v4_module_caps {
+	u32 set_params:2;
+	u32 rsvd:30;
+	u32 param_id;
+	u32 caps_size;
+	u32 caps[HDA_SST_CFG_MAX];
+} __packed;
+
+struct skl_dfw_v4_pipe {
+	u8 pipe_id;
+	u8 pipe_priority;
+	u16 conn_type:4;
+	u16 rsvd:4;
+	u16 memory_pages:8;
+} __packed;
+
+struct skl_dfw_v4_module {
+	char uuid[SKL_UUID_STR_SZ];
+
+	u16 module_id;
+	u16 instance_id;
+	u32 max_mcps;
+	u32 mem_pages;
+	u32 obs;
+	u32 ibs;
+	u32 vbus_id;
+
+	u32 max_in_queue:8;
+	u32 max_out_queue:8;
+	u32 time_slot:8;
+	u32 core_id:4;
+	u32 rsvd1:4;
+
+	u32 module_type:8;
+	u32 conn_type:4;
+	u32 dev_type:4;
+	u32 hw_conn_type:4;
+	u32 rsvd2:12;
+
+	u32 params_fixup:8;
+	u32 converter:8;
+	u32 input_pin_type:1;
+	u32 output_pin_type:1;
+	u32 is_dynamic_in_pin:1;
+	u32 is_dynamic_out_pin:1;
+	u32 is_loadable:1;
+	u32 rsvd3:11;
+
+	struct skl_dfw_v4_pipe pipe;
+	struct skl_dfw_v4_module_fmt in_fmt[MAX_IN_QUEUE];
+	struct skl_dfw_v4_module_fmt out_fmt[MAX_OUT_QUEUE];
+	struct skl_dfw_v4_module_pin in_pin[MAX_IN_QUEUE];
+	struct skl_dfw_v4_module_pin out_pin[MAX_OUT_QUEUE];
+	struct skl_dfw_v4_module_caps caps;
+} __packed;
+
 #endif
diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c
index 986b8b2f90fb..d66b2e5ccd67 100644
--- a/sound/soc/soc-topology.c
+++ b/sound/soc/soc-topology.c
@@ -2293,8 +2293,11 @@ static int manifest_new_ver(struct soc_tplg *tplg,
 	*manifest = NULL;
 
 	if (src->size != sizeof(*src_v4)) {
-		dev_err(tplg->dev, "ASoC: invalid manifest size\n");
-		return -EINVAL;
+		dev_warn(tplg->dev, "ASoC: invalid manifest size %d\n",
+			 src->size);
+		if (src->size)
+			return -EINVAL;
+		src->size = sizeof(*src_v4);
 	}
 
 	dev_warn(tplg->dev, "ASoC: old version of manifest\n");
-- 
2.17.0.441.gb46fe60e1d-goog

^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH v2 2/3] ASoC: topology: Move v4 manifest header data structures to uapi
  2018-05-24 19:49 ` Guenter Roeck
@ 2018-05-24 19:49   ` Guenter Roeck
  -1 siblings, 0 replies; 26+ messages in thread
From: Guenter Roeck @ 2018-05-24 19:49 UTC (permalink / raw)
  To: Takashi Iwai, Mark Brown, Liam Girdwood
  Cc: Jaroslav Kysela, Chintan Patel, alsa-devel, linux-kernel,
	Pierre-Louis Bossart, Guenter Roeck

From: Guenter Roeck <groeck@chromium.org>

Topology manifest v4 is still part of the ABI. Move its data structures
into the uapi header file.

No functional change.

Signed-off-by: Guenter Roeck <groeck@chromium.org>
---
v2: Added patch to series

 include/uapi/sound/asoc.h | 57 +++++++++++++++++++++++++++++++++++++++
 sound/soc/soc-topology.c  | 56 --------------------------------------
 2 files changed, 57 insertions(+), 56 deletions(-)

diff --git a/include/uapi/sound/asoc.h b/include/uapi/sound/asoc.h
index 69c37ecbff7e..a9df4900789c 100644
--- a/include/uapi/sound/asoc.h
+++ b/include/uapi/sound/asoc.h
@@ -552,4 +552,61 @@ struct snd_soc_tplg_dai {
 	__le32 flags;           /* SND_SOC_TPLG_DAI_FLGBIT_* */
 	struct snd_soc_tplg_private priv;
 } __attribute__((packed));
+
+/*
+ * Old version of ABI structs, supported for backward compatibility.
+ */
+
+/* Manifest v4 */
+struct snd_soc_tplg_manifest_v4 {
+	__le32 size;		/* in bytes of this structure */
+	__le32 control_elems;	/* number of control elements */
+	__le32 widget_elems;	/* number of widget elements */
+	__le32 graph_elems;	/* number of graph elements */
+	__le32 pcm_elems;	/* number of PCM elements */
+	__le32 dai_link_elems;	/* number of DAI link elements */
+	struct snd_soc_tplg_private priv;
+} __packed;
+
+/* Stream Capabilities v4 */
+struct snd_soc_tplg_stream_caps_v4 {
+	__le32 size;		/* in bytes of this structure */
+	char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+	__le64 formats;	/* supported formats SNDRV_PCM_FMTBIT_* */
+	__le32 rates;		/* supported rates SNDRV_PCM_RATE_* */
+	__le32 rate_min;	/* min rate */
+	__le32 rate_max;	/* max rate */
+	__le32 channels_min;	/* min channels */
+	__le32 channels_max;	/* max channels */
+	__le32 periods_min;	/* min number of periods */
+	__le32 periods_max;	/* max number of periods */
+	__le32 period_size_min;	/* min period size bytes */
+	__le32 period_size_max;	/* max period size bytes */
+	__le32 buffer_size_min;	/* min buffer size bytes */
+	__le32 buffer_size_max;	/* max buffer size bytes */
+} __packed;
+
+/* PCM v4 */
+struct snd_soc_tplg_pcm_v4 {
+	__le32 size;		/* in bytes of this structure */
+	char pcm_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+	char dai_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+	__le32 pcm_id;		/* unique ID - used to match with DAI link */
+	__le32 dai_id;		/* unique ID - used to match */
+	__le32 playback;	/* supports playback mode */
+	__le32 capture;		/* supports capture mode */
+	__le32 compress;	/* 1 = compressed; 0 = PCM */
+	struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* for DAI link */
+	__le32 num_streams;	/* number of streams */
+	struct snd_soc_tplg_stream_caps_v4 caps[2]; /* playback and capture for DAI */
+} __packed;
+
+/* Physical link config v4 */
+struct snd_soc_tplg_link_config_v4 {
+	__le32 size;            /* in bytes of this structure */
+	__le32 id;              /* unique ID - used to match */
+	struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* supported configs playback and captrure */
+	__le32 num_streams;     /* number of streams */
+} __packed;
+
 #endif
diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c
index d66b2e5ccd67..40753c6a2554 100644
--- a/sound/soc/soc-topology.c
+++ b/sound/soc/soc-topology.c
@@ -54,62 +54,6 @@
 #define SOC_TPLG_PASS_START	SOC_TPLG_PASS_MANIFEST
 #define SOC_TPLG_PASS_END	SOC_TPLG_PASS_LINK
 
-/*
- * Old version of ABI structs, supported for backward compatibility.
- */
-
-/* Manifest v4 */
-struct snd_soc_tplg_manifest_v4 {
-	__le32 size;		/* in bytes of this structure */
-	__le32 control_elems;	/* number of control elements */
-	__le32 widget_elems;	/* number of widget elements */
-	__le32 graph_elems;	/* number of graph elements */
-	__le32 pcm_elems;	/* number of PCM elements */
-	__le32 dai_link_elems;	/* number of DAI link elements */
-	struct snd_soc_tplg_private priv;
-} __packed;
-
-/* Stream Capabilities v4 */
-struct snd_soc_tplg_stream_caps_v4 {
-	__le32 size;		/* in bytes of this structure */
-	char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
-	__le64 formats;	/* supported formats SNDRV_PCM_FMTBIT_* */
-	__le32 rates;		/* supported rates SNDRV_PCM_RATE_* */
-	__le32 rate_min;	/* min rate */
-	__le32 rate_max;	/* max rate */
-	__le32 channels_min;	/* min channels */
-	__le32 channels_max;	/* max channels */
-	__le32 periods_min;	/* min number of periods */
-	__le32 periods_max;	/* max number of periods */
-	__le32 period_size_min;	/* min period size bytes */
-	__le32 period_size_max;	/* max period size bytes */
-	__le32 buffer_size_min;	/* min buffer size bytes */
-	__le32 buffer_size_max;	/* max buffer size bytes */
-} __packed;
-
-/* PCM v4 */
-struct snd_soc_tplg_pcm_v4 {
-	__le32 size;		/* in bytes of this structure */
-	char pcm_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
-	char dai_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
-	__le32 pcm_id;		/* unique ID - used to match with DAI link */
-	__le32 dai_id;		/* unique ID - used to match */
-	__le32 playback;	/* supports playback mode */
-	__le32 capture;		/* supports capture mode */
-	__le32 compress;	/* 1 = compressed; 0 = PCM */
-	struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* for DAI link */
-	__le32 num_streams;	/* number of streams */
-	struct snd_soc_tplg_stream_caps_v4 caps[2]; /* playback and capture for DAI */
-} __packed;
-
-/* Physical link config v4 */
-struct snd_soc_tplg_link_config_v4 {
-	__le32 size;            /* in bytes of this structure */
-	__le32 id;              /* unique ID - used to match */
-	struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* supported configs playback and captrure */
-	__le32 num_streams;     /* number of streams */
-} __packed;
-
 /* topology context */
 struct soc_tplg {
 	const struct firmware *fw;
-- 
2.17.0.441.gb46fe60e1d-goog

^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH v2 2/3] ASoC: topology: Move v4 manifest header data structures to uapi
@ 2018-05-24 19:49   ` Guenter Roeck
  0 siblings, 0 replies; 26+ messages in thread
From: Guenter Roeck @ 2018-05-24 19:49 UTC (permalink / raw)
  To: Takashi Iwai, Mark Brown, Liam Girdwood
  Cc: alsa-devel, Pierre-Louis Bossart, linux-kernel, Chintan Patel,
	Guenter Roeck

From: Guenter Roeck <groeck@chromium.org>

Topology manifest v4 is still part of the ABI. Move its data structures
into the uapi header file.

No functional change.

Signed-off-by: Guenter Roeck <groeck@chromium.org>
---
v2: Added patch to series

 include/uapi/sound/asoc.h | 57 +++++++++++++++++++++++++++++++++++++++
 sound/soc/soc-topology.c  | 56 --------------------------------------
 2 files changed, 57 insertions(+), 56 deletions(-)

diff --git a/include/uapi/sound/asoc.h b/include/uapi/sound/asoc.h
index 69c37ecbff7e..a9df4900789c 100644
--- a/include/uapi/sound/asoc.h
+++ b/include/uapi/sound/asoc.h
@@ -552,4 +552,61 @@ struct snd_soc_tplg_dai {
 	__le32 flags;           /* SND_SOC_TPLG_DAI_FLGBIT_* */
 	struct snd_soc_tplg_private priv;
 } __attribute__((packed));
+
+/*
+ * Old version of ABI structs, supported for backward compatibility.
+ */
+
+/* Manifest v4 */
+struct snd_soc_tplg_manifest_v4 {
+	__le32 size;		/* in bytes of this structure */
+	__le32 control_elems;	/* number of control elements */
+	__le32 widget_elems;	/* number of widget elements */
+	__le32 graph_elems;	/* number of graph elements */
+	__le32 pcm_elems;	/* number of PCM elements */
+	__le32 dai_link_elems;	/* number of DAI link elements */
+	struct snd_soc_tplg_private priv;
+} __packed;
+
+/* Stream Capabilities v4 */
+struct snd_soc_tplg_stream_caps_v4 {
+	__le32 size;		/* in bytes of this structure */
+	char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+	__le64 formats;	/* supported formats SNDRV_PCM_FMTBIT_* */
+	__le32 rates;		/* supported rates SNDRV_PCM_RATE_* */
+	__le32 rate_min;	/* min rate */
+	__le32 rate_max;	/* max rate */
+	__le32 channels_min;	/* min channels */
+	__le32 channels_max;	/* max channels */
+	__le32 periods_min;	/* min number of periods */
+	__le32 periods_max;	/* max number of periods */
+	__le32 period_size_min;	/* min period size bytes */
+	__le32 period_size_max;	/* max period size bytes */
+	__le32 buffer_size_min;	/* min buffer size bytes */
+	__le32 buffer_size_max;	/* max buffer size bytes */
+} __packed;
+
+/* PCM v4 */
+struct snd_soc_tplg_pcm_v4 {
+	__le32 size;		/* in bytes of this structure */
+	char pcm_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+	char dai_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+	__le32 pcm_id;		/* unique ID - used to match with DAI link */
+	__le32 dai_id;		/* unique ID - used to match */
+	__le32 playback;	/* supports playback mode */
+	__le32 capture;		/* supports capture mode */
+	__le32 compress;	/* 1 = compressed; 0 = PCM */
+	struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* for DAI link */
+	__le32 num_streams;	/* number of streams */
+	struct snd_soc_tplg_stream_caps_v4 caps[2]; /* playback and capture for DAI */
+} __packed;
+
+/* Physical link config v4 */
+struct snd_soc_tplg_link_config_v4 {
+	__le32 size;            /* in bytes of this structure */
+	__le32 id;              /* unique ID - used to match */
+	struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* supported configs playback and captrure */
+	__le32 num_streams;     /* number of streams */
+} __packed;
+
 #endif
diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c
index d66b2e5ccd67..40753c6a2554 100644
--- a/sound/soc/soc-topology.c
+++ b/sound/soc/soc-topology.c
@@ -54,62 +54,6 @@
 #define SOC_TPLG_PASS_START	SOC_TPLG_PASS_MANIFEST
 #define SOC_TPLG_PASS_END	SOC_TPLG_PASS_LINK
 
-/*
- * Old version of ABI structs, supported for backward compatibility.
- */
-
-/* Manifest v4 */
-struct snd_soc_tplg_manifest_v4 {
-	__le32 size;		/* in bytes of this structure */
-	__le32 control_elems;	/* number of control elements */
-	__le32 widget_elems;	/* number of widget elements */
-	__le32 graph_elems;	/* number of graph elements */
-	__le32 pcm_elems;	/* number of PCM elements */
-	__le32 dai_link_elems;	/* number of DAI link elements */
-	struct snd_soc_tplg_private priv;
-} __packed;
-
-/* Stream Capabilities v4 */
-struct snd_soc_tplg_stream_caps_v4 {
-	__le32 size;		/* in bytes of this structure */
-	char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
-	__le64 formats;	/* supported formats SNDRV_PCM_FMTBIT_* */
-	__le32 rates;		/* supported rates SNDRV_PCM_RATE_* */
-	__le32 rate_min;	/* min rate */
-	__le32 rate_max;	/* max rate */
-	__le32 channels_min;	/* min channels */
-	__le32 channels_max;	/* max channels */
-	__le32 periods_min;	/* min number of periods */
-	__le32 periods_max;	/* max number of periods */
-	__le32 period_size_min;	/* min period size bytes */
-	__le32 period_size_max;	/* max period size bytes */
-	__le32 buffer_size_min;	/* min buffer size bytes */
-	__le32 buffer_size_max;	/* max buffer size bytes */
-} __packed;
-
-/* PCM v4 */
-struct snd_soc_tplg_pcm_v4 {
-	__le32 size;		/* in bytes of this structure */
-	char pcm_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
-	char dai_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
-	__le32 pcm_id;		/* unique ID - used to match with DAI link */
-	__le32 dai_id;		/* unique ID - used to match */
-	__le32 playback;	/* supports playback mode */
-	__le32 capture;		/* supports capture mode */
-	__le32 compress;	/* 1 = compressed; 0 = PCM */
-	struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* for DAI link */
-	__le32 num_streams;	/* number of streams */
-	struct snd_soc_tplg_stream_caps_v4 caps[2]; /* playback and capture for DAI */
-} __packed;
-
-/* Physical link config v4 */
-struct snd_soc_tplg_link_config_v4 {
-	__le32 size;            /* in bytes of this structure */
-	__le32 id;              /* unique ID - used to match */
-	struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* supported configs playback and captrure */
-	__le32 num_streams;     /* number of streams */
-} __packed;
-
 /* topology context */
 struct soc_tplg {
 	const struct firmware *fw;
-- 
2.17.0.441.gb46fe60e1d-goog

^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH v2 3/3] ASoC: topology: Move skl-tplg-interface.h to uapi
  2018-05-24 19:49 ` Guenter Roeck
  (?)
  (?)
@ 2018-05-24 19:49 ` Guenter Roeck
  2018-06-01 17:12     ` Mark Brown
  -1 siblings, 1 reply; 26+ messages in thread
From: Guenter Roeck @ 2018-05-24 19:49 UTC (permalink / raw)
  To: Takashi Iwai, Mark Brown, Liam Girdwood
  Cc: Jaroslav Kysela, Chintan Patel, alsa-devel, linux-kernel,
	Pierre-Louis Bossart, Guenter Roeck

From: Guenter Roeck <groeck@chromium.org>

skl-tplg-interface.h describes firmware format details for Skylake
topology files. It is part of the ABI and should reside in the uapi
directory.

While moving the file, also replace the license boilerplate with
the SPDX License Identifier.

No functional change.

Signed-off-by: Guenter Roeck <groeck@chromium.org>
---
v2: Added patch to series

 .../uapi/sound}/skl-tplg-interface.h                  | 11 +----------
 sound/soc/intel/skylake/skl-debug.c                   |  2 +-
 sound/soc/intel/skylake/skl-messages.c                |  2 +-
 sound/soc/intel/skylake/skl-topology.c                |  2 +-
 sound/soc/intel/skylake/skl-topology.h                |  2 +-
 5 files changed, 5 insertions(+), 14 deletions(-)
 rename {sound/soc/intel/skylake => include/uapi/sound}/skl-tplg-interface.h (90%)

diff --git a/sound/soc/intel/skylake/skl-tplg-interface.h b/include/uapi/sound/skl-tplg-interface.h
similarity index 90%
rename from sound/soc/intel/skylake/skl-tplg-interface.h
rename to include/uapi/sound/skl-tplg-interface.h
index b0e3d376594c..f58cafa42f18 100644
--- a/sound/soc/intel/skylake/skl-tplg-interface.h
+++ b/include/uapi/sound/skl-tplg-interface.h
@@ -1,19 +1,10 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  * skl-tplg-interface.h - Intel DSP FW private data interface
  *
  * Copyright (C) 2015 Intel Corp
  * Author: Jeeja KP <jeeja.kp@intel.com>
  *	    Nilofer, Samreen <samreen.nilofer@intel.com>
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as version 2, as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
  */
 
 #ifndef __HDA_TPLG_INTERFACE_H__
diff --git a/sound/soc/intel/skylake/skl-debug.c b/sound/soc/intel/skylake/skl-debug.c
index a016455a6ddb..a7a5deaf12f3 100644
--- a/sound/soc/intel/skylake/skl-debug.c
+++ b/sound/soc/intel/skylake/skl-debug.c
@@ -15,10 +15,10 @@
 
 #include <linux/pci.h>
 #include <linux/debugfs.h>
+#include <uapi/sound/skl-tplg-interface.h>
 #include "skl.h"
 #include "skl-sst-dsp.h"
 #include "skl-sst-ipc.h"
-#include "skl-tplg-interface.h"
 #include "skl-topology.h"
 #include "../common/sst-dsp.h"
 #include "../common/sst-dsp-priv.h"
diff --git a/sound/soc/intel/skylake/skl-messages.c b/sound/soc/intel/skylake/skl-messages.c
index 57d4a58522a6..fdea186615c6 100644
--- a/sound/soc/intel/skylake/skl-messages.c
+++ b/sound/soc/intel/skylake/skl-messages.c
@@ -21,6 +21,7 @@
 #include <linux/pci.h>
 #include <sound/core.h>
 #include <sound/pcm.h>
+#include <uapi/sound/skl-tplg-interface.h>
 #include "skl-sst-dsp.h"
 #include "cnl-sst-dsp.h"
 #include "skl-sst-ipc.h"
@@ -28,7 +29,6 @@
 #include "../common/sst-dsp.h"
 #include "../common/sst-dsp-priv.h"
 #include "skl-topology.h"
-#include "skl-tplg-interface.h"
 
 static int skl_alloc_dma_buf(struct device *dev,
 		struct snd_dma_buffer *dmab, size_t size)
diff --git a/sound/soc/intel/skylake/skl-topology.c b/sound/soc/intel/skylake/skl-topology.c
index 9e4c2cb88dea..2c5129782959 100644
--- a/sound/soc/intel/skylake/skl-topology.c
+++ b/sound/soc/intel/skylake/skl-topology.c
@@ -23,11 +23,11 @@
 #include <sound/soc.h>
 #include <sound/soc-topology.h>
 #include <uapi/sound/snd_sst_tokens.h>
+#include <uapi/sound/skl-tplg-interface.h>
 #include "skl-sst-dsp.h"
 #include "skl-sst-ipc.h"
 #include "skl-topology.h"
 #include "skl.h"
-#include "skl-tplg-interface.h"
 #include "../common/sst-dsp.h"
 #include "../common/sst-dsp-priv.h"
 
diff --git a/sound/soc/intel/skylake/skl-topology.h b/sound/soc/intel/skylake/skl-topology.h
index b1e0667c0ae0..6d7e0569695f 100644
--- a/sound/soc/intel/skylake/skl-topology.h
+++ b/sound/soc/intel/skylake/skl-topology.h
@@ -25,8 +25,8 @@
 
 #include <sound/hdaudio_ext.h>
 #include <sound/soc.h>
+#include <uapi/sound/skl-tplg-interface.h>
 #include "skl.h"
-#include "skl-tplg-interface.h"
 
 #define BITS_PER_BYTE 8
 #define MAX_TS_GROUPS 8
-- 
2.17.0.441.gb46fe60e1d-goog

^ permalink raw reply related	[flat|nested] 26+ messages in thread

* Re: [alsa-devel] [PATCH v2 1/3] ASoC: topology: Improve backwards compatibility with v4 topology files
  2018-05-24 19:49 ` Guenter Roeck
                   ` (2 preceding siblings ...)
  (?)
@ 2018-05-25 13:33 ` Shreyas NC
  2018-05-28  6:03   ` Vinod
  -1 siblings, 1 reply; 26+ messages in thread
From: Shreyas NC @ 2018-05-25 13:33 UTC (permalink / raw)
  To: Guenter Roeck
  Cc: Takashi Iwai, Mark Brown, Liam Girdwood, alsa-devel,
	Pierre-Louis Bossart, linux-kernel, Chintan Patel, Guenter Roeck,
	vkoul

Adding Vinod to help review as well..
> Commit dc31e741db49 ("ASoC: topology: ABI - Add the types for BE
> DAI") introduced sound topology files version 5. Initially, this
> change made the topology code incompatible with v4 topology files.
> Backwards compatibility with v4 configuration files was
> subsequently added with commit 288b8da7e992 ("ASoC: topology:
> Support topology file of ABI v4").
> 
> Unfortunately, backwards compatibility was never fully implemented.
> 
> First, the manifest size in (Skylake) v4 configuration files is set
> to 0, which causes manifest_new_ver() to bail out with error messages
> similar to the following.
> 
> snd_soc_skl 0000:00:1f.3: ASoC: invalid manifest size
> snd_soc_skl 0000:00:1f.3: tplg component load failed-22
> snd_soc_skl 0000:00:1f.3: Failed to init topology!
> snd_soc_skl 0000:00:1f.3: ASoC: failed to probe component -22
> skl_n88l25_m98357a skl_n88l25_m98357a: ASoC: failed to instantiate card -22
> skl_n88l25_m98357a: probe of skl_n88l25_m98357a failed with error -22
> 
> After this problem is fixed, the following error message is seen instead.
> 
> snd_soc_skl 0000:00:1f.3: ASoC: old version of manifest
> snd_soc_skl 0000:00:1f.3: Invalid descriptor token 1093938482
> snd_soc_skl 0000:00:1f.3: ASoC: failed to load widget media0_in cpr 0
> snd_soc_skl 0000:00:1f.3: tPlg component load failed-22
> 
> This message is seen because backwards compatibility for loading widgets
> was never implemented.
> 
> The lack of audio support when running the upstream kernel on recent
> Chromebooks has been reported in various forums, and can be traced back
> to this problem. Attempts to fix the problem, usually by providing v5
> configuration files, were only partially successful.
> 
> Let's implement backward compatibility properly to solve the problem
> for good.
> 
> Signed-off-by: Guenter Roeck <groeck@chromium.org>
> ---
> Tested on Caroline (Samsung Chromebook Pro) and Chell (HP Chromebook 13
> G1) running v4.17-rc6 plus this patch, with original (v4) configuration
> files. Also tested on several other Chromebooks with this patch on top
> of chromeos-4.14.
> 
> v2:
> - Move on from RFC/RFT to real patch
> - Move v4 structure definitions into header file
> - Add support for copying private capabilities
> - Declare skl_dfw_v4_module_caps as __packed
> - Drop duplicate assignment of mconfig->pipe->state
> 
>  sound/soc/intel/skylake/skl-topology.c       | 169 +++++++++++++++++++
>  sound/soc/intel/skylake/skl-tplg-interface.h |  74 ++++++++
>  sound/soc/soc-topology.c                     |   7 +-
>  3 files changed, 248 insertions(+), 2 deletions(-)
> 
> diff --git a/sound/soc/intel/skylake/skl-topology.c b/sound/soc/intel/skylake/skl-topology.c
> index 3b1dca419883..9e4c2cb88dea 100644
> --- a/sound/soc/intel/skylake/skl-topology.c
> +++ b/sound/soc/intel/skylake/skl-topology.c
> @@ -19,6 +19,7 @@
>  #include <linux/slab.h>
>  #include <linux/types.h>
>  #include <linux/firmware.h>
> +#include <linux/uuid.h>
>  #include <sound/soc.h>
>  #include <sound/soc-topology.h>
>  #include <uapi/sound/snd_sst_tokens.h>
> @@ -2724,6 +2725,167 @@ static int skl_tplg_get_desc_blocks(struct device *dev,
>  	return -EINVAL;
>  }
>  
> +/* Functions to parse private data from configuration file format v4 */
> +
> +/*
> + * Add pipeline from topology binary into driver pipeline list
> + *
> + * If already added we return that instance
> + * Otherwise we create a new instance and add into driver list
> + */
> +static int skl_tplg_add_pipe_v4(struct device *dev,
> +				struct skl_module_cfg *mconfig, struct skl *skl,
> +				struct skl_dfw_v4_pipe *dfw_pipe)
> +{
> +	struct skl_pipeline *ppl;
> +	struct skl_pipe *pipe;
> +	struct skl_pipe_params *params;
> +
> +	list_for_each_entry(ppl, &skl->ppl_list, node) {
> +		if (ppl->pipe->ppl_id == dfw_pipe->pipe_id) {
> +			mconfig->pipe = ppl->pipe;
> +			return 0;
> +		}
> +	}
> +
> +	ppl = devm_kzalloc(dev, sizeof(*ppl), GFP_KERNEL);
> +	if (!ppl)
> +		return -ENOMEM;
> +
> +	pipe = devm_kzalloc(dev, sizeof(*pipe), GFP_KERNEL);
> +	if (!pipe)
> +		return -ENOMEM;
> +
> +	params = devm_kzalloc(dev, sizeof(*params), GFP_KERNEL);
> +	if (!params)
> +		return -ENOMEM;
> +
> +	pipe->ppl_id = dfw_pipe->pipe_id;
> +	pipe->memory_pages = dfw_pipe->memory_pages;
> +	pipe->pipe_priority = dfw_pipe->pipe_priority;
> +	pipe->conn_type = dfw_pipe->conn_type;
> +	pipe->state = SKL_PIPE_INVALID;
> +	pipe->p_params = params;
> +	INIT_LIST_HEAD(&pipe->w_list);
> +
> +	ppl->pipe = pipe;
> +	list_add(&ppl->node, &skl->ppl_list);
> +
> +	mconfig->pipe = pipe;
> +
> +	return 0;
> +}
> +
> +static void skl_fill_module_pin_info_v4(struct skl_dfw_v4_module_pin *dfw_pin,
> +					struct skl_module_pin *m_pin,
> +					bool is_dynamic, int max_pin)
> +{
> +	int i;
> +
> +	for (i = 0; i < max_pin; i++) {
> +		m_pin[i].id.module_id = dfw_pin[i].module_id;
> +		m_pin[i].id.instance_id = dfw_pin[i].instance_id;
> +		m_pin[i].in_use = false;
> +		m_pin[i].is_dynamic = is_dynamic;
> +		m_pin[i].pin_state = SKL_PIN_UNBIND;
> +	}
> +}
> +
> +static void skl_tplg_fill_fmt_v4(struct skl_module_pin_fmt *dst_fmt,
> +				 struct skl_dfw_v4_module_fmt *src_fmt,
> +				 int pins)
> +{
> +	int i;
> +
> +	for (i = 0; i < pins; i++) {
> +		dst_fmt[i].fmt.channels  = src_fmt[i].channels;
> +		dst_fmt[i].fmt.s_freq = src_fmt[i].freq;
> +		dst_fmt[i].fmt.bit_depth = src_fmt[i].bit_depth;
> +		dst_fmt[i].fmt.valid_bit_depth = src_fmt[i].valid_bit_depth;
> +		dst_fmt[i].fmt.ch_cfg = src_fmt[i].ch_cfg;
> +		dst_fmt[i].fmt.ch_map = src_fmt[i].ch_map;
> +		dst_fmt[i].fmt.interleaving_style =
> +						src_fmt[i].interleaving_style;
> +		dst_fmt[i].fmt.sample_type = src_fmt[i].sample_type;
> +	}
> +}
> +
> +static int skl_tplg_get_pvt_data_v4(struct snd_soc_tplg_dapm_widget *tplg_w,
> +				    struct skl *skl, struct device *dev,
> +				    struct skl_module_cfg *mconfig)
> +{
> +	struct skl_dfw_v4_module *dfw =
> +				(struct skl_dfw_v4_module *)tplg_w->priv.data;
> +	int ret;
> +
> +	dev_dbg(dev, "Parsing Skylake v4 widget topology data\n");
> +
> +	ret = guid_parse(dfw->uuid, (guid_t *)mconfig->guid);
> +	if (ret)
> +		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].ibs = dfw->ibs;
> +	mconfig->module->resources[0].obs = dfw->obs;
> +	mconfig->core_id = dfw->core_id;
> +	mconfig->module->max_input_pins = dfw->max_in_queue;
> +	mconfig->module->max_output_pins = dfw->max_out_queue;
> +	mconfig->module->loadable = dfw->is_loadable;
> +	skl_tplg_fill_fmt_v4(mconfig->module->formats[0].inputs, dfw->in_fmt,
> +			     MAX_IN_QUEUE);
> +	skl_tplg_fill_fmt_v4(mconfig->module->formats[0].outputs, dfw->out_fmt,
> +			     MAX_OUT_QUEUE);
> +
> +	mconfig->params_fixup = dfw->params_fixup;
> +	mconfig->converter = dfw->converter;
> +	mconfig->m_type = dfw->module_type;
> +	mconfig->vbus_id = dfw->vbus_id;
> +	mconfig->module->resources[0].is_pages = dfw->mem_pages;
> +
> +	ret = skl_tplg_add_pipe_v4(dev, mconfig, skl, &dfw->pipe);
> +	if (ret)
> +		return ret;
> +
> +	mconfig->dev_type = dfw->dev_type;
> +	mconfig->hw_conn_type = dfw->hw_conn_type;
> +	mconfig->time_slot = dfw->time_slot;
> +	mconfig->formats_config.caps_size = dfw->caps.caps_size;
> +
> +	mconfig->m_in_pin = devm_kzalloc(dev,
> +				MAX_IN_QUEUE * sizeof(*mconfig->m_in_pin),
> +				GFP_KERNEL);
> +	if (!mconfig->m_in_pin)
> +		return -ENOMEM;
> +
> +	mconfig->m_out_pin = devm_kzalloc(dev,
> +				MAX_OUT_QUEUE * sizeof(*mconfig->m_out_pin),
> +				GFP_KERNEL);
> +	if (!mconfig->m_out_pin)
> +		return -ENOMEM;
> +
> +	skl_fill_module_pin_info_v4(dfw->in_pin, mconfig->m_in_pin,
> +				    dfw->is_dynamic_in_pin,
> +				    mconfig->module->max_input_pins);
> +	skl_fill_module_pin_info_v4(dfw->out_pin, mconfig->m_out_pin,
> +				    dfw->is_dynamic_out_pin,
> +				    mconfig->module->max_output_pins);
> +
> +	if (mconfig->formats_config.caps_size) {
> +		mconfig->formats_config.set_params = dfw->caps.set_params;
> +		mconfig->formats_config.param_id = dfw->caps.param_id;
> +		mconfig->formats_config.caps =
> +		devm_kzalloc(dev, mconfig->formats_config.caps_size,
> +			     GFP_KERNEL);
> +		if (!mconfig->formats_config.caps)
> +			return -ENOMEM;
> +		memcpy(mconfig->formats_config.caps, dfw->caps.caps,
> +		       dfw->caps.caps_size);
> +	}
> +
> +	return 0;
> +}
> +
>  /*
>   * Parse the private data for the token and corresponding value.
>   * The private data can have multiple data blocks. So, a data block
> @@ -2739,6 +2901,13 @@ static int skl_tplg_get_pvt_data(struct snd_soc_tplg_dapm_widget *tplg_w,
>  	char *data;
>  	int ret;
>  
> +	/*
> +	 * v4 configuration files have a valid UUID at the start of
> +	 * the widget's private data.
> +	 */
> +	if (uuid_is_valid((char *)tplg_w->priv.data))
> +		return skl_tplg_get_pvt_data_v4(tplg_w, skl, dev, mconfig);
> +
>  	/* Read the NUM_DATA_BLOCKS descriptor */
>  	array = (struct snd_soc_tplg_vendor_array *)tplg_w->priv.data;
>  	ret = skl_tplg_get_desc_blocks(dev, array);
> diff --git a/sound/soc/intel/skylake/skl-tplg-interface.h b/sound/soc/intel/skylake/skl-tplg-interface.h
> index f8d1749a2e0c..b0e3d376594c 100644
> --- a/sound/soc/intel/skylake/skl-tplg-interface.h
> +++ b/sound/soc/intel/skylake/skl-tplg-interface.h
> @@ -169,4 +169,78 @@ enum skl_tuple_type {
>  	SKL_TYPE_DATA
>  };
>  
> +/* v4 configuration data */
> +
> +struct skl_dfw_v4_module_pin {
> +	u16 module_id;
> +	u16 instance_id;
> +} __packed;
> +
> +struct skl_dfw_v4_module_fmt {
> +	u32 channels;
> +	u32 freq;
> +	u32 bit_depth;
> +	u32 valid_bit_depth;
> +	u32 ch_cfg;
> +	u32 interleaving_style;
> +	u32 sample_type;
> +	u32 ch_map;
> +} __packed;
> +
> +struct skl_dfw_v4_module_caps {
> +	u32 set_params:2;
> +	u32 rsvd:30;
> +	u32 param_id;
> +	u32 caps_size;
> +	u32 caps[HDA_SST_CFG_MAX];
> +} __packed;
> +
> +struct skl_dfw_v4_pipe {
> +	u8 pipe_id;
> +	u8 pipe_priority;
> +	u16 conn_type:4;
> +	u16 rsvd:4;
> +	u16 memory_pages:8;
> +} __packed;
> +
> +struct skl_dfw_v4_module {
> +	char uuid[SKL_UUID_STR_SZ];
> +
> +	u16 module_id;
> +	u16 instance_id;
> +	u32 max_mcps;
> +	u32 mem_pages;
> +	u32 obs;
> +	u32 ibs;
> +	u32 vbus_id;
> +
> +	u32 max_in_queue:8;
> +	u32 max_out_queue:8;
> +	u32 time_slot:8;
> +	u32 core_id:4;
> +	u32 rsvd1:4;
> +
> +	u32 module_type:8;
> +	u32 conn_type:4;
> +	u32 dev_type:4;
> +	u32 hw_conn_type:4;
> +	u32 rsvd2:12;
> +
> +	u32 params_fixup:8;
> +	u32 converter:8;
> +	u32 input_pin_type:1;
> +	u32 output_pin_type:1;
> +	u32 is_dynamic_in_pin:1;
> +	u32 is_dynamic_out_pin:1;
> +	u32 is_loadable:1;
> +	u32 rsvd3:11;
> +
> +	struct skl_dfw_v4_pipe pipe;
> +	struct skl_dfw_v4_module_fmt in_fmt[MAX_IN_QUEUE];
> +	struct skl_dfw_v4_module_fmt out_fmt[MAX_OUT_QUEUE];
> +	struct skl_dfw_v4_module_pin in_pin[MAX_IN_QUEUE];
> +	struct skl_dfw_v4_module_pin out_pin[MAX_OUT_QUEUE];
> +	struct skl_dfw_v4_module_caps caps;
> +} __packed;
> +
>  #endif
> diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c
> index 986b8b2f90fb..d66b2e5ccd67 100644
> --- a/sound/soc/soc-topology.c
> +++ b/sound/soc/soc-topology.c
> @@ -2293,8 +2293,11 @@ static int manifest_new_ver(struct soc_tplg *tplg,
>  	*manifest = NULL;
>  
>  	if (src->size != sizeof(*src_v4)) {
> -		dev_err(tplg->dev, "ASoC: invalid manifest size\n");
> -		return -EINVAL;
> +		dev_warn(tplg->dev, "ASoC: invalid manifest size %d\n",
> +			 src->size);
> +		if (src->size)
> +			return -EINVAL;
> +		src->size = sizeof(*src_v4);
>  	}
>  
>  	dev_warn(tplg->dev, "ASoC: old version of manifest\n");
> -- 
> 2.17.0.441.gb46fe60e1d-goog
> 
> _______________________________________________
> Alsa-devel mailing list
> Alsa-devel@alsa-project.org
> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel

-- 

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [alsa-devel] [PATCH v2 1/3] ASoC: topology: Improve backwards compatibility with v4 topology files
  2018-05-25 13:33 ` [alsa-devel] [PATCH v2 1/3] ASoC: topology: Improve backwards compatibility with v4 topology files Shreyas NC
@ 2018-05-28  6:03   ` Vinod
  2018-05-28  6:38     ` Guenter Roeck
  0 siblings, 1 reply; 26+ messages in thread
From: Vinod @ 2018-05-28  6:03 UTC (permalink / raw)
  To: Shreyas NC
  Cc: Guenter Roeck, Takashi Iwai, Mark Brown, Liam Girdwood,
	alsa-devel, Pierre-Louis Bossart, linux-kernel, Chintan Patel,
	Guenter Roeck

On 25-05-18, 19:03, Shreyas NC wrote:
> Adding Vinod to help review as well..

Thanks Shreyas,

> > Commit dc31e741db49 ("ASoC: topology: ABI - Add the types for BE
> > DAI") introduced sound topology files version 5. Initially, this
> > change made the topology code incompatible with v4 topology files.
> > Backwards compatibility with v4 configuration files was
> > subsequently added with commit 288b8da7e992 ("ASoC: topology:
> > Support topology file of ABI v4").
> > 
> > Unfortunately, backwards compatibility was never fully implemented.

To give the history, we implement the binary method for data. The structures
given here were indeed ABI but we didn't move them to uapi/ as it was still in
development and with help from Takashi we finally zoomed on Tuple method for
describing the data and hence that was implemented and updated and alsa-lib
files also updated.

I am not sure we were able to ship any alsa release with this method due to
complexity of running intel tool to generate binary data and patch the topology
files.

> > First, the manifest size in (Skylake) v4 configuration files is set
> > to 0, which causes manifest_new_ver() to bail out with error messages
> > similar to the following.

So is this issue with Chrome kernel or upstream? We did ask Chrome to
cherry-pick patches for tuple support for SKL but I guess it was late for
release cycle for them and for SKL I dont think Chrome people took it. Yeah
perils of upstream and production racing...

> > 
> > snd_soc_skl 0000:00:1f.3: ASoC: invalid manifest size
> > snd_soc_skl 0000:00:1f.3: tplg component load failed-22
> > snd_soc_skl 0000:00:1f.3: Failed to init topology!
> > snd_soc_skl 0000:00:1f.3: ASoC: failed to probe component -22
> > skl_n88l25_m98357a skl_n88l25_m98357a: ASoC: failed to instantiate card -22
> > skl_n88l25_m98357a: probe of skl_n88l25_m98357a failed with error -22
> > 
> > After this problem is fixed, the following error message is seen instead.
> > 
> > snd_soc_skl 0000:00:1f.3: ASoC: old version of manifest
> > snd_soc_skl 0000:00:1f.3: Invalid descriptor token 1093938482
> > snd_soc_skl 0000:00:1f.3: ASoC: failed to load widget media0_in cpr 0
> > snd_soc_skl 0000:00:1f.3: tPlg component load failed-22
> > 
> > This message is seen because backwards compatibility for loading widgets
> > was never implemented.
> > 
> > The lack of audio support when running the upstream kernel on recent
> > Chromebooks has been reported in various forums, and can be traced back
> > to this problem. Attempts to fix the problem, usually by providing v5
> > configuration files, were only partially successful.
> > 
> > Let's implement backward compatibility properly to solve the problem
> > for good.

Thanks for doing this, great work indeed.

> > diff --git a/sound/soc/intel/skylake/skl-tplg-interface.h b/sound/soc/intel/skylake/skl-tplg-interface.h
> > index f8d1749a2e0c..b0e3d376594c 100644
> > --- a/sound/soc/intel/skylake/skl-tplg-interface.h
> > +++ b/sound/soc/intel/skylake/skl-tplg-interface.h

Don't we want to move these to upai/ as that is right place and use that in
alsa-lib.


-- 
~Vinod

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [alsa-devel] [PATCH v2 1/3] ASoC: topology: Improve backwards compatibility with v4 topology files
  2018-05-28  6:03   ` Vinod
@ 2018-05-28  6:38     ` Guenter Roeck
  0 siblings, 0 replies; 26+ messages in thread
From: Guenter Roeck @ 2018-05-28  6:38 UTC (permalink / raw)
  To: Vinod, Shreyas NC
  Cc: Takashi Iwai, Mark Brown, Liam Girdwood, alsa-devel,
	Pierre-Louis Bossart, linux-kernel, Chintan Patel, Guenter Roeck

On 05/27/2018 11:03 PM, Vinod wrote:
[ ... ]
>>> diff --git a/sound/soc/intel/skylake/skl-tplg-interface.h b/sound/soc/intel/skylake/skl-tplg-interface.h
>>> index f8d1749a2e0c..b0e3d376594c 100644
>>> --- a/sound/soc/intel/skylake/skl-tplg-interface.h
>>> +++ b/sound/soc/intel/skylake/skl-tplg-interface.h
> 
> Don't we want to move these to upai/ as that is right place and use that in
> alsa-lib.
> 

I did that in patch 3 of the series [1].

Guenter
---
[1] https://patchwork.kernel.org/patch/10425387/

^ permalink raw reply	[flat|nested] 26+ messages in thread

* RE: [alsa-devel] [PATCH v2 2/3] ASoC: topology: Move v4 manifest header data structures to uapi
  2018-05-24 19:49   ` Guenter Roeck
  (?)
@ 2018-05-29  7:51   ` Lin, Mengdong
  -1 siblings, 0 replies; 26+ messages in thread
From: Lin, Mengdong @ 2018-05-29  7:51 UTC (permalink / raw)
  To: Guenter Roeck, Takashi Iwai, Mark Brown, Liam Girdwood
  Cc: alsa-devel, Pierre-Louis Bossart, linux-kernel, Patel, Chintan M,
	Guenter Roeck

> -----Original Message-----
> From: alsa-devel-bounces@alsa-project.org [mailto:alsa-devel-bounces@alsa-
> project.org] On Behalf Of Guenter Roeck
> Sent: Friday, May 25, 2018 3:49 AM

> From: Guenter Roeck <groeck@chromium.org>
> 
> Topology manifest v4 is still part of the ABI. Move its data structures into the
> uapi header file.
> 
> No functional change.

It looks good. The v4 version of topology ABI should be in uapi header file.

Previously, we hid the v4 ABI in kernel and hoped people stop using it. But the topology files of old ABI were already shipped out and backward compatibility issue has been there. Thanks for fixing this.

Thanks
Mengdong

> 
> Signed-off-by: Guenter Roeck <groeck@chromium.org>
> ---
> v2: Added patch to series
> 
>  include/uapi/sound/asoc.h | 57
> +++++++++++++++++++++++++++++++++++++++
>  sound/soc/soc-topology.c  | 56 --------------------------------------
>  2 files changed, 57 insertions(+), 56 deletions(-)
> 
> diff --git a/include/uapi/sound/asoc.h b/include/uapi/sound/asoc.h index
> 69c37ecbff7e..a9df4900789c 100644
> --- a/include/uapi/sound/asoc.h
> +++ b/include/uapi/sound/asoc.h
> @@ -552,4 +552,61 @@ struct snd_soc_tplg_dai {
>  	__le32 flags;           /* SND_SOC_TPLG_DAI_FLGBIT_* */
>  	struct snd_soc_tplg_private priv;
>  } __attribute__((packed));
> +
> +/*
> + * Old version of ABI structs, supported for backward compatibility.
> + */
> +
> +/* Manifest v4 */
> +struct snd_soc_tplg_manifest_v4 {
> +	__le32 size;		/* in bytes of this structure */
> +	__le32 control_elems;	/* number of control elements */
> +	__le32 widget_elems;	/* number of widget elements */
> +	__le32 graph_elems;	/* number of graph elements */
> +	__le32 pcm_elems;	/* number of PCM elements */
> +	__le32 dai_link_elems;	/* number of DAI link elements */
> +	struct snd_soc_tplg_private priv;
> +} __packed;
> +
> +/* Stream Capabilities v4 */
> +struct snd_soc_tplg_stream_caps_v4 {
> +	__le32 size;		/* in bytes of this structure */
> +	char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
> +	__le64 formats;	/* supported formats SNDRV_PCM_FMTBIT_* */
> +	__le32 rates;		/* supported rates SNDRV_PCM_RATE_* */
> +	__le32 rate_min;	/* min rate */
> +	__le32 rate_max;	/* max rate */
> +	__le32 channels_min;	/* min channels */
> +	__le32 channels_max;	/* max channels */
> +	__le32 periods_min;	/* min number of periods */
> +	__le32 periods_max;	/* max number of periods */
> +	__le32 period_size_min;	/* min period size bytes */
> +	__le32 period_size_max;	/* max period size bytes */
> +	__le32 buffer_size_min;	/* min buffer size bytes */
> +	__le32 buffer_size_max;	/* max buffer size bytes */
> +} __packed;
> +
> +/* PCM v4 */
> +struct snd_soc_tplg_pcm_v4 {
> +	__le32 size;		/* in bytes of this structure */
> +	char pcm_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
> +	char dai_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
> +	__le32 pcm_id;		/* unique ID - used to match with DAI link */
> +	__le32 dai_id;		/* unique ID - used to match */
> +	__le32 playback;	/* supports playback mode */
> +	__le32 capture;		/* supports capture mode */
> +	__le32 compress;	/* 1 = compressed; 0 = PCM */
> +	struct snd_soc_tplg_stream
> stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* for DAI link */
> +	__le32 num_streams;	/* number of streams */
> +	struct snd_soc_tplg_stream_caps_v4 caps[2]; /* playback and capture
> +for DAI */ } __packed;
> +
> +/* Physical link config v4 */
> +struct snd_soc_tplg_link_config_v4 {
> +	__le32 size;            /* in bytes of this structure */
> +	__le32 id;              /* unique ID - used to match */
> +	struct snd_soc_tplg_stream
> stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* supported configs playback
> and captrure */
> +	__le32 num_streams;     /* number of streams */
> +} __packed;
> +
>  #endif
> diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c index
> d66b2e5ccd67..40753c6a2554 100644
> --- a/sound/soc/soc-topology.c
> +++ b/sound/soc/soc-topology.c
> @@ -54,62 +54,6 @@
>  #define SOC_TPLG_PASS_START	SOC_TPLG_PASS_MANIFEST
>  #define SOC_TPLG_PASS_END	SOC_TPLG_PASS_LINK
> 
> -/*
> - * Old version of ABI structs, supported for backward compatibility.
> - */
> -
> -/* Manifest v4 */
> -struct snd_soc_tplg_manifest_v4 {
> -	__le32 size;		/* in bytes of this structure */
> -	__le32 control_elems;	/* number of control elements */
> -	__le32 widget_elems;	/* number of widget elements */
> -	__le32 graph_elems;	/* number of graph elements */
> -	__le32 pcm_elems;	/* number of PCM elements */
> -	__le32 dai_link_elems;	/* number of DAI link elements */
> -	struct snd_soc_tplg_private priv;
> -} __packed;
> -
> -/* Stream Capabilities v4 */
> -struct snd_soc_tplg_stream_caps_v4 {
> -	__le32 size;		/* in bytes of this structure */
> -	char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
> -	__le64 formats;	/* supported formats SNDRV_PCM_FMTBIT_* */
> -	__le32 rates;		/* supported rates SNDRV_PCM_RATE_* */
> -	__le32 rate_min;	/* min rate */
> -	__le32 rate_max;	/* max rate */
> -	__le32 channels_min;	/* min channels */
> -	__le32 channels_max;	/* max channels */
> -	__le32 periods_min;	/* min number of periods */
> -	__le32 periods_max;	/* max number of periods */
> -	__le32 period_size_min;	/* min period size bytes */
> -	__le32 period_size_max;	/* max period size bytes */
> -	__le32 buffer_size_min;	/* min buffer size bytes */
> -	__le32 buffer_size_max;	/* max buffer size bytes */
> -} __packed;
> -
> -/* PCM v4 */
> -struct snd_soc_tplg_pcm_v4 {
> -	__le32 size;		/* in bytes of this structure */
> -	char pcm_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
> -	char dai_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
> -	__le32 pcm_id;		/* unique ID - used to match with DAI link */
> -	__le32 dai_id;		/* unique ID - used to match */
> -	__le32 playback;	/* supports playback mode */
> -	__le32 capture;		/* supports capture mode */
> -	__le32 compress;	/* 1 = compressed; 0 = PCM */
> -	struct snd_soc_tplg_stream
> stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* for DAI link */
> -	__le32 num_streams;	/* number of streams */
> -	struct snd_soc_tplg_stream_caps_v4 caps[2]; /* playback and capture
> for DAI */
> -} __packed;
> -
> -/* Physical link config v4 */
> -struct snd_soc_tplg_link_config_v4 {
> -	__le32 size;            /* in bytes of this structure */
> -	__le32 id;              /* unique ID - used to match */
> -	struct snd_soc_tplg_stream
> stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* supported configs playback
> and captrure */
> -	__le32 num_streams;     /* number of streams */
> -} __packed;
> -
>  /* topology context */
>  struct soc_tplg {
>  	const struct firmware *fw;
> --
> 2.17.0.441.gb46fe60e1d-goog
> 
> _______________________________________________
> Alsa-devel mailing list
> Alsa-devel@alsa-project.org
> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH v2 1/3] ASoC: topology: Improve backwards compatibility with v4 topology files
  2018-05-24 19:49 ` Guenter Roeck
@ 2018-06-01 10:25   ` Mark Brown
  -1 siblings, 0 replies; 26+ messages in thread
From: Mark Brown @ 2018-06-01 10:25 UTC (permalink / raw)
  To: Guenter Roeck
  Cc: Takashi Iwai, Liam Girdwood, Jaroslav Kysela, Chintan Patel,
	alsa-devel, linux-kernel, Pierre-Louis Bossart, Guenter Roeck

[-- Attachment #1: Type: text/plain, Size: 363 bytes --]

On Thu, May 24, 2018 at 12:49:21PM -0700, Guenter Roeck wrote:
> From: Guenter Roeck <groeck@chromium.org>
> 
> Commit dc31e741db49 ("ASoC: topology: ABI - Add the types for BE
> DAI") introduced sound topology files version 5. Initially, this
> change made the topology code incompatible with v4 topology files.

No review on these from anyone at Intel?

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH v2 1/3] ASoC: topology: Improve backwards compatibility with v4 topology files
@ 2018-06-01 10:25   ` Mark Brown
  0 siblings, 0 replies; 26+ messages in thread
From: Mark Brown @ 2018-06-01 10:25 UTC (permalink / raw)
  To: Guenter Roeck
  Cc: Pierre-Louis Bossart, alsa-devel, Liam Girdwood, Takashi Iwai,
	linux-kernel, Chintan Patel, Guenter Roeck


[-- Attachment #1.1: Type: text/plain, Size: 363 bytes --]

On Thu, May 24, 2018 at 12:49:21PM -0700, Guenter Roeck wrote:
> From: Guenter Roeck <groeck@chromium.org>
> 
> Commit dc31e741db49 ("ASoC: topology: ABI - Add the types for BE
> DAI") introduced sound topology files version 5. Initially, this
> change made the topology code incompatible with v4 topology files.

No review on these from anyone at Intel?

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

[-- Attachment #2: Type: text/plain, Size: 0 bytes --]



^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH v2 1/3] ASoC: topology: Improve backwards compatibility with v4 topology files
  2018-06-01 10:25   ` Mark Brown
@ 2018-06-01 13:17     ` Guenter Roeck
  -1 siblings, 0 replies; 26+ messages in thread
From: Guenter Roeck @ 2018-06-01 13:17 UTC (permalink / raw)
  To: Mark Brown
  Cc: Takashi Iwai, Liam Girdwood, Jaroslav Kysela, Chintan Patel,
	alsa-devel, linux-kernel, Pierre-Louis Bossart, Guenter Roeck

On 06/01/2018 03:25 AM, Mark Brown wrote:
> On Thu, May 24, 2018 at 12:49:21PM -0700, Guenter Roeck wrote:
>> From: Guenter Roeck <groeck@chromium.org>
>>
>> Commit dc31e741db49 ("ASoC: topology: ABI - Add the types for BE
>> DAI") introduced sound topology files version 5. Initially, this
>> change made the topology code incompatible with v4 topology files.
> 
> No review on these from anyone at Intel?
> 

The only actionable feedback I have seen is that the header file
changes should be in uapi, which is done in patches 2 and 3.

Other than that, there was a question if this is a Linux issue or
a Chromebook issue (it appears that only Chromebooks shipped with
v4 configuration files). I took that as rhetorical since upstream
kernels (at least v4.4 and v4.5) support topology v4 configuration
files, and it should not matter which products shipped using those.

Guenter

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH v2 1/3] ASoC: topology: Improve backwards compatibility with v4 topology files
@ 2018-06-01 13:17     ` Guenter Roeck
  0 siblings, 0 replies; 26+ messages in thread
From: Guenter Roeck @ 2018-06-01 13:17 UTC (permalink / raw)
  To: Mark Brown
  Cc: Pierre-Louis Bossart, alsa-devel, Liam Girdwood, Takashi Iwai,
	linux-kernel, Chintan Patel, Guenter Roeck

On 06/01/2018 03:25 AM, Mark Brown wrote:
> On Thu, May 24, 2018 at 12:49:21PM -0700, Guenter Roeck wrote:
>> From: Guenter Roeck <groeck@chromium.org>
>>
>> Commit dc31e741db49 ("ASoC: topology: ABI - Add the types for BE
>> DAI") introduced sound topology files version 5. Initially, this
>> change made the topology code incompatible with v4 topology files.
> 
> No review on these from anyone at Intel?
> 

The only actionable feedback I have seen is that the header file
changes should be in uapi, which is done in patches 2 and 3.

Other than that, there was a question if this is a Linux issue or
a Chromebook issue (it appears that only Chromebooks shipped with
v4 configuration files). I took that as rhetorical since upstream
kernels (at least v4.4 and v4.5) support topology v4 configuration
files, and it should not matter which products shipped using those.

Guenter

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [alsa-devel] [PATCH v2 1/3] ASoC: topology: Improve backwards compatibility with v4 topology files
  2018-06-01 13:17     ` Guenter Roeck
  (?)
@ 2018-06-01 15:19     ` Pierre-Louis Bossart
  2018-06-01 15:55       ` Guenter Roeck
  2018-06-01 17:08         ` Mark Brown
  -1 siblings, 2 replies; 26+ messages in thread
From: Pierre-Louis Bossart @ 2018-06-01 15:19 UTC (permalink / raw)
  To: Guenter Roeck, Mark Brown
  Cc: alsa-devel, Liam Girdwood, Takashi Iwai, linux-kernel,
	Chintan Patel, Guenter Roeck

On 6/1/18 8:17 AM, Guenter Roeck wrote:
> On 06/01/2018 03:25 AM, Mark Brown wrote:
>> On Thu, May 24, 2018 at 12:49:21PM -0700, Guenter Roeck wrote:
>>> From: Guenter Roeck <groeck@chromium.org>
>>>
>>> Commit dc31e741db49 ("ASoC: topology: ABI - Add the types for BE
>>> DAI") introduced sound topology files version 5. Initially, this
>>> change made the topology code incompatible with v4 topology files.
>>
>> No review on these from anyone at Intel?
>>
> 
> The only actionable feedback I have seen is that the header file
> changes should be in uapi, which is done in patches 2 and 3.
> 
> Other than that, there was a question if this is a Linux issue or
> a Chromebook issue (it appears that only Chromebooks shipped with
> v4 configuration files). I took that as rhetorical since upstream
> kernels (at least v4.4 and v4.5) support topology v4 configuration
> files, and it should not matter which products shipped using those.

I wanted to ack this patch but the Intel validation folks asked for a 
couple of days to finish their tests on a variety of Chromebooks (e.g. 
Lars) and double-check which models used the v4 topology. There is an 
internal thread on all this which remains active. I don't think the 
feedback will be delayed beyond early next week.

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [alsa-devel] [PATCH v2 1/3] ASoC: topology: Improve backwards compatibility with v4 topology files
  2018-06-01 15:19     ` [alsa-devel] " Pierre-Louis Bossart
@ 2018-06-01 15:55       ` Guenter Roeck
  2018-06-01 17:08         ` Mark Brown
  1 sibling, 0 replies; 26+ messages in thread
From: Guenter Roeck @ 2018-06-01 15:55 UTC (permalink / raw)
  To: Pierre-Louis Bossart
  Cc: Mark Brown, alsa-devel, Liam Girdwood, Takashi Iwai,
	linux-kernel, Chintan Patel, Guenter Roeck

On Fri, Jun 01, 2018 at 10:19:58AM -0500, Pierre-Louis Bossart wrote:
> On 6/1/18 8:17 AM, Guenter Roeck wrote:
> >On 06/01/2018 03:25 AM, Mark Brown wrote:
> >>On Thu, May 24, 2018 at 12:49:21PM -0700, Guenter Roeck wrote:
> >>>From: Guenter Roeck <groeck@chromium.org>
> >>>
> >>>Commit dc31e741db49 ("ASoC: topology: ABI - Add the types for BE
> >>>DAI") introduced sound topology files version 5. Initially, this
> >>>change made the topology code incompatible with v4 topology files.
> >>
> >>No review on these from anyone at Intel?
> >>
> >
> >The only actionable feedback I have seen is that the header file
> >changes should be in uapi, which is done in patches 2 and 3.
> >
> >Other than that, there was a question if this is a Linux issue or
> >a Chromebook issue (it appears that only Chromebooks shipped with
> >v4 configuration files). I took that as rhetorical since upstream
> >kernels (at least v4.4 and v4.5) support topology v4 configuration
> >files, and it should not matter which products shipped using those.
> 
> I wanted to ack this patch but the Intel validation folks asked for a couple
> of days to finish their tests on a variety of Chromebooks (e.g. Lars) and
> double-check which models used the v4 topology. There is an internal thread
> on all this which remains active. I don't think the feedback will be delayed
> beyond early next week.

Skylake-Y:
	caroline, cave, chell
Skylake-U:
	asuka, lars, lili, sentry

ApolloLake (alan, electro, sand, and many more) also seem to use the same
file format (or a variant of it), but I am not sure. I didn't get to testing
it due to other problems with the upstream kernel which I did not have time
to track down yet.

Guenter

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [alsa-devel] [PATCH v2 1/3] ASoC: topology: Improve backwards compatibility with v4 topology files
  2018-06-01 15:19     ` [alsa-devel] " Pierre-Louis Bossart
@ 2018-06-01 17:08         ` Mark Brown
  2018-06-01 17:08         ` Mark Brown
  1 sibling, 0 replies; 26+ messages in thread
From: Mark Brown @ 2018-06-01 17:08 UTC (permalink / raw)
  To: Pierre-Louis Bossart
  Cc: Guenter Roeck, alsa-devel, Liam Girdwood, Takashi Iwai,
	linux-kernel, Chintan Patel, Guenter Roeck

[-- Attachment #1: Type: text/plain, Size: 560 bytes --]

On Fri, Jun 01, 2018 at 10:19:58AM -0500, Pierre-Louis Bossart wrote:

> I wanted to ack this patch but the Intel validation folks asked for a couple
> of days to finish their tests on a variety of Chromebooks (e.g. Lars) and
> double-check which models used the v4 topology. There is an internal thread
> on all this which remains active. I don't think the feedback will be delayed
> beyond early next week.

OK, I'm expecting the merge window to open over the weekend so I think
I'm just going to apply now so we it's in -next when that happens.  

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH v2 1/3] ASoC: topology: Improve backwards compatibility with v4 topology files
@ 2018-06-01 17:08         ` Mark Brown
  0 siblings, 0 replies; 26+ messages in thread
From: Mark Brown @ 2018-06-01 17:08 UTC (permalink / raw)
  To: Pierre-Louis Bossart
  Cc: alsa-devel, Takashi Iwai, linux-kernel, Liam Girdwood,
	Chintan Patel, Guenter Roeck, Guenter Roeck


[-- Attachment #1.1: Type: text/plain, Size: 560 bytes --]

On Fri, Jun 01, 2018 at 10:19:58AM -0500, Pierre-Louis Bossart wrote:

> I wanted to ack this patch but the Intel validation folks asked for a couple
> of days to finish their tests on a variety of Chromebooks (e.g. Lars) and
> double-check which models used the v4 topology. There is an internal thread
> on all this which remains active. I don't think the feedback will be delayed
> beyond early next week.

OK, I'm expecting the merge window to open over the weekend so I think
I'm just going to apply now so we it's in -next when that happens.  

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

[-- Attachment #2: Type: text/plain, Size: 0 bytes --]



^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH v2 1/3] ASoC: topology: Improve backwards compatibility with v4 topology files
  2018-06-01 13:17     ` Guenter Roeck
@ 2018-06-01 17:11       ` Mark Brown
  -1 siblings, 0 replies; 26+ messages in thread
From: Mark Brown @ 2018-06-01 17:11 UTC (permalink / raw)
  To: Guenter Roeck
  Cc: Takashi Iwai, Liam Girdwood, Jaroslav Kysela, Chintan Patel,
	alsa-devel, linux-kernel, Pierre-Louis Bossart, Guenter Roeck

[-- Attachment #1: Type: text/plain, Size: 571 bytes --]

On Fri, Jun 01, 2018 at 06:17:05AM -0700, Guenter Roeck wrote:

> Other than that, there was a question if this is a Linux issue or
> a Chromebook issue (it appears that only Chromebooks shipped with
> v4 configuration files). I took that as rhetorical since upstream
> kernels (at least v4.4 and v4.5) support topology v4 configuration
> files, and it should not matter which products shipped using those.

Yes, that's definitely completely irrelevant here - one of the great
things about Chromebooks is their upstream support and this code was
definitely no exception!

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH v2 1/3] ASoC: topology: Improve backwards compatibility with v4 topology files
@ 2018-06-01 17:11       ` Mark Brown
  0 siblings, 0 replies; 26+ messages in thread
From: Mark Brown @ 2018-06-01 17:11 UTC (permalink / raw)
  To: Guenter Roeck
  Cc: Pierre-Louis Bossart, alsa-devel, Liam Girdwood, Takashi Iwai,
	linux-kernel, Chintan Patel, Guenter Roeck


[-- Attachment #1.1: Type: text/plain, Size: 571 bytes --]

On Fri, Jun 01, 2018 at 06:17:05AM -0700, Guenter Roeck wrote:

> Other than that, there was a question if this is a Linux issue or
> a Chromebook issue (it appears that only Chromebooks shipped with
> v4 configuration files). I took that as rhetorical since upstream
> kernels (at least v4.4 and v4.5) support topology v4 configuration
> files, and it should not matter which products shipped using those.

Yes, that's definitely completely irrelevant here - one of the great
things about Chromebooks is their upstream support and this code was
definitely no exception!

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

[-- Attachment #2: Type: text/plain, Size: 0 bytes --]



^ permalink raw reply	[flat|nested] 26+ messages in thread

* Applied "ASoC: topology: Move skl-tplg-interface.h to uapi" to the asoc tree
  2018-05-24 19:49 ` [PATCH v2 3/3] ASoC: topology: Move skl-tplg-interface.h to uapi Guenter Roeck
@ 2018-06-01 17:12     ` Mark Brown
  0 siblings, 0 replies; 26+ messages in thread
From: Mark Brown @ 2018-06-01 17:12 UTC (permalink / raw)
  To: Guenter Roeck
  Cc: Mark Brown, Takashi Iwai, Mark Brown, Liam Girdwood, alsa-devel,
	Pierre-Louis Bossart, linux-kernel, Chintan Patel, alsa-devel

The patch

   ASoC: topology: Move skl-tplg-interface.h to uapi

has been applied to the asoc tree at

   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git 

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.  

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark

>From 0c24fdc00244cc08309e397e3783f2943221dc53 Mon Sep 17 00:00:00 2001
From: Guenter Roeck <groeck@chromium.org>
Date: Thu, 24 May 2018 12:49:23 -0700
Subject: [PATCH] ASoC: topology: Move skl-tplg-interface.h to uapi

skl-tplg-interface.h describes firmware format details for Skylake
topology files. It is part of the ABI and should reside in the uapi
directory.

While moving the file, also replace the license boilerplate with
the SPDX License Identifier.

No functional change.

Signed-off-by: Guenter Roeck <groeck@chromium.org>
Signed-off-by: Mark Brown <broonie@kernel.org>
---
 .../uapi/sound}/skl-tplg-interface.h                  | 11 +----------
 sound/soc/intel/skylake/skl-debug.c                   |  2 +-
 sound/soc/intel/skylake/skl-messages.c                |  2 +-
 sound/soc/intel/skylake/skl-topology.c                |  2 +-
 sound/soc/intel/skylake/skl-topology.h                |  2 +-
 5 files changed, 5 insertions(+), 14 deletions(-)
 rename {sound/soc/intel/skylake => include/uapi/sound}/skl-tplg-interface.h (90%)

diff --git a/sound/soc/intel/skylake/skl-tplg-interface.h b/include/uapi/sound/skl-tplg-interface.h
similarity index 90%
rename from sound/soc/intel/skylake/skl-tplg-interface.h
rename to include/uapi/sound/skl-tplg-interface.h
index b0e3d376594c..f58cafa42f18 100644
--- a/sound/soc/intel/skylake/skl-tplg-interface.h
+++ b/include/uapi/sound/skl-tplg-interface.h
@@ -1,19 +1,10 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  * skl-tplg-interface.h - Intel DSP FW private data interface
  *
  * Copyright (C) 2015 Intel Corp
  * Author: Jeeja KP <jeeja.kp@intel.com>
  *	    Nilofer, Samreen <samreen.nilofer@intel.com>
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as version 2, as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
  */
 
 #ifndef __HDA_TPLG_INTERFACE_H__
diff --git a/sound/soc/intel/skylake/skl-debug.c b/sound/soc/intel/skylake/skl-debug.c
index 302b40e63e6c..5d7ac2ee7a3c 100644
--- a/sound/soc/intel/skylake/skl-debug.c
+++ b/sound/soc/intel/skylake/skl-debug.c
@@ -15,10 +15,10 @@
 
 #include <linux/pci.h>
 #include <linux/debugfs.h>
+#include <uapi/sound/skl-tplg-interface.h>
 #include "skl.h"
 #include "skl-sst-dsp.h"
 #include "skl-sst-ipc.h"
-#include "skl-tplg-interface.h"
 #include "skl-topology.h"
 #include "../common/sst-dsp.h"
 #include "../common/sst-dsp-priv.h"
diff --git a/sound/soc/intel/skylake/skl-messages.c b/sound/soc/intel/skylake/skl-messages.c
index dd590a1c58e2..d5f9c30eba32 100644
--- a/sound/soc/intel/skylake/skl-messages.c
+++ b/sound/soc/intel/skylake/skl-messages.c
@@ -21,6 +21,7 @@
 #include <linux/pci.h>
 #include <sound/core.h>
 #include <sound/pcm.h>
+#include <uapi/sound/skl-tplg-interface.h>
 #include "skl-sst-dsp.h"
 #include "cnl-sst-dsp.h"
 #include "skl-sst-ipc.h"
@@ -28,7 +29,6 @@
 #include "../common/sst-dsp.h"
 #include "../common/sst-dsp-priv.h"
 #include "skl-topology.h"
-#include "skl-tplg-interface.h"
 
 static int skl_alloc_dma_buf(struct device *dev,
 		struct snd_dma_buffer *dmab, size_t size)
diff --git a/sound/soc/intel/skylake/skl-topology.c b/sound/soc/intel/skylake/skl-topology.c
index 9e4c2cb88dea..2c5129782959 100644
--- a/sound/soc/intel/skylake/skl-topology.c
+++ b/sound/soc/intel/skylake/skl-topology.c
@@ -23,11 +23,11 @@
 #include <sound/soc.h>
 #include <sound/soc-topology.h>
 #include <uapi/sound/snd_sst_tokens.h>
+#include <uapi/sound/skl-tplg-interface.h>
 #include "skl-sst-dsp.h"
 #include "skl-sst-ipc.h"
 #include "skl-topology.h"
 #include "skl.h"
-#include "skl-tplg-interface.h"
 #include "../common/sst-dsp.h"
 #include "../common/sst-dsp-priv.h"
 
diff --git a/sound/soc/intel/skylake/skl-topology.h b/sound/soc/intel/skylake/skl-topology.h
index b1e0667c0ae0..6d7e0569695f 100644
--- a/sound/soc/intel/skylake/skl-topology.h
+++ b/sound/soc/intel/skylake/skl-topology.h
@@ -25,8 +25,8 @@
 
 #include <sound/hdaudio_ext.h>
 #include <sound/soc.h>
+#include <uapi/sound/skl-tplg-interface.h>
 #include "skl.h"
-#include "skl-tplg-interface.h"
 
 #define BITS_PER_BYTE 8
 #define MAX_TS_GROUPS 8
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 26+ messages in thread

* Applied "ASoC: topology: Move skl-tplg-interface.h to uapi" to the asoc tree
@ 2018-06-01 17:12     ` Mark Brown
  0 siblings, 0 replies; 26+ messages in thread
From: Mark Brown @ 2018-06-01 17:12 UTC (permalink / raw)
  To: Guenter Roeck; +Cc: Mark Brown, Takashi Iwai

The patch

   ASoC: topology: Move skl-tplg-interface.h to uapi

has been applied to the asoc tree at

   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git 

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.  

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark

>From 0c24fdc00244cc08309e397e3783f2943221dc53 Mon Sep 17 00:00:00 2001
From: Guenter Roeck <groeck@chromium.org>
Date: Thu, 24 May 2018 12:49:23 -0700
Subject: [PATCH] ASoC: topology: Move skl-tplg-interface.h to uapi

skl-tplg-interface.h describes firmware format details for Skylake
topology files. It is part of the ABI and should reside in the uapi
directory.

While moving the file, also replace the license boilerplate with
the SPDX License Identifier.

No functional change.

Signed-off-by: Guenter Roeck <groeck@chromium.org>
Signed-off-by: Mark Brown <broonie@kernel.org>
---
 .../uapi/sound}/skl-tplg-interface.h                  | 11 +----------
 sound/soc/intel/skylake/skl-debug.c                   |  2 +-
 sound/soc/intel/skylake/skl-messages.c                |  2 +-
 sound/soc/intel/skylake/skl-topology.c                |  2 +-
 sound/soc/intel/skylake/skl-topology.h                |  2 +-
 5 files changed, 5 insertions(+), 14 deletions(-)
 rename {sound/soc/intel/skylake => include/uapi/sound}/skl-tplg-interface.h (90%)

diff --git a/sound/soc/intel/skylake/skl-tplg-interface.h b/include/uapi/sound/skl-tplg-interface.h
similarity index 90%
rename from sound/soc/intel/skylake/skl-tplg-interface.h
rename to include/uapi/sound/skl-tplg-interface.h
index b0e3d376594c..f58cafa42f18 100644
--- a/sound/soc/intel/skylake/skl-tplg-interface.h
+++ b/include/uapi/sound/skl-tplg-interface.h
@@ -1,19 +1,10 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  * skl-tplg-interface.h - Intel DSP FW private data interface
  *
  * Copyright (C) 2015 Intel Corp
  * Author: Jeeja KP <jeeja.kp@intel.com>
  *	    Nilofer, Samreen <samreen.nilofer@intel.com>
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as version 2, as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
  */
 
 #ifndef __HDA_TPLG_INTERFACE_H__
diff --git a/sound/soc/intel/skylake/skl-debug.c b/sound/soc/intel/skylake/skl-debug.c
index 302b40e63e6c..5d7ac2ee7a3c 100644
--- a/sound/soc/intel/skylake/skl-debug.c
+++ b/sound/soc/intel/skylake/skl-debug.c
@@ -15,10 +15,10 @@
 
 #include <linux/pci.h>
 #include <linux/debugfs.h>
+#include <uapi/sound/skl-tplg-interface.h>
 #include "skl.h"
 #include "skl-sst-dsp.h"
 #include "skl-sst-ipc.h"
-#include "skl-tplg-interface.h"
 #include "skl-topology.h"
 #include "../common/sst-dsp.h"
 #include "../common/sst-dsp-priv.h"
diff --git a/sound/soc/intel/skylake/skl-messages.c b/sound/soc/intel/skylake/skl-messages.c
index dd590a1c58e2..d5f9c30eba32 100644
--- a/sound/soc/intel/skylake/skl-messages.c
+++ b/sound/soc/intel/skylake/skl-messages.c
@@ -21,6 +21,7 @@
 #include <linux/pci.h>
 #include <sound/core.h>
 #include <sound/pcm.h>
+#include <uapi/sound/skl-tplg-interface.h>
 #include "skl-sst-dsp.h"
 #include "cnl-sst-dsp.h"
 #include "skl-sst-ipc.h"
@@ -28,7 +29,6 @@
 #include "../common/sst-dsp.h"
 #include "../common/sst-dsp-priv.h"
 #include "skl-topology.h"
-#include "skl-tplg-interface.h"
 
 static int skl_alloc_dma_buf(struct device *dev,
 		struct snd_dma_buffer *dmab, size_t size)
diff --git a/sound/soc/intel/skylake/skl-topology.c b/sound/soc/intel/skylake/skl-topology.c
index 9e4c2cb88dea..2c5129782959 100644
--- a/sound/soc/intel/skylake/skl-topology.c
+++ b/sound/soc/intel/skylake/skl-topology.c
@@ -23,11 +23,11 @@
 #include <sound/soc.h>
 #include <sound/soc-topology.h>
 #include <uapi/sound/snd_sst_tokens.h>
+#include <uapi/sound/skl-tplg-interface.h>
 #include "skl-sst-dsp.h"
 #include "skl-sst-ipc.h"
 #include "skl-topology.h"
 #include "skl.h"
-#include "skl-tplg-interface.h"
 #include "../common/sst-dsp.h"
 #include "../common/sst-dsp-priv.h"
 
diff --git a/sound/soc/intel/skylake/skl-topology.h b/sound/soc/intel/skylake/skl-topology.h
index b1e0667c0ae0..6d7e0569695f 100644
--- a/sound/soc/intel/skylake/skl-topology.h
+++ b/sound/soc/intel/skylake/skl-topology.h
@@ -25,8 +25,8 @@
 
 #include <sound/hdaudio_ext.h>
 #include <sound/soc.h>
+#include <uapi/sound/skl-tplg-interface.h>
 #include "skl.h"
-#include "skl-tplg-interface.h"
 
 #define BITS_PER_BYTE 8
 #define MAX_TS_GROUPS 8
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 26+ messages in thread

* Applied "ASoC: topology: Move v4 manifest header data structures to uapi" to the asoc tree
  2018-05-24 19:49   ` Guenter Roeck
@ 2018-06-01 17:12     ` Mark Brown
  -1 siblings, 0 replies; 26+ messages in thread
From: Mark Brown @ 2018-06-01 17:12 UTC (permalink / raw)
  To: Guenter Roeck
  Cc: Mark Brown, Takashi Iwai, Mark Brown, Liam Girdwood, alsa-devel,
	Pierre-Louis Bossart, linux-kernel, Chintan Patel, alsa-devel

The patch

   ASoC: topology: Move v4 manifest header data structures to uapi

has been applied to the asoc tree at

   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git 

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.  

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark

>From 348f48220b97130817de4aa2058569133c5cc051 Mon Sep 17 00:00:00 2001
From: Guenter Roeck <groeck@chromium.org>
Date: Thu, 24 May 2018 12:49:22 -0700
Subject: [PATCH] ASoC: topology: Move v4 manifest header data structures to
 uapi

Topology manifest v4 is still part of the ABI. Move its data structures
into the uapi header file.

No functional change.

Signed-off-by: Guenter Roeck <groeck@chromium.org>
Signed-off-by: Mark Brown <broonie@kernel.org>
---
 include/uapi/sound/asoc.h | 57 +++++++++++++++++++++++++++++++++++++++
 sound/soc/soc-topology.c  | 56 --------------------------------------
 2 files changed, 57 insertions(+), 56 deletions(-)

diff --git a/include/uapi/sound/asoc.h b/include/uapi/sound/asoc.h
index b901cdbe532a..a74ca232f1fc 100644
--- a/include/uapi/sound/asoc.h
+++ b/include/uapi/sound/asoc.h
@@ -573,4 +573,61 @@ struct snd_soc_tplg_dai {
 	__le32 flags;           /* SND_SOC_TPLG_DAI_FLGBIT_* */
 	struct snd_soc_tplg_private priv;
 } __attribute__((packed));
+
+/*
+ * Old version of ABI structs, supported for backward compatibility.
+ */
+
+/* Manifest v4 */
+struct snd_soc_tplg_manifest_v4 {
+	__le32 size;		/* in bytes of this structure */
+	__le32 control_elems;	/* number of control elements */
+	__le32 widget_elems;	/* number of widget elements */
+	__le32 graph_elems;	/* number of graph elements */
+	__le32 pcm_elems;	/* number of PCM elements */
+	__le32 dai_link_elems;	/* number of DAI link elements */
+	struct snd_soc_tplg_private priv;
+} __packed;
+
+/* Stream Capabilities v4 */
+struct snd_soc_tplg_stream_caps_v4 {
+	__le32 size;		/* in bytes of this structure */
+	char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+	__le64 formats;	/* supported formats SNDRV_PCM_FMTBIT_* */
+	__le32 rates;		/* supported rates SNDRV_PCM_RATE_* */
+	__le32 rate_min;	/* min rate */
+	__le32 rate_max;	/* max rate */
+	__le32 channels_min;	/* min channels */
+	__le32 channels_max;	/* max channels */
+	__le32 periods_min;	/* min number of periods */
+	__le32 periods_max;	/* max number of periods */
+	__le32 period_size_min;	/* min period size bytes */
+	__le32 period_size_max;	/* max period size bytes */
+	__le32 buffer_size_min;	/* min buffer size bytes */
+	__le32 buffer_size_max;	/* max buffer size bytes */
+} __packed;
+
+/* PCM v4 */
+struct snd_soc_tplg_pcm_v4 {
+	__le32 size;		/* in bytes of this structure */
+	char pcm_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+	char dai_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+	__le32 pcm_id;		/* unique ID - used to match with DAI link */
+	__le32 dai_id;		/* unique ID - used to match */
+	__le32 playback;	/* supports playback mode */
+	__le32 capture;		/* supports capture mode */
+	__le32 compress;	/* 1 = compressed; 0 = PCM */
+	struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* for DAI link */
+	__le32 num_streams;	/* number of streams */
+	struct snd_soc_tplg_stream_caps_v4 caps[2]; /* playback and capture for DAI */
+} __packed;
+
+/* Physical link config v4 */
+struct snd_soc_tplg_link_config_v4 {
+	__le32 size;            /* in bytes of this structure */
+	__le32 id;              /* unique ID - used to match */
+	struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* supported configs playback and captrure */
+	__le32 num_streams;     /* number of streams */
+} __packed;
+
 #endif
diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c
index 3d04fa297677..3fd5d9c867b9 100644
--- a/sound/soc/soc-topology.c
+++ b/sound/soc/soc-topology.c
@@ -54,62 +54,6 @@
 #define SOC_TPLG_PASS_START	SOC_TPLG_PASS_MANIFEST
 #define SOC_TPLG_PASS_END	SOC_TPLG_PASS_LINK
 
-/*
- * Old version of ABI structs, supported for backward compatibility.
- */
-
-/* Manifest v4 */
-struct snd_soc_tplg_manifest_v4 {
-	__le32 size;		/* in bytes of this structure */
-	__le32 control_elems;	/* number of control elements */
-	__le32 widget_elems;	/* number of widget elements */
-	__le32 graph_elems;	/* number of graph elements */
-	__le32 pcm_elems;	/* number of PCM elements */
-	__le32 dai_link_elems;	/* number of DAI link elements */
-	struct snd_soc_tplg_private priv;
-} __packed;
-
-/* Stream Capabilities v4 */
-struct snd_soc_tplg_stream_caps_v4 {
-	__le32 size;		/* in bytes of this structure */
-	char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
-	__le64 formats;	/* supported formats SNDRV_PCM_FMTBIT_* */
-	__le32 rates;		/* supported rates SNDRV_PCM_RATE_* */
-	__le32 rate_min;	/* min rate */
-	__le32 rate_max;	/* max rate */
-	__le32 channels_min;	/* min channels */
-	__le32 channels_max;	/* max channels */
-	__le32 periods_min;	/* min number of periods */
-	__le32 periods_max;	/* max number of periods */
-	__le32 period_size_min;	/* min period size bytes */
-	__le32 period_size_max;	/* max period size bytes */
-	__le32 buffer_size_min;	/* min buffer size bytes */
-	__le32 buffer_size_max;	/* max buffer size bytes */
-} __packed;
-
-/* PCM v4 */
-struct snd_soc_tplg_pcm_v4 {
-	__le32 size;		/* in bytes of this structure */
-	char pcm_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
-	char dai_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
-	__le32 pcm_id;		/* unique ID - used to match with DAI link */
-	__le32 dai_id;		/* unique ID - used to match */
-	__le32 playback;	/* supports playback mode */
-	__le32 capture;		/* supports capture mode */
-	__le32 compress;	/* 1 = compressed; 0 = PCM */
-	struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* for DAI link */
-	__le32 num_streams;	/* number of streams */
-	struct snd_soc_tplg_stream_caps_v4 caps[2]; /* playback and capture for DAI */
-} __packed;
-
-/* Physical link config v4 */
-struct snd_soc_tplg_link_config_v4 {
-	__le32 size;            /* in bytes of this structure */
-	__le32 id;              /* unique ID - used to match */
-	struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* supported configs playback and captrure */
-	__le32 num_streams;     /* number of streams */
-} __packed;
-
 /* topology context */
 struct soc_tplg {
 	const struct firmware *fw;
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 26+ messages in thread

* Applied "ASoC: topology: Move v4 manifest header data structures to uapi" to the asoc tree
@ 2018-06-01 17:12     ` Mark Brown
  0 siblings, 0 replies; 26+ messages in thread
From: Mark Brown @ 2018-06-01 17:12 UTC (permalink / raw)
  To: Guenter Roeck; +Cc: Mark Brown, Takashi Iwai

The patch

   ASoC: topology: Move v4 manifest header data structures to uapi

has been applied to the asoc tree at

   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git 

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.  

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark

>From 348f48220b97130817de4aa2058569133c5cc051 Mon Sep 17 00:00:00 2001
From: Guenter Roeck <groeck@chromium.org>
Date: Thu, 24 May 2018 12:49:22 -0700
Subject: [PATCH] ASoC: topology: Move v4 manifest header data structures to
 uapi

Topology manifest v4 is still part of the ABI. Move its data structures
into the uapi header file.

No functional change.

Signed-off-by: Guenter Roeck <groeck@chromium.org>
Signed-off-by: Mark Brown <broonie@kernel.org>
---
 include/uapi/sound/asoc.h | 57 +++++++++++++++++++++++++++++++++++++++
 sound/soc/soc-topology.c  | 56 --------------------------------------
 2 files changed, 57 insertions(+), 56 deletions(-)

diff --git a/include/uapi/sound/asoc.h b/include/uapi/sound/asoc.h
index b901cdbe532a..a74ca232f1fc 100644
--- a/include/uapi/sound/asoc.h
+++ b/include/uapi/sound/asoc.h
@@ -573,4 +573,61 @@ struct snd_soc_tplg_dai {
 	__le32 flags;           /* SND_SOC_TPLG_DAI_FLGBIT_* */
 	struct snd_soc_tplg_private priv;
 } __attribute__((packed));
+
+/*
+ * Old version of ABI structs, supported for backward compatibility.
+ */
+
+/* Manifest v4 */
+struct snd_soc_tplg_manifest_v4 {
+	__le32 size;		/* in bytes of this structure */
+	__le32 control_elems;	/* number of control elements */
+	__le32 widget_elems;	/* number of widget elements */
+	__le32 graph_elems;	/* number of graph elements */
+	__le32 pcm_elems;	/* number of PCM elements */
+	__le32 dai_link_elems;	/* number of DAI link elements */
+	struct snd_soc_tplg_private priv;
+} __packed;
+
+/* Stream Capabilities v4 */
+struct snd_soc_tplg_stream_caps_v4 {
+	__le32 size;		/* in bytes of this structure */
+	char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+	__le64 formats;	/* supported formats SNDRV_PCM_FMTBIT_* */
+	__le32 rates;		/* supported rates SNDRV_PCM_RATE_* */
+	__le32 rate_min;	/* min rate */
+	__le32 rate_max;	/* max rate */
+	__le32 channels_min;	/* min channels */
+	__le32 channels_max;	/* max channels */
+	__le32 periods_min;	/* min number of periods */
+	__le32 periods_max;	/* max number of periods */
+	__le32 period_size_min;	/* min period size bytes */
+	__le32 period_size_max;	/* max period size bytes */
+	__le32 buffer_size_min;	/* min buffer size bytes */
+	__le32 buffer_size_max;	/* max buffer size bytes */
+} __packed;
+
+/* PCM v4 */
+struct snd_soc_tplg_pcm_v4 {
+	__le32 size;		/* in bytes of this structure */
+	char pcm_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+	char dai_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+	__le32 pcm_id;		/* unique ID - used to match with DAI link */
+	__le32 dai_id;		/* unique ID - used to match */
+	__le32 playback;	/* supports playback mode */
+	__le32 capture;		/* supports capture mode */
+	__le32 compress;	/* 1 = compressed; 0 = PCM */
+	struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* for DAI link */
+	__le32 num_streams;	/* number of streams */
+	struct snd_soc_tplg_stream_caps_v4 caps[2]; /* playback and capture for DAI */
+} __packed;
+
+/* Physical link config v4 */
+struct snd_soc_tplg_link_config_v4 {
+	__le32 size;            /* in bytes of this structure */
+	__le32 id;              /* unique ID - used to match */
+	struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* supported configs playback and captrure */
+	__le32 num_streams;     /* number of streams */
+} __packed;
+
 #endif
diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c
index 3d04fa297677..3fd5d9c867b9 100644
--- a/sound/soc/soc-topology.c
+++ b/sound/soc/soc-topology.c
@@ -54,62 +54,6 @@
 #define SOC_TPLG_PASS_START	SOC_TPLG_PASS_MANIFEST
 #define SOC_TPLG_PASS_END	SOC_TPLG_PASS_LINK
 
-/*
- * Old version of ABI structs, supported for backward compatibility.
- */
-
-/* Manifest v4 */
-struct snd_soc_tplg_manifest_v4 {
-	__le32 size;		/* in bytes of this structure */
-	__le32 control_elems;	/* number of control elements */
-	__le32 widget_elems;	/* number of widget elements */
-	__le32 graph_elems;	/* number of graph elements */
-	__le32 pcm_elems;	/* number of PCM elements */
-	__le32 dai_link_elems;	/* number of DAI link elements */
-	struct snd_soc_tplg_private priv;
-} __packed;
-
-/* Stream Capabilities v4 */
-struct snd_soc_tplg_stream_caps_v4 {
-	__le32 size;		/* in bytes of this structure */
-	char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
-	__le64 formats;	/* supported formats SNDRV_PCM_FMTBIT_* */
-	__le32 rates;		/* supported rates SNDRV_PCM_RATE_* */
-	__le32 rate_min;	/* min rate */
-	__le32 rate_max;	/* max rate */
-	__le32 channels_min;	/* min channels */
-	__le32 channels_max;	/* max channels */
-	__le32 periods_min;	/* min number of periods */
-	__le32 periods_max;	/* max number of periods */
-	__le32 period_size_min;	/* min period size bytes */
-	__le32 period_size_max;	/* max period size bytes */
-	__le32 buffer_size_min;	/* min buffer size bytes */
-	__le32 buffer_size_max;	/* max buffer size bytes */
-} __packed;
-
-/* PCM v4 */
-struct snd_soc_tplg_pcm_v4 {
-	__le32 size;		/* in bytes of this structure */
-	char pcm_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
-	char dai_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
-	__le32 pcm_id;		/* unique ID - used to match with DAI link */
-	__le32 dai_id;		/* unique ID - used to match */
-	__le32 playback;	/* supports playback mode */
-	__le32 capture;		/* supports capture mode */
-	__le32 compress;	/* 1 = compressed; 0 = PCM */
-	struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* for DAI link */
-	__le32 num_streams;	/* number of streams */
-	struct snd_soc_tplg_stream_caps_v4 caps[2]; /* playback and capture for DAI */
-} __packed;
-
-/* Physical link config v4 */
-struct snd_soc_tplg_link_config_v4 {
-	__le32 size;            /* in bytes of this structure */
-	__le32 id;              /* unique ID - used to match */
-	struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* supported configs playback and captrure */
-	__le32 num_streams;     /* number of streams */
-} __packed;
-
 /* topology context */
 struct soc_tplg {
 	const struct firmware *fw;
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 26+ messages in thread

* Applied "ASoC: topology: Improve backwards compatibility with v4 topology files" to the asoc tree
  2018-05-24 19:49 ` Guenter Roeck
@ 2018-06-01 17:12   ` Mark Brown
  -1 siblings, 0 replies; 26+ messages in thread
From: Mark Brown @ 2018-06-01 17:12 UTC (permalink / raw)
  To: Guenter Roeck
  Cc: Mark Brown, Takashi Iwai, Mark Brown, Liam Girdwood, alsa-devel,
	Pierre-Louis Bossart, linux-kernel, Chintan Patel, alsa-devel

The patch

   ASoC: topology: Improve backwards compatibility with v4 topology files

has been applied to the asoc tree at

   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git 

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.  

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark

>From ac9391daac004e12dc4e4c62e130b09f245ece2b Mon Sep 17 00:00:00 2001
From: Guenter Roeck <groeck@chromium.org>
Date: Thu, 24 May 2018 12:49:21 -0700
Subject: [PATCH] ASoC: topology: Improve backwards compatibility with v4
 topology files

Commit dc31e741db49 ("ASoC: topology: ABI - Add the types for BE
DAI") introduced sound topology files version 5. Initially, this
change made the topology code incompatible with v4 topology files.
Backwards compatibility with v4 configuration files was
subsequently added with commit 288b8da7e992 ("ASoC: topology:
Support topology file of ABI v4").

Unfortunately, backwards compatibility was never fully implemented.

First, the manifest size in (Skylake) v4 configuration files is set
to 0, which causes manifest_new_ver() to bail out with error messages
similar to the following.

snd_soc_skl 0000:00:1f.3: ASoC: invalid manifest size
snd_soc_skl 0000:00:1f.3: tplg component load failed-22
snd_soc_skl 0000:00:1f.3: Failed to init topology!
snd_soc_skl 0000:00:1f.3: ASoC: failed to probe component -22
skl_n88l25_m98357a skl_n88l25_m98357a: ASoC: failed to instantiate card -22
skl_n88l25_m98357a: probe of skl_n88l25_m98357a failed with error -22

After this problem is fixed, the following error message is seen instead.

snd_soc_skl 0000:00:1f.3: ASoC: old version of manifest
snd_soc_skl 0000:00:1f.3: Invalid descriptor token 1093938482
snd_soc_skl 0000:00:1f.3: ASoC: failed to load widget media0_in cpr 0
snd_soc_skl 0000:00:1f.3: tPlg component load failed-22

This message is seen because backwards compatibility for loading widgets
was never implemented.

The lack of audio support when running the upstream kernel on recent
Chromebooks has been reported in various forums, and can be traced back
to this problem. Attempts to fix the problem, usually by providing v5
configuration files, were only partially successful.

Let's implement backward compatibility properly to solve the problem
for good.

Signed-off-by: Guenter Roeck <groeck@chromium.org>
Signed-off-by: Mark Brown <broonie@kernel.org>
---
 sound/soc/intel/skylake/skl-topology.c       | 169 +++++++++++++++++++
 sound/soc/intel/skylake/skl-tplg-interface.h |  74 ++++++++
 sound/soc/soc-topology.c                     |   7 +-
 3 files changed, 248 insertions(+), 2 deletions(-)

diff --git a/sound/soc/intel/skylake/skl-topology.c b/sound/soc/intel/skylake/skl-topology.c
index 3b1dca419883..9e4c2cb88dea 100644
--- a/sound/soc/intel/skylake/skl-topology.c
+++ b/sound/soc/intel/skylake/skl-topology.c
@@ -19,6 +19,7 @@
 #include <linux/slab.h>
 #include <linux/types.h>
 #include <linux/firmware.h>
+#include <linux/uuid.h>
 #include <sound/soc.h>
 #include <sound/soc-topology.h>
 #include <uapi/sound/snd_sst_tokens.h>
@@ -2724,6 +2725,167 @@ static int skl_tplg_get_desc_blocks(struct device *dev,
 	return -EINVAL;
 }
 
+/* Functions to parse private data from configuration file format v4 */
+
+/*
+ * Add pipeline from topology binary into driver pipeline list
+ *
+ * If already added we return that instance
+ * Otherwise we create a new instance and add into driver list
+ */
+static int skl_tplg_add_pipe_v4(struct device *dev,
+				struct skl_module_cfg *mconfig, struct skl *skl,
+				struct skl_dfw_v4_pipe *dfw_pipe)
+{
+	struct skl_pipeline *ppl;
+	struct skl_pipe *pipe;
+	struct skl_pipe_params *params;
+
+	list_for_each_entry(ppl, &skl->ppl_list, node) {
+		if (ppl->pipe->ppl_id == dfw_pipe->pipe_id) {
+			mconfig->pipe = ppl->pipe;
+			return 0;
+		}
+	}
+
+	ppl = devm_kzalloc(dev, sizeof(*ppl), GFP_KERNEL);
+	if (!ppl)
+		return -ENOMEM;
+
+	pipe = devm_kzalloc(dev, sizeof(*pipe), GFP_KERNEL);
+	if (!pipe)
+		return -ENOMEM;
+
+	params = devm_kzalloc(dev, sizeof(*params), GFP_KERNEL);
+	if (!params)
+		return -ENOMEM;
+
+	pipe->ppl_id = dfw_pipe->pipe_id;
+	pipe->memory_pages = dfw_pipe->memory_pages;
+	pipe->pipe_priority = dfw_pipe->pipe_priority;
+	pipe->conn_type = dfw_pipe->conn_type;
+	pipe->state = SKL_PIPE_INVALID;
+	pipe->p_params = params;
+	INIT_LIST_HEAD(&pipe->w_list);
+
+	ppl->pipe = pipe;
+	list_add(&ppl->node, &skl->ppl_list);
+
+	mconfig->pipe = pipe;
+
+	return 0;
+}
+
+static void skl_fill_module_pin_info_v4(struct skl_dfw_v4_module_pin *dfw_pin,
+					struct skl_module_pin *m_pin,
+					bool is_dynamic, int max_pin)
+{
+	int i;
+
+	for (i = 0; i < max_pin; i++) {
+		m_pin[i].id.module_id = dfw_pin[i].module_id;
+		m_pin[i].id.instance_id = dfw_pin[i].instance_id;
+		m_pin[i].in_use = false;
+		m_pin[i].is_dynamic = is_dynamic;
+		m_pin[i].pin_state = SKL_PIN_UNBIND;
+	}
+}
+
+static void skl_tplg_fill_fmt_v4(struct skl_module_pin_fmt *dst_fmt,
+				 struct skl_dfw_v4_module_fmt *src_fmt,
+				 int pins)
+{
+	int i;
+
+	for (i = 0; i < pins; i++) {
+		dst_fmt[i].fmt.channels  = src_fmt[i].channels;
+		dst_fmt[i].fmt.s_freq = src_fmt[i].freq;
+		dst_fmt[i].fmt.bit_depth = src_fmt[i].bit_depth;
+		dst_fmt[i].fmt.valid_bit_depth = src_fmt[i].valid_bit_depth;
+		dst_fmt[i].fmt.ch_cfg = src_fmt[i].ch_cfg;
+		dst_fmt[i].fmt.ch_map = src_fmt[i].ch_map;
+		dst_fmt[i].fmt.interleaving_style =
+						src_fmt[i].interleaving_style;
+		dst_fmt[i].fmt.sample_type = src_fmt[i].sample_type;
+	}
+}
+
+static int skl_tplg_get_pvt_data_v4(struct snd_soc_tplg_dapm_widget *tplg_w,
+				    struct skl *skl, struct device *dev,
+				    struct skl_module_cfg *mconfig)
+{
+	struct skl_dfw_v4_module *dfw =
+				(struct skl_dfw_v4_module *)tplg_w->priv.data;
+	int ret;
+
+	dev_dbg(dev, "Parsing Skylake v4 widget topology data\n");
+
+	ret = guid_parse(dfw->uuid, (guid_t *)mconfig->guid);
+	if (ret)
+		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].ibs = dfw->ibs;
+	mconfig->module->resources[0].obs = dfw->obs;
+	mconfig->core_id = dfw->core_id;
+	mconfig->module->max_input_pins = dfw->max_in_queue;
+	mconfig->module->max_output_pins = dfw->max_out_queue;
+	mconfig->module->loadable = dfw->is_loadable;
+	skl_tplg_fill_fmt_v4(mconfig->module->formats[0].inputs, dfw->in_fmt,
+			     MAX_IN_QUEUE);
+	skl_tplg_fill_fmt_v4(mconfig->module->formats[0].outputs, dfw->out_fmt,
+			     MAX_OUT_QUEUE);
+
+	mconfig->params_fixup = dfw->params_fixup;
+	mconfig->converter = dfw->converter;
+	mconfig->m_type = dfw->module_type;
+	mconfig->vbus_id = dfw->vbus_id;
+	mconfig->module->resources[0].is_pages = dfw->mem_pages;
+
+	ret = skl_tplg_add_pipe_v4(dev, mconfig, skl, &dfw->pipe);
+	if (ret)
+		return ret;
+
+	mconfig->dev_type = dfw->dev_type;
+	mconfig->hw_conn_type = dfw->hw_conn_type;
+	mconfig->time_slot = dfw->time_slot;
+	mconfig->formats_config.caps_size = dfw->caps.caps_size;
+
+	mconfig->m_in_pin = devm_kzalloc(dev,
+				MAX_IN_QUEUE * sizeof(*mconfig->m_in_pin),
+				GFP_KERNEL);
+	if (!mconfig->m_in_pin)
+		return -ENOMEM;
+
+	mconfig->m_out_pin = devm_kzalloc(dev,
+				MAX_OUT_QUEUE * sizeof(*mconfig->m_out_pin),
+				GFP_KERNEL);
+	if (!mconfig->m_out_pin)
+		return -ENOMEM;
+
+	skl_fill_module_pin_info_v4(dfw->in_pin, mconfig->m_in_pin,
+				    dfw->is_dynamic_in_pin,
+				    mconfig->module->max_input_pins);
+	skl_fill_module_pin_info_v4(dfw->out_pin, mconfig->m_out_pin,
+				    dfw->is_dynamic_out_pin,
+				    mconfig->module->max_output_pins);
+
+	if (mconfig->formats_config.caps_size) {
+		mconfig->formats_config.set_params = dfw->caps.set_params;
+		mconfig->formats_config.param_id = dfw->caps.param_id;
+		mconfig->formats_config.caps =
+		devm_kzalloc(dev, mconfig->formats_config.caps_size,
+			     GFP_KERNEL);
+		if (!mconfig->formats_config.caps)
+			return -ENOMEM;
+		memcpy(mconfig->formats_config.caps, dfw->caps.caps,
+		       dfw->caps.caps_size);
+	}
+
+	return 0;
+}
+
 /*
  * Parse the private data for the token and corresponding value.
  * The private data can have multiple data blocks. So, a data block
@@ -2739,6 +2901,13 @@ static int skl_tplg_get_pvt_data(struct snd_soc_tplg_dapm_widget *tplg_w,
 	char *data;
 	int ret;
 
+	/*
+	 * v4 configuration files have a valid UUID at the start of
+	 * the widget's private data.
+	 */
+	if (uuid_is_valid((char *)tplg_w->priv.data))
+		return skl_tplg_get_pvt_data_v4(tplg_w, skl, dev, mconfig);
+
 	/* Read the NUM_DATA_BLOCKS descriptor */
 	array = (struct snd_soc_tplg_vendor_array *)tplg_w->priv.data;
 	ret = skl_tplg_get_desc_blocks(dev, array);
diff --git a/sound/soc/intel/skylake/skl-tplg-interface.h b/sound/soc/intel/skylake/skl-tplg-interface.h
index f8d1749a2e0c..b0e3d376594c 100644
--- a/sound/soc/intel/skylake/skl-tplg-interface.h
+++ b/sound/soc/intel/skylake/skl-tplg-interface.h
@@ -169,4 +169,78 @@ enum skl_tuple_type {
 	SKL_TYPE_DATA
 };
 
+/* v4 configuration data */
+
+struct skl_dfw_v4_module_pin {
+	u16 module_id;
+	u16 instance_id;
+} __packed;
+
+struct skl_dfw_v4_module_fmt {
+	u32 channels;
+	u32 freq;
+	u32 bit_depth;
+	u32 valid_bit_depth;
+	u32 ch_cfg;
+	u32 interleaving_style;
+	u32 sample_type;
+	u32 ch_map;
+} __packed;
+
+struct skl_dfw_v4_module_caps {
+	u32 set_params:2;
+	u32 rsvd:30;
+	u32 param_id;
+	u32 caps_size;
+	u32 caps[HDA_SST_CFG_MAX];
+} __packed;
+
+struct skl_dfw_v4_pipe {
+	u8 pipe_id;
+	u8 pipe_priority;
+	u16 conn_type:4;
+	u16 rsvd:4;
+	u16 memory_pages:8;
+} __packed;
+
+struct skl_dfw_v4_module {
+	char uuid[SKL_UUID_STR_SZ];
+
+	u16 module_id;
+	u16 instance_id;
+	u32 max_mcps;
+	u32 mem_pages;
+	u32 obs;
+	u32 ibs;
+	u32 vbus_id;
+
+	u32 max_in_queue:8;
+	u32 max_out_queue:8;
+	u32 time_slot:8;
+	u32 core_id:4;
+	u32 rsvd1:4;
+
+	u32 module_type:8;
+	u32 conn_type:4;
+	u32 dev_type:4;
+	u32 hw_conn_type:4;
+	u32 rsvd2:12;
+
+	u32 params_fixup:8;
+	u32 converter:8;
+	u32 input_pin_type:1;
+	u32 output_pin_type:1;
+	u32 is_dynamic_in_pin:1;
+	u32 is_dynamic_out_pin:1;
+	u32 is_loadable:1;
+	u32 rsvd3:11;
+
+	struct skl_dfw_v4_pipe pipe;
+	struct skl_dfw_v4_module_fmt in_fmt[MAX_IN_QUEUE];
+	struct skl_dfw_v4_module_fmt out_fmt[MAX_OUT_QUEUE];
+	struct skl_dfw_v4_module_pin in_pin[MAX_IN_QUEUE];
+	struct skl_dfw_v4_module_pin out_pin[MAX_OUT_QUEUE];
+	struct skl_dfw_v4_module_caps caps;
+} __packed;
+
 #endif
diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c
index f25ea9aab235..3d04fa297677 100644
--- a/sound/soc/soc-topology.c
+++ b/sound/soc/soc-topology.c
@@ -2313,8 +2313,11 @@ static int manifest_new_ver(struct soc_tplg *tplg,
 	*manifest = NULL;
 
 	if (src->size != sizeof(*src_v4)) {
-		dev_err(tplg->dev, "ASoC: invalid manifest size\n");
-		return -EINVAL;
+		dev_warn(tplg->dev, "ASoC: invalid manifest size %d\n",
+			 src->size);
+		if (src->size)
+			return -EINVAL;
+		src->size = sizeof(*src_v4);
 	}
 
 	dev_warn(tplg->dev, "ASoC: old version of manifest\n");
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 26+ messages in thread

* Applied "ASoC: topology: Improve backwards compatibility with v4 topology files" to the asoc tree
@ 2018-06-01 17:12   ` Mark Brown
  0 siblings, 0 replies; 26+ messages in thread
From: Mark Brown @ 2018-06-01 17:12 UTC (permalink / raw)
  To: Guenter Roeck; +Cc: Mark Brown, Takashi Iwai

The patch

   ASoC: topology: Improve backwards compatibility with v4 topology files

has been applied to the asoc tree at

   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git 

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.  

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark

>From ac9391daac004e12dc4e4c62e130b09f245ece2b Mon Sep 17 00:00:00 2001
From: Guenter Roeck <groeck@chromium.org>
Date: Thu, 24 May 2018 12:49:21 -0700
Subject: [PATCH] ASoC: topology: Improve backwards compatibility with v4
 topology files

Commit dc31e741db49 ("ASoC: topology: ABI - Add the types for BE
DAI") introduced sound topology files version 5. Initially, this
change made the topology code incompatible with v4 topology files.
Backwards compatibility with v4 configuration files was
subsequently added with commit 288b8da7e992 ("ASoC: topology:
Support topology file of ABI v4").

Unfortunately, backwards compatibility was never fully implemented.

First, the manifest size in (Skylake) v4 configuration files is set
to 0, which causes manifest_new_ver() to bail out with error messages
similar to the following.

snd_soc_skl 0000:00:1f.3: ASoC: invalid manifest size
snd_soc_skl 0000:00:1f.3: tplg component load failed-22
snd_soc_skl 0000:00:1f.3: Failed to init topology!
snd_soc_skl 0000:00:1f.3: ASoC: failed to probe component -22
skl_n88l25_m98357a skl_n88l25_m98357a: ASoC: failed to instantiate card -22
skl_n88l25_m98357a: probe of skl_n88l25_m98357a failed with error -22

After this problem is fixed, the following error message is seen instead.

snd_soc_skl 0000:00:1f.3: ASoC: old version of manifest
snd_soc_skl 0000:00:1f.3: Invalid descriptor token 1093938482
snd_soc_skl 0000:00:1f.3: ASoC: failed to load widget media0_in cpr 0
snd_soc_skl 0000:00:1f.3: tPlg component load failed-22

This message is seen because backwards compatibility for loading widgets
was never implemented.

The lack of audio support when running the upstream kernel on recent
Chromebooks has been reported in various forums, and can be traced back
to this problem. Attempts to fix the problem, usually by providing v5
configuration files, were only partially successful.

Let's implement backward compatibility properly to solve the problem
for good.

Signed-off-by: Guenter Roeck <groeck@chromium.org>
Signed-off-by: Mark Brown <broonie@kernel.org>
---
 sound/soc/intel/skylake/skl-topology.c       | 169 +++++++++++++++++++
 sound/soc/intel/skylake/skl-tplg-interface.h |  74 ++++++++
 sound/soc/soc-topology.c                     |   7 +-
 3 files changed, 248 insertions(+), 2 deletions(-)

diff --git a/sound/soc/intel/skylake/skl-topology.c b/sound/soc/intel/skylake/skl-topology.c
index 3b1dca419883..9e4c2cb88dea 100644
--- a/sound/soc/intel/skylake/skl-topology.c
+++ b/sound/soc/intel/skylake/skl-topology.c
@@ -19,6 +19,7 @@
 #include <linux/slab.h>
 #include <linux/types.h>
 #include <linux/firmware.h>
+#include <linux/uuid.h>
 #include <sound/soc.h>
 #include <sound/soc-topology.h>
 #include <uapi/sound/snd_sst_tokens.h>
@@ -2724,6 +2725,167 @@ static int skl_tplg_get_desc_blocks(struct device *dev,
 	return -EINVAL;
 }
 
+/* Functions to parse private data from configuration file format v4 */
+
+/*
+ * Add pipeline from topology binary into driver pipeline list
+ *
+ * If already added we return that instance
+ * Otherwise we create a new instance and add into driver list
+ */
+static int skl_tplg_add_pipe_v4(struct device *dev,
+				struct skl_module_cfg *mconfig, struct skl *skl,
+				struct skl_dfw_v4_pipe *dfw_pipe)
+{
+	struct skl_pipeline *ppl;
+	struct skl_pipe *pipe;
+	struct skl_pipe_params *params;
+
+	list_for_each_entry(ppl, &skl->ppl_list, node) {
+		if (ppl->pipe->ppl_id == dfw_pipe->pipe_id) {
+			mconfig->pipe = ppl->pipe;
+			return 0;
+		}
+	}
+
+	ppl = devm_kzalloc(dev, sizeof(*ppl), GFP_KERNEL);
+	if (!ppl)
+		return -ENOMEM;
+
+	pipe = devm_kzalloc(dev, sizeof(*pipe), GFP_KERNEL);
+	if (!pipe)
+		return -ENOMEM;
+
+	params = devm_kzalloc(dev, sizeof(*params), GFP_KERNEL);
+	if (!params)
+		return -ENOMEM;
+
+	pipe->ppl_id = dfw_pipe->pipe_id;
+	pipe->memory_pages = dfw_pipe->memory_pages;
+	pipe->pipe_priority = dfw_pipe->pipe_priority;
+	pipe->conn_type = dfw_pipe->conn_type;
+	pipe->state = SKL_PIPE_INVALID;
+	pipe->p_params = params;
+	INIT_LIST_HEAD(&pipe->w_list);
+
+	ppl->pipe = pipe;
+	list_add(&ppl->node, &skl->ppl_list);
+
+	mconfig->pipe = pipe;
+
+	return 0;
+}
+
+static void skl_fill_module_pin_info_v4(struct skl_dfw_v4_module_pin *dfw_pin,
+					struct skl_module_pin *m_pin,
+					bool is_dynamic, int max_pin)
+{
+	int i;
+
+	for (i = 0; i < max_pin; i++) {
+		m_pin[i].id.module_id = dfw_pin[i].module_id;
+		m_pin[i].id.instance_id = dfw_pin[i].instance_id;
+		m_pin[i].in_use = false;
+		m_pin[i].is_dynamic = is_dynamic;
+		m_pin[i].pin_state = SKL_PIN_UNBIND;
+	}
+}
+
+static void skl_tplg_fill_fmt_v4(struct skl_module_pin_fmt *dst_fmt,
+				 struct skl_dfw_v4_module_fmt *src_fmt,
+				 int pins)
+{
+	int i;
+
+	for (i = 0; i < pins; i++) {
+		dst_fmt[i].fmt.channels  = src_fmt[i].channels;
+		dst_fmt[i].fmt.s_freq = src_fmt[i].freq;
+		dst_fmt[i].fmt.bit_depth = src_fmt[i].bit_depth;
+		dst_fmt[i].fmt.valid_bit_depth = src_fmt[i].valid_bit_depth;
+		dst_fmt[i].fmt.ch_cfg = src_fmt[i].ch_cfg;
+		dst_fmt[i].fmt.ch_map = src_fmt[i].ch_map;
+		dst_fmt[i].fmt.interleaving_style =
+						src_fmt[i].interleaving_style;
+		dst_fmt[i].fmt.sample_type = src_fmt[i].sample_type;
+	}
+}
+
+static int skl_tplg_get_pvt_data_v4(struct snd_soc_tplg_dapm_widget *tplg_w,
+				    struct skl *skl, struct device *dev,
+				    struct skl_module_cfg *mconfig)
+{
+	struct skl_dfw_v4_module *dfw =
+				(struct skl_dfw_v4_module *)tplg_w->priv.data;
+	int ret;
+
+	dev_dbg(dev, "Parsing Skylake v4 widget topology data\n");
+
+	ret = guid_parse(dfw->uuid, (guid_t *)mconfig->guid);
+	if (ret)
+		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].ibs = dfw->ibs;
+	mconfig->module->resources[0].obs = dfw->obs;
+	mconfig->core_id = dfw->core_id;
+	mconfig->module->max_input_pins = dfw->max_in_queue;
+	mconfig->module->max_output_pins = dfw->max_out_queue;
+	mconfig->module->loadable = dfw->is_loadable;
+	skl_tplg_fill_fmt_v4(mconfig->module->formats[0].inputs, dfw->in_fmt,
+			     MAX_IN_QUEUE);
+	skl_tplg_fill_fmt_v4(mconfig->module->formats[0].outputs, dfw->out_fmt,
+			     MAX_OUT_QUEUE);
+
+	mconfig->params_fixup = dfw->params_fixup;
+	mconfig->converter = dfw->converter;
+	mconfig->m_type = dfw->module_type;
+	mconfig->vbus_id = dfw->vbus_id;
+	mconfig->module->resources[0].is_pages = dfw->mem_pages;
+
+	ret = skl_tplg_add_pipe_v4(dev, mconfig, skl, &dfw->pipe);
+	if (ret)
+		return ret;
+
+	mconfig->dev_type = dfw->dev_type;
+	mconfig->hw_conn_type = dfw->hw_conn_type;
+	mconfig->time_slot = dfw->time_slot;
+	mconfig->formats_config.caps_size = dfw->caps.caps_size;
+
+	mconfig->m_in_pin = devm_kzalloc(dev,
+				MAX_IN_QUEUE * sizeof(*mconfig->m_in_pin),
+				GFP_KERNEL);
+	if (!mconfig->m_in_pin)
+		return -ENOMEM;
+
+	mconfig->m_out_pin = devm_kzalloc(dev,
+				MAX_OUT_QUEUE * sizeof(*mconfig->m_out_pin),
+				GFP_KERNEL);
+	if (!mconfig->m_out_pin)
+		return -ENOMEM;
+
+	skl_fill_module_pin_info_v4(dfw->in_pin, mconfig->m_in_pin,
+				    dfw->is_dynamic_in_pin,
+				    mconfig->module->max_input_pins);
+	skl_fill_module_pin_info_v4(dfw->out_pin, mconfig->m_out_pin,
+				    dfw->is_dynamic_out_pin,
+				    mconfig->module->max_output_pins);
+
+	if (mconfig->formats_config.caps_size) {
+		mconfig->formats_config.set_params = dfw->caps.set_params;
+		mconfig->formats_config.param_id = dfw->caps.param_id;
+		mconfig->formats_config.caps =
+		devm_kzalloc(dev, mconfig->formats_config.caps_size,
+			     GFP_KERNEL);
+		if (!mconfig->formats_config.caps)
+			return -ENOMEM;
+		memcpy(mconfig->formats_config.caps, dfw->caps.caps,
+		       dfw->caps.caps_size);
+	}
+
+	return 0;
+}
+
 /*
  * Parse the private data for the token and corresponding value.
  * The private data can have multiple data blocks. So, a data block
@@ -2739,6 +2901,13 @@ static int skl_tplg_get_pvt_data(struct snd_soc_tplg_dapm_widget *tplg_w,
 	char *data;
 	int ret;
 
+	/*
+	 * v4 configuration files have a valid UUID at the start of
+	 * the widget's private data.
+	 */
+	if (uuid_is_valid((char *)tplg_w->priv.data))
+		return skl_tplg_get_pvt_data_v4(tplg_w, skl, dev, mconfig);
+
 	/* Read the NUM_DATA_BLOCKS descriptor */
 	array = (struct snd_soc_tplg_vendor_array *)tplg_w->priv.data;
 	ret = skl_tplg_get_desc_blocks(dev, array);
diff --git a/sound/soc/intel/skylake/skl-tplg-interface.h b/sound/soc/intel/skylake/skl-tplg-interface.h
index f8d1749a2e0c..b0e3d376594c 100644
--- a/sound/soc/intel/skylake/skl-tplg-interface.h
+++ b/sound/soc/intel/skylake/skl-tplg-interface.h
@@ -169,4 +169,78 @@ enum skl_tuple_type {
 	SKL_TYPE_DATA
 };
 
+/* v4 configuration data */
+
+struct skl_dfw_v4_module_pin {
+	u16 module_id;
+	u16 instance_id;
+} __packed;
+
+struct skl_dfw_v4_module_fmt {
+	u32 channels;
+	u32 freq;
+	u32 bit_depth;
+	u32 valid_bit_depth;
+	u32 ch_cfg;
+	u32 interleaving_style;
+	u32 sample_type;
+	u32 ch_map;
+} __packed;
+
+struct skl_dfw_v4_module_caps {
+	u32 set_params:2;
+	u32 rsvd:30;
+	u32 param_id;
+	u32 caps_size;
+	u32 caps[HDA_SST_CFG_MAX];
+} __packed;
+
+struct skl_dfw_v4_pipe {
+	u8 pipe_id;
+	u8 pipe_priority;
+	u16 conn_type:4;
+	u16 rsvd:4;
+	u16 memory_pages:8;
+} __packed;
+
+struct skl_dfw_v4_module {
+	char uuid[SKL_UUID_STR_SZ];
+
+	u16 module_id;
+	u16 instance_id;
+	u32 max_mcps;
+	u32 mem_pages;
+	u32 obs;
+	u32 ibs;
+	u32 vbus_id;
+
+	u32 max_in_queue:8;
+	u32 max_out_queue:8;
+	u32 time_slot:8;
+	u32 core_id:4;
+	u32 rsvd1:4;
+
+	u32 module_type:8;
+	u32 conn_type:4;
+	u32 dev_type:4;
+	u32 hw_conn_type:4;
+	u32 rsvd2:12;
+
+	u32 params_fixup:8;
+	u32 converter:8;
+	u32 input_pin_type:1;
+	u32 output_pin_type:1;
+	u32 is_dynamic_in_pin:1;
+	u32 is_dynamic_out_pin:1;
+	u32 is_loadable:1;
+	u32 rsvd3:11;
+
+	struct skl_dfw_v4_pipe pipe;
+	struct skl_dfw_v4_module_fmt in_fmt[MAX_IN_QUEUE];
+	struct skl_dfw_v4_module_fmt out_fmt[MAX_OUT_QUEUE];
+	struct skl_dfw_v4_module_pin in_pin[MAX_IN_QUEUE];
+	struct skl_dfw_v4_module_pin out_pin[MAX_OUT_QUEUE];
+	struct skl_dfw_v4_module_caps caps;
+} __packed;
+
 #endif
diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c
index f25ea9aab235..3d04fa297677 100644
--- a/sound/soc/soc-topology.c
+++ b/sound/soc/soc-topology.c
@@ -2313,8 +2313,11 @@ static int manifest_new_ver(struct soc_tplg *tplg,
 	*manifest = NULL;
 
 	if (src->size != sizeof(*src_v4)) {
-		dev_err(tplg->dev, "ASoC: invalid manifest size\n");
-		return -EINVAL;
+		dev_warn(tplg->dev, "ASoC: invalid manifest size %d\n",
+			 src->size);
+		if (src->size)
+			return -EINVAL;
+		src->size = sizeof(*src_v4);
 	}
 
 	dev_warn(tplg->dev, "ASoC: old version of manifest\n");
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 26+ messages in thread

* Re: [alsa-devel] [PATCH v2 1/3] ASoC: topology: Improve backwards compatibility with v4 topology files
  2018-06-01 17:08         ` Mark Brown
  (?)
@ 2018-06-06 20:29         ` Pierre-Louis Bossart
  -1 siblings, 0 replies; 26+ messages in thread
From: Pierre-Louis Bossart @ 2018-06-06 20:29 UTC (permalink / raw)
  To: Mark Brown
  Cc: alsa-devel, Takashi Iwai, linux-kernel, Liam Girdwood,
	Chintan Patel, Guenter Roeck, Guenter Roeck



On 06/01/2018 12:08 PM, Mark Brown wrote:
> On Fri, Jun 01, 2018 at 10:19:58AM -0500, Pierre-Louis Bossart wrote:
>
>> I wanted to ack this patch but the Intel validation folks asked for a couple
>> of days to finish their tests on a variety of Chromebooks (e.g. Lars) and
>> double-check which models used the v4 topology. There is an internal thread
>> on all this which remains active. I don't think the feedback will be delayed
>> beyond early next week.
> OK, I'm expecting the merge window to open over the weekend so I think
> I'm just going to apply now so we it's in -next when that happens.
quick follow-up note: Intel folks successfully tested this patchset on 
chell, sentry, lars, glados, asuka platforms. There is an unrelated 
issue on chell with playback not working, but at least the topology 
parsing is handled correctly with Guenter's contribution.

^ permalink raw reply	[flat|nested] 26+ messages in thread

end of thread, other threads:[~2018-06-06 20:29 UTC | newest]

Thread overview: 26+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-05-24 19:49 [PATCH v2 1/3] ASoC: topology: Improve backwards compatibility with v4 topology files Guenter Roeck
2018-05-24 19:49 ` Guenter Roeck
2018-05-24 19:49 ` [PATCH v2 2/3] ASoC: topology: Move v4 manifest header data structures to uapi Guenter Roeck
2018-05-24 19:49   ` Guenter Roeck
2018-05-29  7:51   ` [alsa-devel] " Lin, Mengdong
2018-06-01 17:12   ` Applied "ASoC: topology: Move v4 manifest header data structures to uapi" to the asoc tree Mark Brown
2018-06-01 17:12     ` Mark Brown
2018-05-24 19:49 ` [PATCH v2 3/3] ASoC: topology: Move skl-tplg-interface.h to uapi Guenter Roeck
2018-06-01 17:12   ` Applied "ASoC: topology: Move skl-tplg-interface.h to uapi" to the asoc tree Mark Brown
2018-06-01 17:12     ` Mark Brown
2018-05-25 13:33 ` [alsa-devel] [PATCH v2 1/3] ASoC: topology: Improve backwards compatibility with v4 topology files Shreyas NC
2018-05-28  6:03   ` Vinod
2018-05-28  6:38     ` Guenter Roeck
2018-06-01 10:25 ` Mark Brown
2018-06-01 10:25   ` Mark Brown
2018-06-01 13:17   ` Guenter Roeck
2018-06-01 13:17     ` Guenter Roeck
2018-06-01 15:19     ` [alsa-devel] " Pierre-Louis Bossart
2018-06-01 15:55       ` Guenter Roeck
2018-06-01 17:08       ` Mark Brown
2018-06-01 17:08         ` Mark Brown
2018-06-06 20:29         ` [alsa-devel] " Pierre-Louis Bossart
2018-06-01 17:11     ` Mark Brown
2018-06-01 17:11       ` Mark Brown
2018-06-01 17:12 ` Applied "ASoC: topology: Improve backwards compatibility with v4 topology files" to the asoc tree Mark Brown
2018-06-01 17:12   ` Mark Brown

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.