Merge series "ASoC: SOF: use common code for DSP core pm" from Kai Vehmanen <kai.vehmanen@linux.intel.com>:

Series to refactor the DSP core management:
 - move tracking of powered up DSP cores to common SOF code
 - add logic filter unnecessary power actions
 - modify existing implementations to use common code
   whenever DSP cores are powered, so the state in common
   code stays in sync

Bard Liao (5):
  ASoC: SOF: Intel: hda: use snd_sof_dsp_core_power_up/down API
  ASoC: SOF: Intel: hda-loader: keep init cores alive
  ASoC: SOF: update dsp core power status in common APIs
  ASoC: SOF: Filter out unneeded core power up/downs
  ASoC: SOF: intel: hda-loader: use snd_sof_dsp_core_power_down/up APIs

 sound/soc/sof/intel/hda-dsp.c    |  2 +-
 sound/soc/sof/intel/hda-loader.c |  9 +++++----
 sound/soc/sof/intel/hda.c        |  2 +-
 sound/soc/sof/loader.c           |  6 ------
 sound/soc/sof/ops.h              | 24 ++++++++++++++++++------
 sound/soc/sof/pm.c               |  1 -
 sound/soc/sof/topology.c         |  8 --------
 7 files changed, 25 insertions(+), 27 deletions(-)

base-commit: e32df14235
--
2.29.2
This commit is contained in:
Mark Brown 2021-01-28 20:50:07 +00:00
commit 2029d73d4d
No known key found for this signature in database
GPG Key ID: 24D68B725D5487D0
7 changed files with 25 additions and 27 deletions

View File

