mask = BIT_MASK(core_id); if (mask == AVS_MAIN_CORE_MASK) /* nothing to do for main core */ return 0; if (core_id >= adev->hw_cfg.dsp_cores) {
ret = -EINVAL; goto err;
}
adev->core_refs[core_id]++; if (adev->core_refs[core_id] == 1) { /* * No cores other than main-core can be running for DSP * to achieve d0ix. Conscious SET_D0IX IPC failure is permitted, * simply d0ix power state will no longer be attempted.
*/
ret = avs_dsp_disable_d0ix(adev); if (ret && ret != -AVS_EIPC) goto err_disable_d0ix;
ret = avs_dsp_enable(adev, mask); if (ret) goto err_enable_dsp;
}
mask = BIT_MASK(core_id); if (mask == AVS_MAIN_CORE_MASK) /* nothing to do for main core */ return 0; if (core_id >= adev->hw_cfg.dsp_cores) {
ret = -EINVAL; goto err;
}
adev->core_refs[core_id]--; if (!adev->core_refs[core_id]) {
ret = avs_dsp_disable(adev, mask); if (ret) goto err;
/* Match disable_d0ix in avs_dsp_get_core(). */
avs_dsp_enable_d0ix(adev);
}
id = avs_module_id_alloc(adev, module_id); if (id < 0) return id;
ret = avs_get_module_id_entry(adev, module_id, &mentry); if (ret) goto err_mod_entry;
ret = avs_dsp_get_core(adev, core_id); if (ret) goto err_mod_entry;
/* Load code into memory if this is the first instance. */ if (!id && !avs_module_entry_is_loaded(&mentry)) {
ret = avs_dsp_op(adev, transfer_mods, true, &mentry, 1); if (ret) {
dev_err(adev->dev, "load modules failed: %d\n", ret); goto err_mod_entry;
}
was_loaded = true;
}
ret = avs_ipc_init_instance(adev, module_id, id, ppl_instance_id,
core_id, domain, param, param_size); if (ret) {
ret = AVS_IPC_RET(ret); goto err_ipc;
}
/* Modules not owned by any pipeline need to be freed explicitly. */ if (ppl_instance_id == INVALID_PIPELINE_ID)
avs_ipc_delete_instance(adev, module_id, instance_id);
avs_module_id_free(adev, module_id, instance_id);
ret = avs_get_module_id_entry(adev, module_id, &mentry); /* Unload occupied memory if this was the last instance. */ if (!ret && mentry.type.load_type == AVS_MODULE_LOAD_TYPE_LOADABLE) { if (avs_is_module_ida_empty(adev, module_id)) {
ret = avs_dsp_op(adev, transfer_mods, false, &mentry, 1); if (ret)
dev_err(adev->dev, "unload modules failed: %d\n", ret);
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.