ASoC: SOF: Intel: hda-stream: limit PROCEN workaround
authorPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Tue, 7 Dec 2021 19:39:42 +0000 (13:39 -0600)
committerMark Brown <broonie@kernel.org>
Mon, 13 Dec 2021 19:32:45 +0000 (19:32 +0000)
The work-around enabled in hda-stream.c is only required on earlier
versions of SOCs/PCH (Skylake, KabyLake, ApolloLake,
GeminiLake). Before setting the format on the host DMA, it is required
to couple the host and link DMA - which as a consequence shall use the
same format.

This patch introduces a quirk field in the platform descriptor and
makes the work-around conditional. Newer platforms have
no limitations on the use of host and link DMA, which can use
different formats.

Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: Rander Wang <rander.wang@intel.com>
Link: https://lore.kernel.org/r/20211207193947.71080-3-pierre-louis.bossart@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/intel/apl.c
sound/soc/sof/intel/hda-stream.c
sound/soc/sof/intel/shim.h

index 8778f46..810b8b6 100644 (file)
@@ -147,5 +147,6 @@ const struct sof_intel_dsp_desc apl_chip_info = {
        .rom_init_timeout       = 150,
        .ssp_count = APL_SSP_COUNT,
        .ssp_base_offset = APL_SSP_BASE_OFFSET,
+       .quirks = SOF_INTEL_PROCEN_FMT_QUIRK,
 };
 EXPORT_SYMBOL_NS(apl_chip_info, SND_SOC_SOF_INTEL_HDA_COMMON);
index 440827c..5f9eb5b 100644 (file)
@@ -472,6 +472,7 @@ int hda_dsp_stream_hw_params(struct snd_sof_dev *sdev,
                             struct snd_dma_buffer *dmab,
                             struct snd_pcm_hw_params *params)
 {
+       const struct sof_intel_dsp_desc *chip = get_chip_info(sdev->pdata);
        struct hdac_bus *bus = sof_to_bus(sdev);
        struct hdac_stream *hstream = &stream->hstream;
        int sd_offset = SOF_STREAM_SD_OFFSET(hstream);
@@ -584,6 +585,7 @@ int hda_dsp_stream_hw_params(struct snd_sof_dev *sdev,
 
        /*
         * Recommended hardware programming sequence for HDAudio DMA format
+        * on earlier platforms - this is not needed on newer platforms
         *
         * 1. Put DMA into coupled mode by clearing PPCTL.PROCEN bit
         *    for corresponding stream index before the time of writing
@@ -593,9 +595,11 @@ int hda_dsp_stream_hw_params(struct snd_sof_dev *sdev,
         *    enable decoupled mode
         */
 
-       /* couple host and link DMA, disable DSP features */
-       snd_sof_dsp_update_bits(sdev, HDA_DSP_PP_BAR, SOF_HDA_REG_PP_PPCTL,
-                               mask, 0);
+       if (chip->quirks & SOF_INTEL_PROCEN_FMT_QUIRK) {
+               /* couple host and link DMA, disable DSP features */
+               snd_sof_dsp_update_bits(sdev, HDA_DSP_PP_BAR, SOF_HDA_REG_PP_PPCTL,
+                                       mask, 0);
+       }
 
        /* program stream format */
        snd_sof_dsp_update_bits(sdev, HDA_DSP_HDA_BAR,
@@ -603,9 +607,11 @@ int hda_dsp_stream_hw_params(struct snd_sof_dev *sdev,
                                SOF_HDA_ADSP_REG_CL_SD_FORMAT,
                                0xffff, hstream->format_val);
 
-       /* decouple host and link DMA, enable DSP features */
-       snd_sof_dsp_update_bits(sdev, HDA_DSP_PP_BAR, SOF_HDA_REG_PP_PPCTL,
-                               mask, mask);
+       if (chip->quirks & SOF_INTEL_PROCEN_FMT_QUIRK) {
+               /* decouple host and link DMA, enable DSP features */
+               snd_sof_dsp_update_bits(sdev, HDA_DSP_PP_BAR, SOF_HDA_REG_PP_PPCTL,
+                                       mask, mask);
+       }
 
        /* program last valid index */
        snd_sof_dsp_update_bits(sdev, HDA_DSP_HDA_BAR,
index 08c53cb..f36cd9d 100644 (file)
 #define PCI_PMCS               0x84
 #define PCI_PMCS_PS_MASK       0x3
 
+/* Intel quirks */
+#define SOF_INTEL_PROCEN_FMT_QUIRK BIT(0)
+
 /* DSP hardware descriptor */
 struct sof_intel_dsp_desc {
        int cores_num;
@@ -166,6 +169,7 @@ struct sof_intel_dsp_desc {
        int ssp_base_offset;            /* base address of the SSPs */
        u32 sdw_shim_base;
        u32 sdw_alh_base;
+       u32 quirks;
        bool (*check_sdw_irq)(struct snd_sof_dev *sdev);
 };