if (!priv)
                return -ENOMEM;
 
+       sdev->num_cores = 1;
        sdev->pdata->hw_pdata = priv;
        priv->dev = sdev->dev;
        priv->sdev = sdev;
 
        if (!priv)
                return -ENOMEM;
 
+       sdev->num_cores = 1;
        sdev->pdata->hw_pdata = priv;
        priv->dev = sdev->dev;
        priv->sdev = sdev;
 
        const struct sof_dev_desc *desc = pdata->desc;
        struct platform_device *pdev =
                container_of(sdev->dev, struct platform_device, dev);
+       const struct sof_intel_dsp_desc *chip;
        struct resource *mmio;
        u32 base, size;
        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 */
        mmio = platform_get_resource(pdev, IORESOURCE_MEM,
                                     desc->resindex_lpe_base);
 
        const struct sof_dev_desc *desc = pdata->desc;
        struct platform_device *pdev =
                container_of(sdev->dev, struct platform_device, dev);
+       const struct sof_intel_dsp_desc *chip;
        struct resource *mmio;
        u32 base, size;
        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 */
        ret = dma_coerce_mask_and_coherent(sdev->dev, DMA_BIT_MASK(31));
        if (ret < 0) {
 
                goto err;
        }
 
+       sdev->num_cores = chip->cores_num;
+
        hdev = devm_kzalloc(sdev->dev, sizeof(*hdev), GFP_KERNEL);
        if (!hdev)
                return -ENOMEM;
 
        struct snd_sof_pdata *pdata = sdev->pdata;
        const struct sof_dev_desc *desc = pdata->desc;
        struct pci_dev *pci = to_pci_dev(sdev->dev);
+       const struct sof_intel_dsp_desc *chip;
        u32 base, size;
        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 */
        ret = dma_coerce_mask_and_coherent(&pci->dev, DMA_BIT_MASK(31));
        if (ret < 0) {
 
 /* So far the primary core on all DSPs has ID 0 */
 #define SOF_DSP_PRIMARY_CORE 0
 
+/* max number of DSP cores */
+#define SOF_MAX_DSP_NUM_CORES 8
+
 /* DSP power state */
 enum sof_dsp_power_states {
        SOF_DSP_PM_D0,
 
        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 */
 };