Lines Matching refs:sdev

18 static int get_ext_windows(struct snd_sof_dev *sdev,  in get_ext_windows()  argument
27 if (sdev->info_window) { in get_ext_windows()
28 if (memcmp(sdev->info_window, w, ext_hdr->hdr.size)) { in get_ext_windows()
29 …dev_err(sdev->dev, "error: mismatch between window descriptor from extended manifest and mailbox"); in get_ext_windows()
36 sdev->info_window = devm_kmemdup(sdev->dev, w, ext_hdr->hdr.size, in get_ext_windows()
38 if (!sdev->info_window) in get_ext_windows()
44 static int get_cc_info(struct snd_sof_dev *sdev, in get_cc_info() argument
52 if (sdev->cc_version) { in get_cc_info()
53 if (memcmp(sdev->cc_version, cc, cc->ext_hdr.hdr.size)) { in get_cc_info()
54 dev_err(sdev->dev, "error: receive diverged cc_version descriptions"); in get_cc_info()
60 dev_dbg(sdev->dev, "Firmware info: used compiler %s %d:%d:%d%s used optimization flags %s\n", in get_cc_info()
66 if (sdev->first_boot) { in get_cc_info()
67 sdev->cc_version = devm_kmalloc(sdev->dev, cc->ext_hdr.hdr.size, in get_cc_info()
70 if (!sdev->cc_version) in get_cc_info()
73 memcpy(sdev->cc_version, cc, cc->ext_hdr.hdr.size); in get_cc_info()
74 ret = snd_sof_debugfs_buf_item(sdev, sdev->cc_version, in get_cc_info()
80 dev_err(sdev->dev, "error: snd_sof_debugfs_buf_item failed\n"); in get_cc_info()
89 int snd_sof_fw_parse_ext_data(struct snd_sof_dev *sdev, u32 bar, u32 offset) in snd_sof_fw_parse_ext_data() argument
100 snd_sof_dsp_block_read(sdev, bar, offset, ext_data, in snd_sof_fw_parse_ext_data()
106 snd_sof_dsp_block_read(sdev, bar, offset + sizeof(*ext_hdr), in snd_sof_fw_parse_ext_data()
110 dev_dbg(sdev->dev, "found ext header type %d size 0x%x\n", in snd_sof_fw_parse_ext_data()
116 ret = get_ext_windows(sdev, ext_hdr); in snd_sof_fw_parse_ext_data()
119 ret = get_cc_info(sdev, ext_hdr); in snd_sof_fw_parse_ext_data()
127 dev_info(sdev->dev, "unknown ext header type %d size 0x%x\n", in snd_sof_fw_parse_ext_data()
134 dev_err(sdev->dev, "error: failed to parse ext data type %d\n", in snd_sof_fw_parse_ext_data()
141 snd_sof_dsp_block_read(sdev, bar, offset, ext_data, in snd_sof_fw_parse_ext_data()
151 static int ext_man_get_fw_version(struct snd_sof_dev *sdev, in ext_man_get_fw_version() argument
157 memcpy(&sdev->fw_ready.version, &v->version, sizeof(v->version)); in ext_man_get_fw_version()
158 sdev->fw_ready.flags = v->flags; in ext_man_get_fw_version()
161 return snd_sof_ipc_valid(sdev); in ext_man_get_fw_version()
164 static int ext_man_get_windows(struct snd_sof_dev *sdev, in ext_man_get_windows() argument
171 return get_ext_windows(sdev, &w->ipc_window.ext_hdr); in ext_man_get_windows()
174 static int ext_man_get_cc_info(struct snd_sof_dev *sdev, in ext_man_get_cc_info() argument
181 return get_cc_info(sdev, &cc->cc_version.ext_hdr); in ext_man_get_cc_info()
184 static int ext_man_get_dbg_abi_info(struct snd_sof_dev *sdev, in ext_man_get_dbg_abi_info() argument
190 if (sdev->first_boot) in ext_man_get_dbg_abi_info()
191 dev_dbg(sdev->dev, in ext_man_get_dbg_abi_info()
200 static int ext_man_get_config_data(struct snd_sof_dev *sdev, in ext_man_get_config_data() argument
215 dev_dbg(sdev->dev, "%s can hold up to %d config elements\n", in ext_man_get_config_data()
220 dev_dbg(sdev->dev, "%s get index %d token %d val %d\n", in ext_man_get_config_data()
230 if (sdev->first_boot && elem->value) in ext_man_get_config_data()
231 ret = snd_sof_dbg_memory_info_init(sdev); in ext_man_get_config_data()
234 dev_info(sdev->dev, "Unknown firmware configuration token %d value %d", in ext_man_get_config_data()
239 …dev_err(sdev->dev, "error: processing sof_ext_man_config_data failed for token %d value 0x%x, %d\n… in ext_man_get_config_data()
274 static int snd_sof_fw_ext_man_parse(struct snd_sof_dev *sdev, in snd_sof_fw_ext_man_parse() argument
295 dev_err(sdev->dev, "error: extended manifest version 0x%X differ from used 0x%X\n", in snd_sof_fw_ext_man_parse()
306 dev_dbg(sdev->dev, "found sof_ext_man header type %d size 0x%X\n", in snd_sof_fw_ext_man_parse()
311 dev_err(sdev->dev, "error: invalid sof_ext_man header size, type %d size 0x%X\n", in snd_sof_fw_ext_man_parse()
319 ret = ext_man_get_fw_version(sdev, elem_hdr); in snd_sof_fw_ext_man_parse()
322 ret = ext_man_get_windows(sdev, elem_hdr); in snd_sof_fw_ext_man_parse()
325 ret = ext_man_get_cc_info(sdev, elem_hdr); in snd_sof_fw_ext_man_parse()
328 ret = ext_man_get_dbg_abi_info(sdev, elem_hdr); in snd_sof_fw_ext_man_parse()
331 ret = ext_man_get_config_data(sdev, elem_hdr); in snd_sof_fw_ext_man_parse()
334 ret = snd_sof_dsp_parse_platform_ext_manifest(sdev, elem_hdr); in snd_sof_fw_ext_man_parse()
337 dev_info(sdev->dev, "unknown sof_ext_man header type %d size 0x%X\n", in snd_sof_fw_ext_man_parse()
343 dev_err(sdev->dev, "error: failed to parse sof_ext_man header type %d size 0x%X\n", in snd_sof_fw_ext_man_parse()
353 dev_err(sdev->dev, "error: sof_ext_man header is inconsistent\n"); in snd_sof_fw_ext_man_parse()
363 static void sof_get_windows(struct snd_sof_dev *sdev) in sof_get_windows() argument
378 if (!sdev->info_window) { in sof_get_windows()
379 dev_err(sdev->dev, "error: have no window info\n"); in sof_get_windows()
383 bar = snd_sof_dsp_get_bar_index(sdev, SOF_FW_BLK_TYPE_SRAM); in sof_get_windows()
385 dev_err(sdev->dev, "error: have no bar mapping\n"); in sof_get_windows()
389 for (i = 0; i < sdev->info_window->num_windows; i++) { in sof_get_windows()
390 elem = &sdev->info_window->window[i]; in sof_get_windows()
392 window_offset = snd_sof_dsp_get_window_offset(sdev, elem->id); in sof_get_windows()
394 dev_warn(sdev->dev, "warn: no offset for window %d\n", in sof_get_windows()
403 snd_sof_debugfs_io_item(sdev, in sof_get_windows()
404 sdev->bar[bar] + in sof_get_windows()
412 snd_sof_debugfs_io_item(sdev, in sof_get_windows()
413 sdev->bar[bar] + in sof_get_windows()
419 snd_sof_debugfs_io_item(sdev, in sof_get_windows()
420 sdev->bar[bar] + in sof_get_windows()
429 snd_sof_debugfs_io_item(sdev, in sof_get_windows()
430 sdev->bar[bar] + in sof_get_windows()
439 snd_sof_debugfs_io_item(sdev, in sof_get_windows()
440 sdev->bar[bar] + in sof_get_windows()
446 snd_sof_debugfs_io_item(sdev, in sof_get_windows()
447 sdev->bar[bar] + in sof_get_windows()
454 sdev->dsp_oops_offset = window_offset + elem->offset; in sof_get_windows()
455 snd_sof_debugfs_io_item(sdev, in sof_get_windows()
456 sdev->bar[bar] + in sof_get_windows()
463 dev_err(sdev->dev, "error: get illegal window info\n"); in sof_get_windows()
469 dev_err(sdev->dev, "error: get illegal mailbox window\n"); in sof_get_windows()
473 snd_sof_dsp_mailbox_init(sdev, inbox_offset, inbox_size, in sof_get_windows()
475 sdev->stream_box.offset = stream_offset; in sof_get_windows()
476 sdev->stream_box.size = stream_size; in sof_get_windows()
478 sdev->debug_box.offset = debug_offset; in sof_get_windows()
479 sdev->debug_box.size = debug_size; in sof_get_windows()
481 dev_dbg(sdev->dev, " mailbox upstream 0x%x - size 0x%x\n", in sof_get_windows()
483 dev_dbg(sdev->dev, " mailbox downstream 0x%x - size 0x%x\n", in sof_get_windows()
485 dev_dbg(sdev->dev, " stream region 0x%x - size 0x%x\n", in sof_get_windows()
487 dev_dbg(sdev->dev, " debug region 0x%x - size 0x%x\n", in sof_get_windows()
492 int sof_fw_ready(struct snd_sof_dev *sdev, u32 msg_id) in sof_fw_ready() argument
494 struct sof_ipc_fw_ready *fw_ready = &sdev->fw_ready; in sof_fw_ready()
500 offset = snd_sof_dsp_get_mailbox_offset(sdev); in sof_fw_ready()
502 dev_err(sdev->dev, "error: have no mailbox offset\n"); in sof_fw_ready()
506 bar = snd_sof_dsp_get_bar_index(sdev, SOF_FW_BLK_TYPE_SRAM); in sof_fw_ready()
508 dev_err(sdev->dev, "error: have no bar mapping\n"); in sof_fw_ready()
512 dev_dbg(sdev->dev, "ipc: DSP is ready 0x%8.8x offset 0x%x\n", in sof_fw_ready()
516 if (!sdev->first_boot) in sof_fw_ready()
520 snd_sof_dsp_block_read(sdev, bar, offset, fw_ready, sizeof(*fw_ready)); in sof_fw_ready()
523 ret = snd_sof_ipc_valid(sdev); in sof_fw_ready()
528 snd_sof_fw_parse_ext_data(sdev, bar, offset + in sof_fw_ready()
531 sof_get_windows(sdev); in sof_fw_ready()
538 int snd_sof_parse_module_memcpy(struct snd_sof_dev *sdev, in snd_sof_parse_module_memcpy() argument
546 dev_dbg(sdev->dev, "new module size 0x%x blocks 0x%x type 0x%x\n", in snd_sof_parse_module_memcpy()
556 dev_err(sdev->dev, "error: not enough data remaining\n"); in snd_sof_parse_module_memcpy()
564 dev_warn(sdev->dev, in snd_sof_parse_module_memcpy()
566 dev_warn(sdev->dev, " type 0x%x offset 0x%x\n", in snd_sof_parse_module_memcpy()
579 bar = snd_sof_dsp_get_bar_index(sdev, block->type); in snd_sof_parse_module_memcpy()
581 dev_err(sdev->dev, in snd_sof_parse_module_memcpy()
588 dev_err(sdev->dev, "error: bad type 0x%x for block 0x%x\n", in snd_sof_parse_module_memcpy()
593 dev_dbg(sdev->dev, in snd_sof_parse_module_memcpy()
599 dev_err(sdev->dev, "error: invalid block size 0x%x\n", in snd_sof_parse_module_memcpy()
603 snd_sof_dsp_block_write(sdev, bar, offset, in snd_sof_parse_module_memcpy()
607 dev_err(sdev->dev, "error: not enough data remaining\n"); in snd_sof_parse_module_memcpy()
622 static int check_header(struct snd_sof_dev *sdev, const struct firmware *fw, in check_header() argument
629 dev_err(sdev->dev, "error: firmware size must be greater than firmware offset\n"); in check_header()
638 dev_err(sdev->dev, "error: invalid firmware signature\n"); in check_header()
644 dev_err(sdev->dev, "error: invalid filesize mismatch got 0x%zx expected 0x%zx\n", in check_header()
649 dev_dbg(sdev->dev, "header size=0x%x modules=0x%x abi=0x%x size=%zu\n", in check_header()
656 static int load_modules(struct snd_sof_dev *sdev, const struct firmware *fw, in load_modules() argument
667 load_module = sof_ops(sdev)->load_module; in load_modules()
677 dev_err(sdev->dev, "error: fw size smaller than header size\n"); in load_modules()
684 dev_err(sdev->dev, "error: not enough data remaining\n"); in load_modules()
692 ret = load_module(sdev, module); in load_modules()
694 dev_err(sdev->dev, "error: invalid module %d\n", count); in load_modules()
699 dev_err(sdev->dev, "error: not enough data remaining\n"); in load_modules()
712 int snd_sof_load_firmware_raw(struct snd_sof_dev *sdev) in snd_sof_load_firmware_raw() argument
714 struct snd_sof_pdata *plat_data = sdev->pdata; in snd_sof_load_firmware_raw()
729 ret = request_firmware(&plat_data->fw, fw_filename, sdev->dev); in snd_sof_load_firmware_raw()
732 dev_err(sdev->dev, in snd_sof_load_firmware_raw()
734 dev_err(sdev->dev, in snd_sof_load_firmware_raw()
738 dev_dbg(sdev->dev, "request_firmware %s successful\n", in snd_sof_load_firmware_raw()
743 ext_man_size = snd_sof_fw_ext_man_parse(sdev, plat_data->fw); in snd_sof_load_firmware_raw()
749 dev_dbg(sdev->dev, "firmware doesn't contain extended manifest\n"); in snd_sof_load_firmware_raw()
752 dev_err(sdev->dev, "error: firmware %s contains unsupported or invalid extended manifest: %d\n", in snd_sof_load_firmware_raw()
763 int snd_sof_load_firmware_memcpy(struct snd_sof_dev *sdev) in snd_sof_load_firmware_memcpy() argument
765 struct snd_sof_pdata *plat_data = sdev->pdata; in snd_sof_load_firmware_memcpy()
768 ret = snd_sof_load_firmware_raw(sdev); in snd_sof_load_firmware_memcpy()
773 ret = check_header(sdev, plat_data->fw, plat_data->fw_offset); in snd_sof_load_firmware_memcpy()
775 dev_err(sdev->dev, "error: invalid FW header\n"); in snd_sof_load_firmware_memcpy()
780 ret = snd_sof_dsp_reset(sdev); in snd_sof_load_firmware_memcpy()
782 dev_err(sdev->dev, "error: failed to reset DSP\n"); in snd_sof_load_firmware_memcpy()
787 ret = load_modules(sdev, plat_data->fw, plat_data->fw_offset); in snd_sof_load_firmware_memcpy()
789 dev_err(sdev->dev, "error: invalid FW modules\n"); in snd_sof_load_firmware_memcpy()
803 int snd_sof_load_firmware(struct snd_sof_dev *sdev) in snd_sof_load_firmware() argument
805 dev_dbg(sdev->dev, "loading firmware\n"); in snd_sof_load_firmware()
807 if (sof_ops(sdev)->load_firmware) in snd_sof_load_firmware()
808 return sof_ops(sdev)->load_firmware(sdev); in snd_sof_load_firmware()
813 int snd_sof_run_firmware(struct snd_sof_dev *sdev) in snd_sof_run_firmware() argument
817 init_waitqueue_head(&sdev->boot_wait); in snd_sof_run_firmware()
820 if (sdev->first_boot) { in snd_sof_run_firmware()
821 ret = snd_sof_debugfs_buf_item(sdev, &sdev->fw_version, in snd_sof_run_firmware()
822 sizeof(sdev->fw_version), in snd_sof_run_firmware()
826 dev_err(sdev->dev, "error: snd_sof_debugfs_buf_item failed\n"); in snd_sof_run_firmware()
832 ret = snd_sof_dsp_pre_fw_run(sdev); in snd_sof_run_firmware()
834 dev_err(sdev->dev, "error: failed pre fw run op\n"); in snd_sof_run_firmware()
838 dev_dbg(sdev->dev, "booting DSP firmware\n"); in snd_sof_run_firmware()
841 ret = snd_sof_dsp_run(sdev); in snd_sof_run_firmware()
843 dev_err(sdev->dev, "error: failed to reset DSP\n"); in snd_sof_run_firmware()
853 ret = wait_event_timeout(sdev->boot_wait, in snd_sof_run_firmware()
854 sdev->fw_state > SOF_FW_BOOT_IN_PROGRESS, in snd_sof_run_firmware()
855 msecs_to_jiffies(sdev->boot_timeout)); in snd_sof_run_firmware()
857 dev_err(sdev->dev, "error: firmware boot failure\n"); in snd_sof_run_firmware()
858 snd_sof_dsp_dbg_dump(sdev, SOF_DBG_DUMP_REGS | SOF_DBG_DUMP_MBOX | in snd_sof_run_firmware()
860 sdev->fw_state = SOF_FW_BOOT_FAILED; in snd_sof_run_firmware()
864 if (sdev->fw_state == SOF_FW_BOOT_COMPLETE) in snd_sof_run_firmware()
865 dev_dbg(sdev->dev, "firmware boot complete\n"); in snd_sof_run_firmware()
870 ret = snd_sof_dsp_post_fw_run(sdev); in snd_sof_run_firmware()
872 dev_err(sdev->dev, "error: failed post fw run op\n"); in snd_sof_run_firmware()
880 void snd_sof_fw_unload(struct snd_sof_dev *sdev) in snd_sof_fw_unload() argument
883 release_firmware(sdev->pdata->fw); in snd_sof_fw_unload()
884 sdev->pdata->fw = NULL; in snd_sof_fw_unload()