ASoC: Intel: avs: Move DSP-boot steps into individual functions

To make DSP-boot code more readable, move each logical step into an
individual function and add the configure step which will be utilized by
follow up changes. To summarize, the steps are: loading the firmware
code, configuring the base firmware and, allocating driver resources
based on FW and HW capabilities.

Signed-off-by: Cezary Rojewski <cezary.rojewski@intel.com>
Link: https://patch.msgid.link/20250203141051.2361323-7-cezary.rojewski@intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
Cezary Rojewski
2025-02-03 15:10:46 +01:00
committed by Mark Brown
parent b9fb91692a
commit e995c51903
2 changed files with 53 additions and 22 deletions

View File

@@ -51,6 +51,7 @@ struct avs_dsp_ops {
int (* const load_basefw)(struct avs_dev *, struct firmware *);
int (* const load_lib)(struct avs_dev *, struct firmware *, u32);
int (* const transfer_mods)(struct avs_dev *, bool, struct avs_module_entry *, u32);
int (* const config_basefw)(struct avs_dev *);
int (* const enable_logs)(struct avs_dev *, enum avs_log_enable, u32, u32, unsigned long,
u32 *);
int (* const log_buffer_offset)(struct avs_dev *, u32);

View File

@@ -603,7 +603,7 @@ static int avs_dsp_load_basefw(struct avs_dev *adev)
return ret;
}
int avs_dsp_boot_firmware(struct avs_dev *adev, bool purge)
static int avs_load_firmware(struct avs_dev *adev, bool purge)
{
struct avs_soc_component *acomp;
int ret, i;
@@ -657,29 +657,34 @@ int avs_dsp_boot_firmware(struct avs_dev *adev, bool purge)
return 0;
}
int avs_dsp_first_boot_firmware(struct avs_dev *adev)
static int avs_config_basefw(struct avs_dev *adev)
{
int ret;
if (adev->spec->dsp_ops->config_basefw) {
ret = avs_dsp_op(adev, config_basefw);
if (ret)
return ret;
}
return 0;
}
int avs_dsp_boot_firmware(struct avs_dev *adev, bool purge)
{
int ret;
ret = avs_load_firmware(adev, purge);
if (ret)
return ret;
return avs_config_basefw(adev);
}
static int avs_dsp_alloc_resources(struct avs_dev *adev)
{
int ret, i;
if (avs_platattr_test(adev, CLDMA)) {
ret = hda_cldma_init(&code_loader, &adev->base.core,
adev->dsp_ba, AVS_CL_DEFAULT_BUFFER_SIZE);
if (ret < 0) {
dev_err(adev->dev, "cldma init failed: %d\n", ret);
return ret;
}
}
ret = avs_dsp_core_disable(adev, AVS_MAIN_CORE_MASK);
if (ret < 0)
return ret;
ret = avs_dsp_boot_firmware(adev, true);
if (ret < 0) {
dev_err(adev->dev, "firmware boot failed: %d\n", ret);
return ret;
}
ret = avs_ipc_get_hw_config(adev, &adev->hw_cfg);
if (ret)
return AVS_IPC_RET(ret);
@@ -705,6 +710,31 @@ int avs_dsp_first_boot_firmware(struct avs_dev *adev)
strscpy(adev->lib_names[0], "BASEFW", AVS_LIB_NAME_SIZE);
ida_init(&adev->ppl_ida);
return 0;
}
int avs_dsp_first_boot_firmware(struct avs_dev *adev)
{
int ret;
if (avs_platattr_test(adev, CLDMA)) {
ret = hda_cldma_init(&code_loader, &adev->base.core,
adev->dsp_ba, AVS_CL_DEFAULT_BUFFER_SIZE);
if (ret < 0) {
dev_err(adev->dev, "cldma init failed: %d\n", ret);
return ret;
}
}
ret = avs_dsp_core_disable(adev, AVS_MAIN_CORE_MASK);
if (ret < 0)
return ret;
ret = avs_dsp_boot_firmware(adev, true);
if (ret < 0) {
dev_err(adev->dev, "firmware boot failed: %d\n", ret);
return ret;
}
return avs_dsp_alloc_resources(adev);
}