@ -624,7 +624,7 @@ static int hda_suspend(struct snd_sof_dev *sdev, bool runtime_suspend)
#endif #endif
/* power down DSP */ /* power down DSP */
ret = hda_dsp_core_reset_power_down(sdev, chip->host_managed_cores_mask); ret = snd_sof_dsp_core_power_down(sdev, chip->host_managed_cores_mask);
if (ret < 0) { if (ret < 0) {
dev_err(sdev->dev, dev_err(sdev->dev,
"error: failed to power down core during suspend\n"); "error: failed to power down core during suspend\n");

View File

@ -93,7 +93,7 @@ static int cl_dsp_init(struct snd_sof_dev *sdev, int stream_tag)
int i; int i;
/* step 1: power up corex */ /* step 1: power up corex */
ret = hda_dsp_core_power_up(sdev, chip->host_managed_cores_mask); ret = snd_sof_dsp_core_power_up(sdev, chip->host_managed_cores_mask);
if (ret < 0) { if (ret < 0) {
if (hda->boot_iteration == HDA_FW_BOOT_ATTEMPTS) if (hda->boot_iteration == HDA_FW_BOOT_ATTEMPTS)
dev_err(sdev->dev, "error: dsp core 0/1 power up failed\n"); dev_err(sdev->dev, "error: dsp core 0/1 power up failed\n");
@ -147,8 +147,9 @@ static int cl_dsp_init(struct snd_sof_dev *sdev, int stream_tag)
chip->ipc_ack_mask, chip->ipc_ack_mask,
chip->ipc_ack_mask); chip->ipc_ack_mask);
/* step 5: power down corex */ /* step 5: power down cores that are no longer needed */
ret = hda_dsp_core_power_down(sdev, chip->host_managed_cores_mask & ~(BIT(0))); ret = snd_sof_dsp_core_power_down(sdev, chip->host_managed_cores_mask &
~(chip->init_core_mask));
if (ret < 0) { if (ret < 0) {
if (hda->boot_iteration == HDA_FW_BOOT_ATTEMPTS) if (hda->boot_iteration == HDA_FW_BOOT_ATTEMPTS)
dev_err(sdev->dev, dev_err(sdev->dev,
@ -183,7 +184,7 @@ static int cl_dsp_init(struct snd_sof_dev *sdev, int stream_tag)
flags |= SOF_DBG_DUMP_FORCE_ERR_LEVEL; flags |= SOF_DBG_DUMP_FORCE_ERR_LEVEL;
hda_dsp_dump(sdev, flags); hda_dsp_dump(sdev, flags);
hda_dsp_core_reset_power_down(sdev, chip->host_managed_cores_mask); snd_sof_dsp_core_power_down(sdev, chip->host_managed_cores_mask);
return ret; return ret;
} }

View File

@ -928,7 +928,7 @@ int hda_dsp_remove(struct snd_sof_dev *sdev)
/* disable cores */ /* disable cores */
if (chip) if (chip)
hda_dsp_core_reset_power_down(sdev, chip->host_managed_cores_mask); snd_sof_dsp_core_power_down(sdev, chip->host_managed_cores_mask);
/* disable DSP */ /* disable DSP */
snd_sof_dsp_update_bits(sdev, HDA_DSP_PP_BAR, SOF_HDA_REG_PP_PPCTL, snd_sof_dsp_update_bits(sdev, HDA_DSP_PP_BAR, SOF_HDA_REG_PP_PPCTL,

View File

@ -811,7 +811,6 @@ EXPORT_SYMBOL(snd_sof_load_firmware);
int snd_sof_run_firmware(struct snd_sof_dev *sdev) int snd_sof_run_firmware(struct snd_sof_dev *sdev)
{ {
int ret; int ret;
int init_core_mask;
init_waitqueue_head(&sdev->boot_wait); init_waitqueue_head(&sdev->boot_wait);
@ -843,8 +842,6 @@ int snd_sof_run_firmware(struct snd_sof_dev *sdev)
return ret; return ret;
} }
init_core_mask = ret;
/* /*
* now wait for the DSP to boot. There are 3 possible outcomes: * now wait for the DSP to boot. There are 3 possible outcomes:
* 1. Boot wait times out indicating FW boot failure. * 1. Boot wait times out indicating FW boot failure.
@ -874,9 +871,6 @@ int snd_sof_run_firmware(struct snd_sof_dev *sdev)
return ret; return ret;
} }
/* fw boot is complete. Update the active cores mask */
sdev->enabled_cores_mask = init_core_mask;
return 0; return 0;
} }
EXPORT_SYMBOL(snd_sof_run_firmware); EXPORT_SYMBOL(snd_sof_run_firmware);

View File

@ -76,19 +76,31 @@ static inline int snd_sof_dsp_reset(struct snd_sof_dev *sdev)
static inline int snd_sof_dsp_core_power_up(struct snd_sof_dev *sdev, static inline int snd_sof_dsp_core_power_up(struct snd_sof_dev *sdev,
unsigned int core_mask) unsigned int core_mask)
{ {
if (sof_ops(sdev)->core_power_up) int ret = 0;
return sof_ops(sdev)->core_power_up(sdev, core_mask);
return 0; core_mask &= ~sdev->enabled_cores_mask;
if (sof_ops(sdev)->core_power_up && core_mask) {
ret = sof_ops(sdev)->core_power_up(sdev, core_mask);
if (!ret)
sdev->enabled_cores_mask |= core_mask;
}
return ret;
} }
static inline int snd_sof_dsp_core_power_down(struct snd_sof_dev *sdev, static inline int snd_sof_dsp_core_power_down(struct snd_sof_dev *sdev,
unsigned int core_mask) unsigned int core_mask)
{ {
if (sof_ops(sdev)->core_power_down) int ret = 0;
return sof_ops(sdev)->core_power_down(sdev, core_mask);
return 0; core_mask &= sdev->enabled_cores_mask;
if (sof_ops(sdev)->core_power_down && core_mask) {
ret = sof_ops(sdev)->core_power_down(sdev, core_mask);
if (!ret)
sdev->enabled_cores_mask &= ~core_mask;
}
return ret;
} }
/* pre/post fw load */ /* pre/post fw load */

View File

@ -256,7 +256,6 @@ static int sof_suspend(struct device *dev, bool runtime_suspend)
/* reset FW state */ /* reset FW state */
sdev->fw_state = SOF_FW_BOOT_NOT_STARTED; sdev->fw_state = SOF_FW_BOOT_NOT_STARTED;
sdev->enabled_cores_mask = 0;
return ret; return ret;
} }

View File

@ -1352,10 +1352,6 @@ static int sof_core_enable(struct snd_sof_dev *sdev, int core)
core, ret); core, ret);
goto err; goto err;
} }
/* update enabled cores mask */
sdev->enabled_cores_mask |= BIT(core);
return ret; return ret;
err: err:
/* power down core if it is host managed and return the original error if this fails too */ /* power down core if it is host managed and return the original error if this fails too */
@ -2603,10 +2599,6 @@ static int sof_widget_unload(struct snd_soc_component *scomp,
if (ret < 0) if (ret < 0)
dev_err(scomp->dev, "error: powering down pipeline schedule core %d\n", dev_err(scomp->dev, "error: powering down pipeline schedule core %d\n",
pipeline->core); pipeline->core);
/* update enabled cores mask */
sdev->enabled_cores_mask &= ~(1 << pipeline->core);
break; break;
default: default:
break; break;