Lines Matching defs:adev

99 static int avs_fw_manifest_strip_verify(struct avs_dev *adev, struct firmware *fw,
123 dev_warn(adev->dev, "bad FW version %d.%d.%d.%d, expected %d.%d.%d.%d or newer\n",
135 int avs_cldma_load_basefw(struct avs_dev *adev, struct firmware *fw)
141 ret = avs_dsp_op(adev, power, AVS_MAIN_CORE_MASK, true);
145 ret = avs_dsp_op(adev, reset, AVS_MAIN_CORE_MASK, false);
151 dev_err(adev->dev, "cldma reset failed: %d\n", ret);
156 ret = avs_dsp_op(adev, stall, AVS_MAIN_CORE_MASK, false);
160 reinit_completion(&adev->fw_ready);
161 avs_dsp_op(adev, int_control, true);
164 ret = snd_hdac_adsp_readl_poll(adev, AVS_FW_REG_STATUS(adev), reg,
168 dev_err(adev->dev, "rom init timeout: %d\n", ret);
169 avs_dsp_core_disable(adev, AVS_MAIN_CORE_MASK);
176 ret = snd_hdac_adsp_readl_poll(adev, AVS_FW_REG_STATUS(adev), reg,
181 dev_err(adev->dev, "transfer fw failed: %d\n", ret);
182 avs_dsp_core_disable(adev, AVS_MAIN_CORE_MASK);
189 int avs_cldma_load_library(struct avs_dev *adev, struct firmware *lib, u32 id)
199 ret = avs_ipc_load_library(adev, 0, id);
204 dev_err(adev->dev, "transfer lib %d failed: %d\n", id, ret);
210 static int avs_cldma_load_module(struct avs_dev *adev, struct avs_module_entry *mentry)
218 adev->spec->name, mentry->uuid.b);
222 ret = avs_request_firmware(adev, &mod, mod_name);
227 avs_hda_power_gating_enable(adev, false);
228 avs_hda_clock_gating_enable(adev, false);
229 avs_hda_l1sen_enable(adev, false);
233 ret = avs_ipc_load_modules(adev, &mentry->module_id, 1);
236 avs_hda_l1sen_enable(adev, true);
237 avs_hda_clock_gating_enable(adev, true);
238 avs_hda_power_gating_enable(adev, true);
241 dev_err(adev->dev, "load module %d failed: %d\n", mentry->module_id, ret);
242 avs_release_last_firmware(adev);
249 int avs_cldma_transfer_modules(struct avs_dev *adev, bool load,
258 ret = avs_cldma_load_module(adev, &mods[i]);
273 ret = avs_ipc_unload_modules(adev, mod_ids, num_mods);
282 avs_hda_init_rom(struct avs_dev *adev, unsigned int dma_id, bool purge)
284 const struct avs_spec *const spec = adev->spec;
290 ret = avs_dsp_op(adev, power, spec->core_init_mask, true);
294 ret = avs_dsp_op(adev, reset, AVS_MAIN_CORE_MASK, false);
298 reinit_completion(&adev->fw_ready);
299 avs_dsp_op(adev, int_control, true);
302 ret = avs_ipc_set_boot_config(adev, dma_id, purge);
309 ret = snd_hdac_adsp_readq_poll(adev, spec->rom_status, reg,
314 dev_err(adev->dev, "rom init timeout: %d\n", ret);
320 ret = avs_dsp_op(adev, power, corex_mask, false);
328 avs_dsp_core_disable(adev, spec->core_init_mask);
332 static int avs_imr_load_basefw(struct avs_dev *adev)
337 ret = avs_hda_init_rom(adev, 0, false);
339 dev_err(adev->dev, "rom init failed: %d\n", ret);
343 ret = wait_for_completion_timeout(&adev->fw_ready,
346 dev_err(adev->dev, "firmware ready timeout\n");
347 avs_dsp_core_disable(adev, AVS_MAIN_CORE_MASK);
354 int avs_hda_load_basefw(struct avs_dev *adev, struct firmware *fw)
360 struct hdac_bus *bus = &adev->base.core;
390 ret = avs_hda_init_rom(adev, dma_id, true);
393 dev_info(adev->dev, "#%d rom init fail: %d\n", i + 1, ret);
400 ret = snd_hdac_adsp_readl_poll(adev, AVS_FW_REG_STATUS(adev), reg,
405 dev_err(adev->dev, "transfer fw failed: %d\n", ret);
406 avs_dsp_core_disable(adev, AVS_MAIN_CORE_MASK);
421 int avs_hda_load_library(struct avs_dev *adev, struct firmware *lib, u32 id)
427 struct hdac_bus *bus = &adev->base.core;
454 ret = avs_ipc_load_library(adev, stream->stream_tag - 1, id);
457 dev_err(adev->dev, "transfer lib %d failed: %d\n", id, ret);
472 int avs_hda_transfer_modules(struct avs_dev *adev, bool load,
482 int avs_dsp_load_libraries(struct avs_dev *adev, struct avs_tplg_library *libs, u32 num_libs)
488 for (id = 0; id < adev->fw_cfg.max_libs_count; id++)
489 if (adev->lib_names[id][0] == '\0')
491 if (id + num_libs >= adev->fw_cfg.max_libs_count)
502 filename = kasprintf(GFP_KERNEL, "%s/%s/%s", AVS_ROOT_DIR, adev->spec->name,
512 ret = avs_request_firmware(adev, &fw, filename);
518 ret = avs_fw_manifest_strip_verify(adev, &stripped_fw, NULL);
520 dev_err(adev->dev, "invalid library data: %d\n", ret);
531 if (!strncmp(adev->lib_names[j], man->name, AVS_LIB_NAME_SIZE))
534 ret = avs_dsp_op(adev, load_lib, &stripped_fw, id);
538 strncpy(adev->lib_names[id], man->name, AVS_LIB_NAME_SIZE);
547 static int avs_dsp_load_basefw(struct avs_dev *adev)
550 const struct avs_spec *const spec = adev->spec;
560 ret = avs_request_firmware(adev, &fw, filename);
563 dev_err(adev->dev, "request firmware failed: %d\n", ret);
568 min_req = &adev->spec->min_fw_version;
570 ret = avs_fw_manifest_strip_verify(adev, &stripped_fw, min_req);
572 dev_err(adev->dev, "invalid firmware data: %d\n", ret);
576 ret = avs_dsp_op(adev, load_basefw, &stripped_fw);
578 dev_err(adev->dev, "basefw load failed: %d\n", ret);
582 ret = wait_for_completion_timeout(&adev->fw_ready,
585 dev_err(adev->dev, "firmware ready timeout\n");
586 avs_dsp_core_disable(adev, AVS_MAIN_CORE_MASK);
594 avs_release_last_firmware(adev);
598 int avs_dsp_boot_firmware(struct avs_dev *adev, bool purge)
604 if (!purge && avs_platattr_test(adev, IMR)) {
605 ret = avs_imr_load_basefw(adev);
609 dev_dbg(adev->dev, "firmware flash from imr failed: %d\n", ret);
613 for (i = 1; i < adev->fw_cfg.max_libs_count; i++)
614 memset(adev->lib_names[i], 0, AVS_LIB_NAME_SIZE);
616 avs_hda_power_gating_enable(adev, false);
617 avs_hda_clock_gating_enable(adev, false);
618 avs_hda_l1sen_enable(adev, false);
620 ret = avs_dsp_load_basefw(adev);
624 mutex_lock(&adev->comp_list_mutex);
625 list_for_each_entry(acomp, &adev->comp_list, node) {
628 ret = avs_dsp_load_libraries(adev, tplg->libs, tplg->num_libs);
632 mutex_unlock(&adev->comp_list_mutex);
635 avs_hda_l1sen_enable(adev, true);
636 avs_hda_clock_gating_enable(adev, true);
637 avs_hda_power_gating_enable(adev, true);
643 ret = avs_module_info_init(adev, true);
645 dev_err(adev->dev, "init module info failed: %d\n", ret);
652 int avs_dsp_first_boot_firmware(struct avs_dev *adev)
656 if (avs_platattr_test(adev, CLDMA)) {
657 ret = hda_cldma_init(&code_loader, &adev->base.core,
658 adev->dsp_ba, AVS_CL_DEFAULT_BUFFER_SIZE);
660 dev_err(adev->dev, "cldma init failed: %d\n", ret);
665 ret = avs_dsp_boot_firmware(adev, true);
667 dev_err(adev->dev, "firmware boot failed: %d\n", ret);
671 ret = avs_ipc_get_hw_config(adev, &adev->hw_cfg);
673 dev_err(adev->dev, "get hw cfg failed: %d\n", ret);
677 ret = avs_ipc_get_fw_config(adev, &adev->fw_cfg);
679 dev_err(adev->dev, "get fw cfg failed: %d\n", ret);
683 adev->core_refs = devm_kcalloc(adev->dev, adev->hw_cfg.dsp_cores,
684 sizeof(*adev->core_refs), GFP_KERNEL);
685 adev->lib_names = devm_kcalloc(adev->dev, adev->fw_cfg.max_libs_count,
686 sizeof(*adev->lib_names), GFP_KERNEL);
687 if (!adev->core_refs || !adev->lib_names)
690 for (i = 0; i < adev->fw_cfg.max_libs_count; i++) {
691 adev->lib_names[i] = devm_kzalloc(adev->dev, AVS_LIB_NAME_SIZE, GFP_KERNEL);
692 if (!adev->lib_names[i])
697 strcpy(&adev->lib_names[0][0], "BASEFW");
699 ida_init(&adev->ppl_ida);