Commit bd2b34e4 authored by Mark Brown's avatar Mark Brown

Merge series "ASoC: SOF: multi-cpu dais, IPC and Intel improvements for 5.7"...

Merge series "ASoC: SOF: multi-cpu dais, IPC and Intel improvements for 5.7" from Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>:

Corrections for compatibility with the multi-cpu dai check for
min-channels, IPC simplifications, and removal of unnecessary
boot-related code for Intel platforms.

Amery Song (2):
  ASoC: SOF: Intel: hda: remove unnecessary ROM IPC filter function
  ASoC: SOF: Intel: remove unnecessary waitq before loading firmware

Bard Liao (2):
  ASoC: SOF: Intel: hda-dai: add stream capability
  ASoC: SOF: topology: connect dai widget to all cpu-dais

Karol Trzcinski (2):
  ASoC: SOF: Make sof_ipc_ext_data enum more rigid
  ASoC: SOF: Remove SOF_IPC_EXT_DMA_BUFFER

 include/sound/sof/info.h         | 22 +-------
 sound/soc/sof/intel/cnl.c        |  5 --
 sound/soc/sof/intel/hda-dai.c    | 96 ++++++++++++++++++++++++++++++++
 sound/soc/sof/intel/hda-ipc.c    | 20 +------
 sound/soc/sof/intel/hda-loader.c |  3 -
 sound/soc/sof/intel/hda.c        |  3 -
 sound/soc/sof/intel/hda.h        |  1 -
 sound/soc/sof/loader.c           |  6 --
 sound/soc/sof/sof-priv.h         |  5 --
 sound/soc/sof/topology.c         |  8 ++-
 10 files changed, 108 insertions(+), 61 deletions(-)

