ASoC: Intel: avs: Move DSP-boot steps into individual functions
authorCezary Rojewski <cezary.rojewski@intel.com>
Mon, 3 Feb 2025 14:10:46 +0000 (15:10 +0100)
committerMark Brown <broonie@kernel.org>
Mon, 3 Feb 2025 14:04:57 +0000 (14:04 +0000)
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>
sound/soc/intel/avs/avs.h
sound/soc/intel/avs/loader.c

index eca6ec0428bbbea4626c32c2e557e0c34674daf5..585543f872fccc0e4d82a4799aea5dbc4600b88e 100644 (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);
index 9ff7818395cdc76b2f8d683fe78b809f17ffc7e8..0b29941feb0ef0c4433c2f578bf149211feb3d03 100644 (file)
@@ -603,7 +603,7 @@ release_fw:
        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,28 +657,33 @@ reenable_gating:
        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;
-               }
        }
 
-       ret = avs_dsp_core_disable(adev, AVS_MAIN_CORE_MASK);
-       if (ret < 0)
-               return ret;
+       return 0;
+}
 
-       ret = avs_dsp_boot_firmware(adev, true);
-       if (ret < 0) {
-               dev_err(adev->dev, "firmware boot failed: %d\n", ret);
+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;
 
        ret = avs_ipc_get_hw_config(adev, &adev->hw_cfg);
        if (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);
+}