Commit daa90764 authored by Mark Brown's avatar Mark Brown

Merge series "ASoC: SOF: component UUID support for 5.10" from Kai Vehmanen...

Merge series "ASoC: SOF: component UUID support for 5.10" from Kai Vehmanen <kai.vehmanen@linux.intel.com>:

This series adds support for UUID based component identification
in SOF. UUIDs provide a more scalable alternative to the old
component type based approach to identify which DSP components
should be loaded.

More detailed description of UUID usage in SOF is available in:
https://thesofproject.github.io/latest/developer_guides/uuid/

UUID support is an incremental update to the SOF IPC interface. Driver
remains compatible with pre-UUID (ABI <3.17) firmware versions.

Keyon Jie (16):
  ASoC: SOF: tokens: add token for component UUID
  ASoC: SOF: add comp_ext to struct snd_sof_widget
  ASoC: SOF: topology: create component extended tokens
  ASoC: SOF: topology: parse comp_ext_tokens for all widgets
  ASoC: SOF: use the sof_ipc_comp reserved bytes for extended data
  ASoC: SOF: topology: add helper for setting up IPC component
  ASoC: SOF: append extended data to sof_ipc_comp_dai
  ASoC: SOF: append extended data to sof_ipc_comp_mixer
  ASoC: SOF: append extended data to sof_ipc_comp_volume
  ASoC: SOF: append extended data to sof_ipc_comp_host
  ASoC: SOF: append extended data to sof_ipc_comp_src
  ASoC: SOF: append extended data to sof_ipc_comp_asrc
  ASoC: SOF: append extended data to sof_ipc_comp_tone
  ASoC: SOF: append extended data to sof_ipc_comp_process
  ASoC: SOF: append extended data to sof_ipc_comp_mux
  ASoC: SOF: topology: make process type optional

 include/sound/sof/topology.h    |  12 +-
 include/uapi/sound/sof/tokens.h |   1 +
 sound/soc/sof/sof-audio.c       |  23 +++-
 sound/soc/sof/sof-audio.h       |   3 +
 sound/soc/sof/topology.c        | 208 ++++++++++++++++++++------------
 5 files changed, 161 insertions(+), 86 deletions(-)

--
2.27.0
parents a252632d 988d9418
...@@ -57,8 +57,8 @@ struct sof_ipc_comp { ...@@ -57,8 +57,8 @@ struct sof_ipc_comp {
uint32_t pipeline_id; uint32_t pipeline_id;
uint32_t core; uint32_t core;
/* reserved for future use */ /* extended data length, 0 if no extended data */
uint32_t reserved[1]; uint32_t ext_data_length;
} __packed; } __packed;
/* /*
...@@ -87,6 +87,9 @@ struct sof_ipc_comp { ...@@ -87,6 +87,9 @@ struct sof_ipc_comp {
*/ */
#define SOF_BUF_UNDERRUN_PERMITTED BIT(1) #define SOF_BUF_UNDERRUN_PERMITTED BIT(1)
/* the UUID size in bytes, shared between FW and host */
#define SOF_UUID_SIZE 16
/* create new component buffer - SOF_IPC_TPLG_BUFFER_NEW */ /* create new component buffer - SOF_IPC_TPLG_BUFFER_NEW */
struct sof_ipc_buffer { struct sof_ipc_buffer {
struct sof_ipc_comp comp; struct sof_ipc_comp comp;
...@@ -300,4 +303,9 @@ enum sof_event_types { ...@@ -300,4 +303,9 @@ enum sof_event_types {
SOF_KEYWORD_DETECT_DAPM_EVENT, SOF_KEYWORD_DETECT_DAPM_EVENT,
}; };
/* extended data struct for UUID components */
struct sof_ipc_comp_ext {
uint8_t uuid[SOF_UUID_SIZE];
} __packed;
#endif #endif
...@@ -74,6 +74,7 @@ ...@@ -74,6 +74,7 @@
* #define SOF_TKN_COMP_PRELOAD_COUNT 403 * #define SOF_TKN_COMP_PRELOAD_COUNT 403
*/ */
#define SOF_TKN_COMP_CORE_ID 404 #define SOF_TKN_COMP_CORE_ID 404
#define SOF_TKN_COMP_UUID 405
/* SSP */ /* SSP */
#define SOF_TKN_INTEL_SSP_CLKS_CONTROL 500 #define SOF_TKN_INTEL_SSP_CLKS_CONTROL 500
......
...@@ -165,8 +165,9 @@ int sof_restore_pipelines(struct device *dev) ...@@ -165,8 +165,9 @@ int sof_restore_pipelines(struct device *dev)
struct snd_sof_route *sroute; struct snd_sof_route *sroute;
struct sof_ipc_pipe_new *pipeline; struct sof_ipc_pipe_new *pipeline;
struct snd_sof_dai *dai; struct snd_sof_dai *dai;
struct sof_ipc_comp_dai *comp_dai;
struct sof_ipc_cmd_hdr *hdr; struct sof_ipc_cmd_hdr *hdr;
struct sof_ipc_comp *comp;
size_t ipc_size;
int ret; int ret;
/* restore pipeline components */ /* restore pipeline components */
...@@ -189,12 +190,24 @@ int sof_restore_pipelines(struct device *dev) ...@@ -189,12 +190,24 @@ int sof_restore_pipelines(struct device *dev)
switch (swidget->id) { switch (swidget->id) {
case snd_soc_dapm_dai_in: case snd_soc_dapm_dai_in:
case snd_soc_dapm_dai_out: case snd_soc_dapm_dai_out:
ipc_size = sizeof(struct sof_ipc_comp_dai) +
sizeof(struct sof_ipc_comp_ext);
comp = kzalloc(ipc_size, GFP_KERNEL);
if (!comp)
return -ENOMEM;
dai = swidget->private; dai = swidget->private;
comp_dai = &dai->comp_dai; memcpy(comp, &dai->comp_dai,
ret = sof_ipc_tx_message(sdev->ipc, sizeof(struct sof_ipc_comp_dai));
comp_dai->comp.hdr.cmd,
comp_dai, sizeof(*comp_dai), /* append extended data to the end of the component */
memcpy((u8 *)comp + sizeof(struct sof_ipc_comp_dai),
&swidget->comp_ext, sizeof(swidget->comp_ext));
ret = sof_ipc_tx_message(sdev->ipc, comp->hdr.cmd,
comp, ipc_size,
&r, sizeof(r)); &r, sizeof(r));
kfree(comp);
break; break;
case snd_soc_dapm_scheduler: case snd_soc_dapm_scheduler:
......
...@@ -89,6 +89,9 @@ struct snd_sof_widget { ...@@ -89,6 +89,9 @@ struct snd_sof_widget {
struct snd_soc_dapm_widget *widget; struct snd_soc_dapm_widget *widget;
struct list_head list; /* list in sdev widget list */ struct list_head list; /* list in sdev widget list */
/* extended data for UUID components */
struct sof_ipc_comp_ext comp_ext;
void *private; /* core does not touch this */ void *private; /* core does not touch this */
}; };
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment