Commit 5974f684 authored by Ranjani Sridharan's avatar Ranjani Sridharan Committed by Mark Brown

ASoC: SOF: Introduce num_cores and ref count per core

Add two fields num_cores and dsp_cores_ref_count to
struct snd_sof_dev. These will be used to maintain the
ref count for each core to determine when it should be
powered up or down.
Signed-off-by: default avatarRanjani Sridharan <ranjani.sridharan@linux.intel.com>
Reviewed-by: default avatarGuennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
Reviewed-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: default avatarKai Vehmanen <kai.vehmanen@linux.intel.com>
Link: https://lore.kernel.org/r/20211119192621.4096077-3-kai.vehmanen@linux.intel.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent 81ed6770
...@@ -188,6 +188,7 @@ static int imx8_probe(struct snd_sof_dev *sdev) ...@@ -188,6 +188,7 @@ static int imx8_probe(struct snd_sof_dev *sdev)
if (!priv) if (!priv)
return -ENOMEM; return -ENOMEM;
sdev->num_cores = 1;
sdev->pdata->hw_pdata = priv; sdev->pdata->hw_pdata = priv;
priv->dev = sdev->dev; priv->dev = sdev->dev;
priv->sdev = sdev; priv->sdev = sdev;
......
...@@ -108,6 +108,7 @@ static int imx8m_probe(struct snd_sof_dev *sdev) ...@@ -108,6 +108,7 @@ static int imx8m_probe(struct snd_sof_dev *sdev)
if (!priv) if (!priv)
return -ENOMEM; return -ENOMEM;
sdev->num_cores = 1;
sdev->pdata->hw_pdata = priv; sdev->pdata->hw_pdata = priv;
priv->dev = sdev->dev; priv->dev = sdev->dev;
priv->sdev = sdev; priv->sdev = sdev;
......
...@@ -412,10 +412,19 @@ static int bdw_probe(struct snd_sof_dev *sdev) ...@@ -412,10 +412,19 @@ static int bdw_probe(struct snd_sof_dev *sdev)
const struct sof_dev_desc *desc = pdata->desc; const struct sof_dev_desc *desc = pdata->desc;
struct platform_device *pdev = struct platform_device *pdev =
container_of(sdev->dev, struct platform_device, dev); container_of(sdev->dev, struct platform_device, dev);
const struct sof_intel_dsp_desc *chip;
struct resource *mmio; struct resource *mmio;
u32 base, size; u32 base, size;
int ret; int ret;
chip = get_chip_info(sdev->pdata);
if (!chip) {
dev_err(sdev->dev, "error: no such device supported\n");
return -EIO;
}
sdev->num_cores = chip->cores_num;
/* LPE base */ /* LPE base */
mmio = platform_get_resource(pdev, IORESOURCE_MEM, mmio = platform_get_resource(pdev, IORESOURCE_MEM,
desc->resindex_lpe_base); desc->resindex_lpe_base);
......
...@@ -113,10 +113,19 @@ static int byt_acpi_probe(struct snd_sof_dev *sdev) ...@@ -113,10 +113,19 @@ static int byt_acpi_probe(struct snd_sof_dev *sdev)
const struct sof_dev_desc *desc = pdata->desc; const struct sof_dev_desc *desc = pdata->desc;
struct platform_device *pdev = struct platform_device *pdev =
container_of(sdev->dev, struct platform_device, dev); container_of(sdev->dev, struct platform_device, dev);
const struct sof_intel_dsp_desc *chip;
struct resource *mmio; struct resource *mmio;
u32 base, size; u32 base, size;
int ret; int ret;
chip = get_chip_info(sdev->pdata);
if (!chip) {
dev_err(sdev->dev, "error: no such device supported\n");
return -EIO;
}
sdev->num_cores = chip->cores_num;
/* DSP DMA can only access low 31 bits of host memory */ /* DSP DMA can only access low 31 bits of host memory */
ret = dma_coerce_mask_and_coherent(sdev->dev, DMA_BIT_MASK(31)); ret = dma_coerce_mask_and_coherent(sdev->dev, DMA_BIT_MASK(31));
if (ret < 0) { if (ret < 0) {
......
...@@ -897,6 +897,8 @@ int hda_dsp_probe(struct snd_sof_dev *sdev) ...@@ -897,6 +897,8 @@ int hda_dsp_probe(struct snd_sof_dev *sdev)
goto err; goto err;
} }
sdev->num_cores = chip->cores_num;
hdev = devm_kzalloc(sdev->dev, sizeof(*hdev), GFP_KERNEL); hdev = devm_kzalloc(sdev->dev, sizeof(*hdev), GFP_KERNEL);
if (!hdev) if (!hdev)
return -ENOMEM; return -ENOMEM;
......
...@@ -55,9 +55,18 @@ static int tangier_pci_probe(struct snd_sof_dev *sdev) ...@@ -55,9 +55,18 @@ static int tangier_pci_probe(struct snd_sof_dev *sdev)
struct snd_sof_pdata *pdata = sdev->pdata; struct snd_sof_pdata *pdata = sdev->pdata;
const struct sof_dev_desc *desc = pdata->desc; const struct sof_dev_desc *desc = pdata->desc;
struct pci_dev *pci = to_pci_dev(sdev->dev); struct pci_dev *pci = to_pci_dev(sdev->dev);
const struct sof_intel_dsp_desc *chip;
u32 base, size; u32 base, size;
int ret; int ret;
chip = get_chip_info(sdev->pdata);
if (!chip) {
dev_err(sdev->dev, "error: no such device supported\n");
return -EIO;
}
sdev->num_cores = chip->cores_num;
/* DSP DMA can only access low 31 bits of host memory */ /* DSP DMA can only access low 31 bits of host memory */
ret = dma_coerce_mask_and_coherent(&pci->dev, DMA_BIT_MASK(31)); ret = dma_coerce_mask_and_coherent(&pci->dev, DMA_BIT_MASK(31));
if (ret < 0) { if (ret < 0) {
......
...@@ -71,6 +71,9 @@ extern int sof_core_debug; ...@@ -71,6 +71,9 @@ extern int sof_core_debug;
/* So far the primary core on all DSPs has ID 0 */ /* So far the primary core on all DSPs has ID 0 */
#define SOF_DSP_PRIMARY_CORE 0 #define SOF_DSP_PRIMARY_CORE 0
/* max number of DSP cores */
#define SOF_MAX_DSP_NUM_CORES 8
/* DSP power state */ /* DSP power state */
enum sof_dsp_power_states { enum sof_dsp_power_states {
SOF_DSP_PM_D0, SOF_DSP_PM_D0,
...@@ -477,6 +480,18 @@ struct snd_sof_dev { ...@@ -477,6 +480,18 @@ struct snd_sof_dev {
bool msi_enabled; bool msi_enabled;
/* DSP core context */
u32 num_cores;
/*
* ref count per core that will be modified during system suspend/resume and during pcm
* hw_params/hw_free. This doesn't need to be protected with a mutex because pcm
* hw_params/hw_free are already protected by the PCM mutex in the ALSA framework in
* sound/core/ when streams are active and during system suspend/resume, streams are
* already suspended.
*/
int dsp_core_ref_count[SOF_MAX_DSP_NUM_CORES];
void *private; /* core does not touch this */ void *private; /* core does not touch this */
}; };
......
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