Lines Matching refs:adev

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