[alsa-devel] [PATCH 0/3] ASoC: Intel: Skylake: Driver updates for new DSP FW
The series contains driver changes which are needed to be compatible with the new DSP Firmware.
Divya Prakash (1): ASoC: Intel: Skylake: Reset DSP pipe in skl_pcm_hw_free
Pardha Saradhi K (1): ASoC: Intel: Skylake: Reset DSP Pipelines in prepare
Pradeep Tewani (1): ASoC: Intel: Skylake: Unify the fw ops for SKL and KBL
sound/soc/intel/skylake/skl-messages.c | 2 +- sound/soc/intel/skylake/skl-pcm.c | 36 ++++++++++++++++++++++++++++++---- sound/soc/intel/skylake/skl-sst-dsp.h | 3 --- sound/soc/intel/skylake/skl-sst.c | 34 ++------------------------------ 4 files changed, 35 insertions(+), 40 deletions(-)
From: Pardha Saradhi K pardha.saradhi.kesapragada@intel.com
An application can choose to call .prepare function any number of times. In such scenarios, there is a need to reset the DSP pipeline.
Signed-off-by: Pardha Saradhi K pardha.saradhi.kesapragada@intel.com Signed-off-by: Divya Prakash divya1.prakash@intel.com Signed-off-by: Sriram Periyasamy sriramx.periyasamy@intel.com --- sound/soc/intel/skylake/skl-pcm.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-)
diff --git a/sound/soc/intel/skylake/skl-pcm.c b/sound/soc/intel/skylake/skl-pcm.c index 15cb8ac3e374..5ac0a12007c2 100644 --- a/sound/soc/intel/skylake/skl-pcm.c +++ b/sound/soc/intel/skylake/skl-pcm.c @@ -268,15 +268,31 @@ static int skl_pcm_prepare(struct snd_pcm_substream *substream, { struct skl *skl = get_skl_ctx(dai->dev); struct skl_module_cfg *mconfig; + int ret;
dev_dbg(dai->dev, "%s: %s\n", __func__, dai->name);
mconfig = skl_tplg_fe_get_cpr_module(dai, substream->stream);
- /* In case of XRUN recovery, reset the FW pipe to clean state */ - if (mconfig && (substream->runtime->status->state == - SNDRV_PCM_STATE_XRUN)) - skl_reset_pipe(skl->skl_sst, mconfig->pipe); + /* + * In case of XRUN recovery or in the case when the application + * calls prepare another time, reset the FW pipe to clean state + */ + if (mconfig && + (substream->runtime->status->state == SNDRV_PCM_STATE_XRUN || + mconfig->pipe->state == SKL_PIPE_CREATED || + mconfig->pipe->state == SKL_PIPE_PAUSED)) { + + ret = skl_reset_pipe(skl->skl_sst, mconfig->pipe); + + if (ret < 0) + return ret; + + ret = skl_pcm_host_dma_prepare(dai->dev, + mconfig->pipe->p_params); + if (ret < 0) + return ret; + }
return 0; }
The patch
ASoC: Intel: Skylake: Reset DSP Pipelines in prepare
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 74e651926ee038237c48493d0a0853868d622b01 Mon Sep 17 00:00:00 2001
From: Pardha Saradhi K pardha.saradhi.kesapragada@intel.com Date: Mon, 2 Apr 2018 12:15:48 +0530 Subject: [PATCH] ASoC: Intel: Skylake: Reset DSP Pipelines in prepare
An application can choose to call .prepare function any number of times. In such scenarios, there is a need to reset the DSP pipeline.
Signed-off-by: Pardha Saradhi K pardha.saradhi.kesapragada@intel.com Signed-off-by: Divya Prakash divya1.prakash@intel.com Signed-off-by: Sriram Periyasamy sriramx.periyasamy@intel.com Signed-off-by: Mark Brown broonie@kernel.org --- sound/soc/intel/skylake/skl-pcm.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-)
diff --git a/sound/soc/intel/skylake/skl-pcm.c b/sound/soc/intel/skylake/skl-pcm.c index fe25515debec..afa86b9e4dcf 100644 --- a/sound/soc/intel/skylake/skl-pcm.c +++ b/sound/soc/intel/skylake/skl-pcm.c @@ -268,15 +268,31 @@ static int skl_pcm_prepare(struct snd_pcm_substream *substream, { struct skl *skl = get_skl_ctx(dai->dev); struct skl_module_cfg *mconfig; + int ret;
dev_dbg(dai->dev, "%s: %s\n", __func__, dai->name);
mconfig = skl_tplg_fe_get_cpr_module(dai, substream->stream);
- /* In case of XRUN recovery, reset the FW pipe to clean state */ - if (mconfig && (substream->runtime->status->state == - SNDRV_PCM_STATE_XRUN)) - skl_reset_pipe(skl->skl_sst, mconfig->pipe); + /* + * In case of XRUN recovery or in the case when the application + * calls prepare another time, reset the FW pipe to clean state + */ + if (mconfig && + (substream->runtime->status->state == SNDRV_PCM_STATE_XRUN || + mconfig->pipe->state == SKL_PIPE_CREATED || + mconfig->pipe->state == SKL_PIPE_PAUSED)) { + + ret = skl_reset_pipe(skl->skl_sst, mconfig->pipe); + + if (ret < 0) + return ret; + + ret = skl_pcm_host_dma_prepare(dai->dev, + mconfig->pipe->p_params); + if (ret < 0) + return ret; + }
return 0; }
From: Divya Prakash divya1.prakash@intel.com
Currently during destroy pipeline the gateway is disabled before DMA completion. This leads to improper draining of data and subsequently causing issues on HD-Audio DMA. Hence added a new pipe reset IPC in skl_pcm_hw_free in which the Gateway Enable(GEN bit) is reset to 0 after DMA completion in skl_pcm_trigger.
Signed-off-by: Divya Prakash divya1.prakash@intel.com Signed-off-by: Sriram Periyasamy sriramx.periyasamy@intel.com --- sound/soc/intel/skylake/skl-pcm.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
diff --git a/sound/soc/intel/skylake/skl-pcm.c b/sound/soc/intel/skylake/skl-pcm.c index 5ac0a12007c2..afa86b9e4dcf 100644 --- a/sound/soc/intel/skylake/skl-pcm.c +++ b/sound/soc/intel/skylake/skl-pcm.c @@ -382,9 +382,21 @@ static int skl_pcm_hw_free(struct snd_pcm_substream *substream, { struct hdac_ext_bus *ebus = dev_get_drvdata(dai->dev); struct hdac_ext_stream *stream = get_hdac_ext_stream(substream); + struct skl *skl = get_skl_ctx(dai->dev); + struct skl_module_cfg *mconfig; + int ret;
dev_dbg(dai->dev, "%s: %s\n", __func__, dai->name);
+ mconfig = skl_tplg_fe_get_cpr_module(dai, substream->stream); + + if (mconfig) { + ret = skl_reset_pipe(skl->skl_sst, mconfig->pipe); + if (ret < 0) + dev_err(dai->dev, "%s:Reset failed ret =%d", + __func__, ret); + } + snd_hdac_stream_cleanup(hdac_stream(stream)); hdac_stream(stream)->prepared = 0;
The patch
ASoC: Intel: Skylake: Reset DSP pipe in skl_pcm_hw_free
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 179c2e86328c3d7e07f87f9c45a216cda626e9ee Mon Sep 17 00:00:00 2001
From: Divya Prakash divya1.prakash@intel.com Date: Mon, 2 Apr 2018 12:15:49 +0530 Subject: [PATCH] ASoC: Intel: Skylake: Reset DSP pipe in skl_pcm_hw_free
Currently during destroy pipeline the gateway is disabled before DMA completion. This leads to improper draining of data and subsequently causing issues on HD-Audio DMA. Hence added a new pipe reset IPC in skl_pcm_hw_free in which the Gateway Enable(GEN bit) is reset to 0 after DMA completion in skl_pcm_trigger.
Signed-off-by: Divya Prakash divya1.prakash@intel.com Signed-off-by: Sriram Periyasamy sriramx.periyasamy@intel.com Signed-off-by: Mark Brown broonie@kernel.org --- sound/soc/intel/skylake/skl-pcm.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
diff --git a/sound/soc/intel/skylake/skl-pcm.c b/sound/soc/intel/skylake/skl-pcm.c index 15cb8ac3e374..fe25515debec 100644 --- a/sound/soc/intel/skylake/skl-pcm.c +++ b/sound/soc/intel/skylake/skl-pcm.c @@ -366,9 +366,21 @@ static int skl_pcm_hw_free(struct snd_pcm_substream *substream, { struct hdac_ext_bus *ebus = dev_get_drvdata(dai->dev); struct hdac_ext_stream *stream = get_hdac_ext_stream(substream); + struct skl *skl = get_skl_ctx(dai->dev); + struct skl_module_cfg *mconfig; + int ret;
dev_dbg(dai->dev, "%s: %s\n", __func__, dai->name);
+ mconfig = skl_tplg_fe_get_cpr_module(dai, substream->stream); + + if (mconfig) { + ret = skl_reset_pipe(skl->skl_sst, mconfig->pipe); + if (ret < 0) + dev_err(dai->dev, "%s:Reset failed ret =%d", + __func__, ret); + } + snd_hdac_stream_cleanup(hdac_stream(stream)); hdac_stream(stream)->prepared = 0;
From: Pradeep Tewani pradeep.d.tewani@intel.com
SKL and KBL driver used separate set of fw ops for library loading. However, with the unification of fw binary, use the common set of fw ops for both
Signed-off-by: Pradeep Tewani pradeep.d.tewani@intel.com Signed-off-by: Sriram Periyasamy sriramx.periyasamy@intel.com --- sound/soc/intel/skylake/skl-messages.c | 2 +- sound/soc/intel/skylake/skl-sst-dsp.h | 3 --- sound/soc/intel/skylake/skl-sst.c | 34 ++-------------------------------- 3 files changed, 3 insertions(+), 36 deletions(-)
diff --git a/sound/soc/intel/skylake/skl-messages.c b/sound/soc/intel/skylake/skl-messages.c index 57d4a58522a6..dd590a1c58e2 100644 --- a/sound/soc/intel/skylake/skl-messages.c +++ b/sound/soc/intel/skylake/skl-messages.c @@ -225,7 +225,7 @@ static const struct skl_dsp_ops dsp_ops[] = { .id = 0x9d71, .num_cores = 2, .loader_ops = skl_get_loader_ops, - .init = kbl_sst_dsp_init, + .init = skl_sst_dsp_init, .init_fw = skl_sst_init_fw, .cleanup = skl_sst_dsp_cleanup }, diff --git a/sound/soc/intel/skylake/skl-sst-dsp.h b/sound/soc/intel/skylake/skl-sst-dsp.h index 12fc9a73dc8a..e1d6f6719f7e 100644 --- a/sound/soc/intel/skylake/skl-sst-dsp.h +++ b/sound/soc/intel/skylake/skl-sst-dsp.h @@ -231,9 +231,6 @@ int skl_dsp_boot(struct sst_dsp *ctx); int skl_sst_dsp_init(struct device *dev, void __iomem *mmio_base, int irq, const char *fw_name, struct skl_dsp_loader_ops dsp_ops, struct skl_sst **dsp); -int kbl_sst_dsp_init(struct device *dev, void __iomem *mmio_base, int irq, - const char *fw_name, struct skl_dsp_loader_ops dsp_ops, - struct skl_sst **dsp); int bxt_sst_dsp_init(struct device *dev, void __iomem *mmio_base, int irq, const char *fw_name, struct skl_dsp_loader_ops dsp_ops, struct skl_sst **dsp); diff --git a/sound/soc/intel/skylake/skl-sst.c b/sound/soc/intel/skylake/skl-sst.c index 5a7e41b65ef3..5951bbdf1f1a 100644 --- a/sound/soc/intel/skylake/skl-sst.c +++ b/sound/soc/intel/skylake/skl-sst.c @@ -390,7 +390,7 @@ static int skl_transfer_module(struct sst_dsp *ctx, const void *data, }
static int -kbl_load_library(struct sst_dsp *ctx, struct skl_lib_info *linfo, int lib_count) +skl_load_library(struct sst_dsp *ctx, struct skl_lib_info *linfo, int lib_count) { struct skl_sst *skl = ctx->thread_context; struct firmware stripped_fw; @@ -508,16 +508,7 @@ static const struct skl_dsp_fw_ops skl_fw_ops = { .set_state_D3 = skl_set_dsp_D3, .load_fw = skl_load_base_firmware, .get_fw_errcode = skl_get_errorcode, - .load_mod = skl_load_module, - .unload_mod = skl_unload_module, -}; - -static const struct skl_dsp_fw_ops kbl_fw_ops = { - .set_state_D0 = skl_set_dsp_D0, - .set_state_D3 = skl_set_dsp_D3, - .load_fw = skl_load_base_firmware, - .get_fw_errcode = skl_get_errorcode, - .load_library = kbl_load_library, + .load_library = skl_load_library, .load_mod = skl_load_module, .unload_mod = skl_unload_module, }; @@ -573,27 +564,6 @@ int skl_sst_dsp_init(struct device *dev, void __iomem *mmio_base, int irq, } EXPORT_SYMBOL_GPL(skl_sst_dsp_init);
-int kbl_sst_dsp_init(struct device *dev, void __iomem *mmio_base, int irq, - const char *fw_name, struct skl_dsp_loader_ops dsp_ops, - struct skl_sst **dsp) -{ - struct sst_dsp *sst; - int ret; - - ret = skl_sst_dsp_init(dev, mmio_base, irq, fw_name, dsp_ops, dsp); - if (ret < 0) { - dev_err(dev, "%s: Init failed %d\n", __func__, ret); - return ret; - } - - sst = (*dsp)->dsp; - sst->fw_ops = kbl_fw_ops; - - return 0; - -} -EXPORT_SYMBOL_GPL(kbl_sst_dsp_init); - int skl_sst_init_fw(struct device *dev, struct skl_sst *ctx) { int ret;
The patch
ASoC: Intel: Skylake: Unify the fw ops for SKL and KBL
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 651e4890930d10d009a9a8b829a7177670975ec7 Mon Sep 17 00:00:00 2001
From: Pradeep Tewani pradeep.d.tewani@intel.com Date: Mon, 2 Apr 2018 12:15:50 +0530 Subject: [PATCH] ASoC: Intel: Skylake: Unify the fw ops for SKL and KBL
SKL and KBL driver used separate set of fw ops for library loading. However, with the unification of fw binary, use the common set of fw ops for both
Signed-off-by: Pradeep Tewani pradeep.d.tewani@intel.com Signed-off-by: Sriram Periyasamy sriramx.periyasamy@intel.com Signed-off-by: Mark Brown broonie@kernel.org --- sound/soc/intel/skylake/skl-messages.c | 2 +- sound/soc/intel/skylake/skl-sst-dsp.h | 3 --- sound/soc/intel/skylake/skl-sst.c | 34 ++------------------------ 3 files changed, 3 insertions(+), 36 deletions(-)
diff --git a/sound/soc/intel/skylake/skl-messages.c b/sound/soc/intel/skylake/skl-messages.c index 57d4a58522a6..dd590a1c58e2 100644 --- a/sound/soc/intel/skylake/skl-messages.c +++ b/sound/soc/intel/skylake/skl-messages.c @@ -225,7 +225,7 @@ static const struct skl_dsp_ops dsp_ops[] = { .id = 0x9d71, .num_cores = 2, .loader_ops = skl_get_loader_ops, - .init = kbl_sst_dsp_init, + .init = skl_sst_dsp_init, .init_fw = skl_sst_init_fw, .cleanup = skl_sst_dsp_cleanup }, diff --git a/sound/soc/intel/skylake/skl-sst-dsp.h b/sound/soc/intel/skylake/skl-sst-dsp.h index 12fc9a73dc8a..e1d6f6719f7e 100644 --- a/sound/soc/intel/skylake/skl-sst-dsp.h +++ b/sound/soc/intel/skylake/skl-sst-dsp.h @@ -231,9 +231,6 @@ int skl_dsp_boot(struct sst_dsp *ctx); int skl_sst_dsp_init(struct device *dev, void __iomem *mmio_base, int irq, const char *fw_name, struct skl_dsp_loader_ops dsp_ops, struct skl_sst **dsp); -int kbl_sst_dsp_init(struct device *dev, void __iomem *mmio_base, int irq, - const char *fw_name, struct skl_dsp_loader_ops dsp_ops, - struct skl_sst **dsp); int bxt_sst_dsp_init(struct device *dev, void __iomem *mmio_base, int irq, const char *fw_name, struct skl_dsp_loader_ops dsp_ops, struct skl_sst **dsp); diff --git a/sound/soc/intel/skylake/skl-sst.c b/sound/soc/intel/skylake/skl-sst.c index 5a7e41b65ef3..5951bbdf1f1a 100644 --- a/sound/soc/intel/skylake/skl-sst.c +++ b/sound/soc/intel/skylake/skl-sst.c @@ -390,7 +390,7 @@ static int skl_transfer_module(struct sst_dsp *ctx, const void *data, }
static int -kbl_load_library(struct sst_dsp *ctx, struct skl_lib_info *linfo, int lib_count) +skl_load_library(struct sst_dsp *ctx, struct skl_lib_info *linfo, int lib_count) { struct skl_sst *skl = ctx->thread_context; struct firmware stripped_fw; @@ -508,16 +508,7 @@ static const struct skl_dsp_fw_ops skl_fw_ops = { .set_state_D3 = skl_set_dsp_D3, .load_fw = skl_load_base_firmware, .get_fw_errcode = skl_get_errorcode, - .load_mod = skl_load_module, - .unload_mod = skl_unload_module, -}; - -static const struct skl_dsp_fw_ops kbl_fw_ops = { - .set_state_D0 = skl_set_dsp_D0, - .set_state_D3 = skl_set_dsp_D3, - .load_fw = skl_load_base_firmware, - .get_fw_errcode = skl_get_errorcode, - .load_library = kbl_load_library, + .load_library = skl_load_library, .load_mod = skl_load_module, .unload_mod = skl_unload_module, }; @@ -573,27 +564,6 @@ int skl_sst_dsp_init(struct device *dev, void __iomem *mmio_base, int irq, } EXPORT_SYMBOL_GPL(skl_sst_dsp_init);
-int kbl_sst_dsp_init(struct device *dev, void __iomem *mmio_base, int irq, - const char *fw_name, struct skl_dsp_loader_ops dsp_ops, - struct skl_sst **dsp) -{ - struct sst_dsp *sst; - int ret; - - ret = skl_sst_dsp_init(dev, mmio_base, irq, fw_name, dsp_ops, dsp); - if (ret < 0) { - dev_err(dev, "%s: Init failed %d\n", __func__, ret); - return ret; - } - - sst = (*dsp)->dsp; - sst->fw_ops = kbl_fw_ops; - - return 0; - -} -EXPORT_SYMBOL_GPL(kbl_sst_dsp_init); - int skl_sst_init_fw(struct device *dev, struct skl_sst *ctx) { int ret;
participants (2)
-
Mark Brown
-
Sriram Periyasamy