base-commit: 101247a3
--
2.20.1
parents ccab2c7d c59aca98
...@@ -28,9 +28,9 @@ ...@@ -28,9 +28,9 @@
/* extended data types that can be appended onto end of sof_ipc_fw_ready */ /* extended data types that can be appended onto end of sof_ipc_fw_ready */
enum sof_ipc_ext_data { enum sof_ipc_ext_data {
SOF_IPC_EXT_DMA_BUFFER = 0, SOF_IPC_EXT_UNUSED = 0,
SOF_IPC_EXT_WINDOW, SOF_IPC_EXT_WINDOW = 1,
SOF_IPC_EXT_CC_INFO, SOF_IPC_EXT_CC_INFO = 2,
}; };
/* FW version - SOF_IPC_GLB_VERSION */ /* FW version - SOF_IPC_GLB_VERSION */
...@@ -83,22 +83,6 @@ struct sof_ipc_ext_data_hdr { ...@@ -83,22 +83,6 @@ struct sof_ipc_ext_data_hdr {
uint32_t type; /**< SOF_IPC_EXT_ */ uint32_t type; /**< SOF_IPC_EXT_ */
} __packed; } __packed;
struct sof_ipc_dma_buffer_elem {
struct sof_ipc_hdr hdr;
uint32_t type; /**< SOF_IPC_REGION_ */
uint32_t id; /**< platform specific - used to map to host memory */
struct sof_ipc_host_buffer buffer;
} __packed;
/* extended data DMA buffers for IPC, trace and debug */
struct sof_ipc_dma_buffer_data {
struct sof_ipc_ext_data_hdr ext_hdr;
uint32_t num_buffers;
/* host files in buffer[n].buffer */
struct sof_ipc_dma_buffer_elem buffer[];
} __packed;
struct sof_ipc_window_elem { struct sof_ipc_window_elem {
struct sof_ipc_hdr hdr; struct sof_ipc_hdr hdr;
uint32_t type; /**< SOF_IPC_REGION_ */ uint32_t type; /**< SOF_IPC_REGION_ */
......
...@@ -65,11 +65,6 @@ static irqreturn_t cnl_ipc_irq_thread(int irq, void *context) ...@@ -65,11 +65,6 @@ static irqreturn_t cnl_ipc_irq_thread(int irq, void *context)
hda_dsp_ipc_get_reply(sdev); hda_dsp_ipc_get_reply(sdev);
snd_sof_ipc_reply(sdev, msg); snd_sof_ipc_reply(sdev, msg);
if (sdev->code_loading) {
sdev->code_loading = 0;
wake_up(&sdev->waitq);
}
cnl_ipc_dsp_done(sdev); cnl_ipc_dsp_done(sdev);
spin_unlock_irq(&sdev->ipc_lock); spin_unlock_irq(&sdev->ipc_lock);
......
...@@ -422,56 +422,152 @@ static struct snd_soc_cdai_ops sof_probe_compr_ops = { ...@@ -422,56 +422,152 @@ static struct snd_soc_cdai_ops sof_probe_compr_ops = {
struct snd_soc_dai_driver skl_dai[] = { struct snd_soc_dai_driver skl_dai[] = {
{ {
.name = "SSP0 Pin", .name = "SSP0 Pin",
.playback = {
.channels_min = 1,
.channels_max = 8,
},
.capture = {
.channels_min = 1,
.channels_max = 8,
},
}, },
{ {
.name = "SSP1 Pin", .name = "SSP1 Pin",
.playback = {
.channels_min = 1,
.channels_max = 8,
},
.capture = {
.channels_min = 1,
.channels_max = 8,
},
}, },
{ {
.name = "SSP2 Pin", .name = "SSP2 Pin",
.playback = {
.channels_min = 1,
.channels_max = 8,
},
.capture = {
.channels_min = 1,
.channels_max = 8,
},
}, },
{ {
.name = "SSP3 Pin", .name = "SSP3 Pin",
.playback = {
.channels_min = 1,
.channels_max = 8,
},
.capture = {
.channels_min = 1,
.channels_max = 8,
},
}, },
{ {
.name = "SSP4 Pin", .name = "SSP4 Pin",
.playback = {
.channels_min = 1,
.channels_max = 8,
},
.capture = {
.channels_min = 1,
.channels_max = 8,
},
}, },
{ {
.name = "SSP5 Pin", .name = "SSP5 Pin",
.playback = {
.channels_min = 1,
.channels_max = 8,
},
.capture = {
.channels_min = 1,
.channels_max = 8,
},
}, },
{ {
.name = "DMIC01 Pin", .name = "DMIC01 Pin",
.capture = {
.channels_min = 1,
.channels_max = 4,
},
}, },
{ {
.name = "DMIC16k Pin", .name = "DMIC16k Pin",
.capture = {
.channels_min = 1,
.channels_max = 4,
},
}, },
#if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA) #if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA)
{ {
.name = "iDisp1 Pin", .name = "iDisp1 Pin",
.ops = &hda_link_dai_ops, .ops = &hda_link_dai_ops,
.playback = {
.channels_min = 1,
.channels_max = 8,
},
}, },
{ {
.name = "iDisp2 Pin", .name = "iDisp2 Pin",
.ops = &hda_link_dai_ops, .ops = &hda_link_dai_ops,
.playback = {
.channels_min = 1,
.channels_max = 8,
},
}, },
{ {
.name = "iDisp3 Pin", .name = "iDisp3 Pin",
.ops = &hda_link_dai_ops, .ops = &hda_link_dai_ops,
.playback = {
.channels_min = 1,
.channels_max = 8,
},
}, },
{ {
.name = "iDisp4 Pin", .name = "iDisp4 Pin",
.ops = &hda_link_dai_ops, .ops = &hda_link_dai_ops,
.playback = {
.channels_min = 1,
.channels_max = 8,
},
}, },
{ {
.name = "Analog CPU DAI", .name = "Analog CPU DAI",
.ops = &hda_link_dai_ops, .ops = &hda_link_dai_ops,
.playback = {
.channels_min = 1,
.channels_max = 16,
},
.capture = {
.channels_min = 1,
.channels_max = 16,
},
}, },
{ {
.name = "Digital CPU DAI", .name = "Digital CPU DAI",
.ops = &hda_link_dai_ops, .ops = &hda_link_dai_ops,
.playback = {
.channels_min = 1,
.channels_max = 16,
},
.capture = {
.channels_min = 1,
.channels_max = 16,
},
}, },
{ {
.name = "Alt Analog CPU DAI", .name = "Alt Analog CPU DAI",
.ops = &hda_link_dai_ops, .ops = &hda_link_dai_ops,
.playback = {
.channels_min = 1,
.channels_max = 16,
},
.capture = {
.channels_min = 1,
.channels_max = 16,
},
}, },
#if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA_PROBES) #if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA_PROBES)
{ {
......
...@@ -125,12 +125,6 @@ void hda_dsp_ipc_get_reply(struct snd_sof_dev *sdev) ...@@ -125,12 +125,6 @@ void hda_dsp_ipc_get_reply(struct snd_sof_dev *sdev)
} }
static bool hda_dsp_ipc_is_sof(uint32_t msg)
{
return (msg & (HDA_DSP_IPC_PURGE_FW | 0xf << 9)) != msg ||
(msg & HDA_DSP_IPC_PURGE_FW) != HDA_DSP_IPC_PURGE_FW;
}
/* IPC handler thread */ /* IPC handler thread */
irqreturn_t hda_dsp_ipc_irq_thread(int irq, void *context) irqreturn_t hda_dsp_ipc_irq_thread(int irq, void *context)
{ {
...@@ -176,17 +170,9 @@ irqreturn_t hda_dsp_ipc_irq_thread(int irq, void *context) ...@@ -176,17 +170,9 @@ irqreturn_t hda_dsp_ipc_irq_thread(int irq, void *context)
*/ */
spin_lock_irq(&sdev->ipc_lock); spin_lock_irq(&sdev->ipc_lock);
/* handle immediate reply from DSP core - ignore ROM messages */ /* handle immediate reply from DSP core */
if (hda_dsp_ipc_is_sof(msg)) { hda_dsp_ipc_get_reply(sdev);
hda_dsp_ipc_get_reply(sdev); snd_sof_ipc_reply(sdev, msg);
snd_sof_ipc_reply(sdev, msg);
}
/* wake up sleeper if we are loading code */
if (sdev->code_loading) {
sdev->code_loading = 0;
wake_up(&sdev->waitq);
}
/* set the done bit */ /* set the done bit */
hda_dsp_ipc_dsp_done(sdev); hda_dsp_ipc_dsp_done(sdev);
......
...@@ -179,9 +179,6 @@ static int cl_trigger(struct snd_sof_dev *sdev, ...@@ -179,9 +179,6 @@ static int cl_trigger(struct snd_sof_dev *sdev,
/* code loader is special case that reuses stream ops */ /* code loader is special case that reuses stream ops */
switch (cmd) { switch (cmd) {
case SNDRV_PCM_TRIGGER_START: case SNDRV_PCM_TRIGGER_START:
wait_event_timeout(sdev->waitq, !sdev->code_loading,
HDA_DSP_CL_TRIGGER_TIMEOUT);
snd_sof_dsp_update_bits(sdev, HDA_DSP_HDA_BAR, SOF_HDA_INTCTL, snd_sof_dsp_update_bits(sdev, HDA_DSP_HDA_BAR, SOF_HDA_INTCTL,
1 << hstream->index, 1 << hstream->index,
1 << hstream->index); 1 << hstream->index);
......
...@@ -584,9 +584,6 @@ int hda_dsp_probe(struct snd_sof_dev *sdev) ...@@ -584,9 +584,6 @@ int hda_dsp_probe(struct snd_sof_dev *sdev)
hda_dsp_ctrl_ppcap_enable(sdev, true); hda_dsp_ctrl_ppcap_enable(sdev, true);
hda_dsp_ctrl_ppcap_int_enable(sdev, true); hda_dsp_ctrl_ppcap_int_enable(sdev, true);
/* initialize waitq for code loading */
init_waitqueue_head(&sdev->waitq);
/* set default mailbox offset for FW ready message */ /* set default mailbox offset for FW ready message */
sdev->dsp_box.offset = HDA_DSP_MBOX_UPLINK_OFFSET; sdev->dsp_box.offset = HDA_DSP_MBOX_UPLINK_OFFSET;
......
...@@ -175,7 +175,6 @@ ...@@ -175,7 +175,6 @@
* value cannot be read back within the specified time. * value cannot be read back within the specified time.
*/ */
#define HDA_DSP_STREAM_RUN_TIMEOUT 300 #define HDA_DSP_STREAM_RUN_TIMEOUT 300
#define HDA_DSP_CL_TRIGGER_TIMEOUT 300
#define HDA_DSP_SPIB_ENABLE 1 #define HDA_DSP_SPIB_ENABLE 1
#define HDA_DSP_SPIB_DISABLE 0 #define HDA_DSP_SPIB_DISABLE 0
......
...@@ -95,9 +95,6 @@ int snd_sof_fw_parse_ext_data(struct snd_sof_dev *sdev, u32 bar, u32 offset) ...@@ -95,9 +95,6 @@ int snd_sof_fw_parse_ext_data(struct snd_sof_dev *sdev, u32 bar, u32 offset)
/* process structure data */ /* process structure data */
switch (ext_hdr->type) { switch (ext_hdr->type) {
case SOF_IPC_EXT_DMA_BUFFER:
ret = 0;
break;
case SOF_IPC_EXT_WINDOW: case SOF_IPC_EXT_WINDOW:
ret = get_ext_windows(sdev, ext_hdr); ret = get_ext_windows(sdev, ext_hdr);
break; break;
...@@ -469,9 +466,6 @@ int snd_sof_load_firmware_raw(struct snd_sof_dev *sdev) ...@@ -469,9 +466,6 @@ int snd_sof_load_firmware_raw(struct snd_sof_dev *sdev)
const char *fw_filename; const char *fw_filename;
int ret; int ret;
/* set code loading condition to true */
sdev->code_loading = 1;
/* Don't request firmware again if firmware is already requested */ /* Don't request firmware again if firmware is already requested */
if (plat_data->fw) if (plat_data->fw)
return 0; return 0;
......
...@@ -415,17 +415,12 @@ struct snd_sof_dev { ...@@ -415,17 +415,12 @@ struct snd_sof_dev {
u32 enabled_cores_mask; /* keep track of enabled cores */ u32 enabled_cores_mask; /* keep track of enabled cores */
/* FW configuration */ /* FW configuration */
struct sof_ipc_dma_buffer_data *info_buffer;
struct sof_ipc_window *info_window; struct sof_ipc_window *info_window;
/* IPC timeouts in ms */ /* IPC timeouts in ms */
int ipc_timeout; int ipc_timeout;
int boot_timeout; int boot_timeout;
/* Wait queue for code loading */
wait_queue_head_t waitq;
int code_loading;
#if IS_ENABLED(CONFIG_SND_SOC_SOF_DEBUG_PROBES) #if IS_ENABLED(CONFIG_SND_SOC_SOF_DEBUG_PROBES)
unsigned int extractor_stream_tag; unsigned int extractor_stream_tag;
#endif #endif
......
...@@ -1240,6 +1240,8 @@ static int sof_connect_dai_widget(struct snd_soc_component *scomp, ...@@ -1240,6 +1240,8 @@ static int sof_connect_dai_widget(struct snd_soc_component *scomp,
{ {
struct snd_soc_card *card = scomp->card; struct snd_soc_card *card = scomp->card;
struct snd_soc_pcm_runtime *rtd; struct snd_soc_pcm_runtime *rtd;
struct snd_soc_dai *cpu_dai;
int i;
list_for_each_entry(rtd, &card->rtd_list, list) { list_for_each_entry(rtd, &card->rtd_list, list) {
dev_vdbg(scomp->dev, "tplg: check widget: %s stream: %s dai stream: %s\n", dev_vdbg(scomp->dev, "tplg: check widget: %s stream: %s dai stream: %s\n",
...@@ -1254,13 +1256,15 @@ static int sof_connect_dai_widget(struct snd_soc_component *scomp, ...@@ -1254,13 +1256,15 @@ static int sof_connect_dai_widget(struct snd_soc_component *scomp,
switch (w->id) { switch (w->id) {
case snd_soc_dapm_dai_out: case snd_soc_dapm_dai_out:
rtd->cpu_dai->capture_widget = w; for_each_rtd_cpu_dais(rtd, i, cpu_dai)
cpu_dai->capture_widget = w;
dai->name = rtd->dai_link->name; dai->name = rtd->dai_link->name;
dev_dbg(scomp->dev, "tplg: connected widget %s -> DAI link %s\n", dev_dbg(scomp->dev, "tplg: connected widget %s -> DAI link %s\n",
w->name, rtd->dai_link->name); w->name, rtd->dai_link->name);
break; break;
case snd_soc_dapm_dai_in: case snd_soc_dapm_dai_in:
rtd->cpu_dai->playback_widget = w; for_each_rtd_cpu_dais(rtd, i, cpu_dai)
cpu_dai->playback_widget = w;
dai->name = rtd->dai_link->name; dai->name = rtd->dai_link->name;
dev_dbg(scomp->dev, "tplg: connected widget %s -> DAI link %s\n", dev_dbg(scomp->dev, "tplg: connected widget %s -> DAI link %s\n",
w->name, rtd->dai_link->name); w->name, rtd->dai_link->name);
......
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