Unverified Commit e995c519 authored by Cezary Rojewski's avatar Cezary Rojewski Committed by Mark Brown
Browse files

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: default avatarCezary Rojewski <cezary.rojewski@intel.com>
Link: https://patch.msgid.link/20250203141051.2361323-7-cezary.rojewski@intel.com


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent b9fb9169
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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);
+47 −17
Original line number Diff line number Diff line
@@ -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, i;
	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);
	if (adev->spec->dsp_ops->config_basefw) {
		ret = avs_dsp_op(adev, config_basefw);
		if (ret)
			return ret;
	}

	return 0;
}

	ret = avs_dsp_core_disable(adev, AVS_MAIN_CORE_MASK);
	if (ret < 0)
		return ret;
int avs_dsp_boot_firmware(struct avs_dev *adev, bool purge)
{
	int ret;

	ret = avs_dsp_boot_firmware(adev, true);
	if (ret < 0) {
		dev_err(adev->dev, "firmware boot failed: %d\n", 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;

	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);
}