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_warn(sdev->dev, "warning: 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()
226 static int snd_sof_fw_ext_man_parse(struct snd_sof_dev *sdev, in snd_sof_fw_ext_man_parse() argument
247 dev_err(sdev->dev, "error: extended manifest version 0x%X differ from used 0x%X\n", in snd_sof_fw_ext_man_parse()
258 dev_dbg(sdev->dev, "found sof_ext_man header type %d size 0x%X\n", in snd_sof_fw_ext_man_parse()
263 dev_err(sdev->dev, "error: invalid sof_ext_man header size, type %d size 0x%X\n", in snd_sof_fw_ext_man_parse()
271 ret = ext_man_get_fw_version(sdev, elem_hdr); in snd_sof_fw_ext_man_parse()
274 ret = ext_man_get_windows(sdev, elem_hdr); in snd_sof_fw_ext_man_parse()
277 ret = ext_man_get_cc_info(sdev, elem_hdr); in snd_sof_fw_ext_man_parse()
280 ret = ext_man_get_dbg_abi_info(sdev, elem_hdr); in snd_sof_fw_ext_man_parse()
283 dev_warn(sdev->dev, "warning: unknown sof_ext_man header type %d size 0x%X\n", in snd_sof_fw_ext_man_parse()
289 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()
299 dev_err(sdev->dev, "error: sof_ext_man header is inconsistent\n"); in snd_sof_fw_ext_man_parse()
309 static void sof_get_windows(struct snd_sof_dev *sdev) in sof_get_windows() argument
324 if (!sdev->info_window) { in sof_get_windows()
325 dev_err(sdev->dev, "error: have no window info\n"); in sof_get_windows()
329 bar = snd_sof_dsp_get_bar_index(sdev, SOF_FW_BLK_TYPE_SRAM); in sof_get_windows()
331 dev_err(sdev->dev, "error: have no bar mapping\n"); in sof_get_windows()
335 for (i = 0; i < sdev->info_window->num_windows; i++) { in sof_get_windows()
336 elem = &sdev->info_window->window[i]; in sof_get_windows()
338 window_offset = snd_sof_dsp_get_window_offset(sdev, elem->id); in sof_get_windows()
340 dev_warn(sdev->dev, "warn: no offset for window %d\n", in sof_get_windows()
349 snd_sof_debugfs_io_item(sdev, in sof_get_windows()
350 sdev->bar[bar] + in sof_get_windows()
358 snd_sof_debugfs_io_item(sdev, in sof_get_windows()
359 sdev->bar[bar] + in sof_get_windows()
365 snd_sof_debugfs_io_item(sdev, in sof_get_windows()
366 sdev->bar[bar] + in sof_get_windows()
375 snd_sof_debugfs_io_item(sdev, in sof_get_windows()
376 sdev->bar[bar] + in sof_get_windows()
385 snd_sof_debugfs_io_item(sdev, in sof_get_windows()
386 sdev->bar[bar] + in sof_get_windows()
392 snd_sof_debugfs_io_item(sdev, in sof_get_windows()
393 sdev->bar[bar] + in sof_get_windows()
400 sdev->dsp_oops_offset = window_offset + elem->offset; in sof_get_windows()
401 snd_sof_debugfs_io_item(sdev, in sof_get_windows()
402 sdev->bar[bar] + in sof_get_windows()
409 dev_err(sdev->dev, "error: get illegal window info\n"); in sof_get_windows()
415 dev_err(sdev->dev, "error: get illegal mailbox window\n"); in sof_get_windows()
419 snd_sof_dsp_mailbox_init(sdev, inbox_offset, inbox_size, in sof_get_windows()
421 sdev->stream_box.offset = stream_offset; in sof_get_windows()
422 sdev->stream_box.size = stream_size; in sof_get_windows()
424 sdev->debug_box.offset = debug_offset; in sof_get_windows()
425 sdev->debug_box.size = debug_size; in sof_get_windows()
427 dev_dbg(sdev->dev, " mailbox upstream 0x%x - size 0x%x\n", in sof_get_windows()
429 dev_dbg(sdev->dev, " mailbox downstream 0x%x - size 0x%x\n", in sof_get_windows()
431 dev_dbg(sdev->dev, " stream region 0x%x - size 0x%x\n", in sof_get_windows()
433 dev_dbg(sdev->dev, " debug region 0x%x - size 0x%x\n", in sof_get_windows()
438 int sof_fw_ready(struct snd_sof_dev *sdev, u32 msg_id) in sof_fw_ready() argument
440 struct sof_ipc_fw_ready *fw_ready = &sdev->fw_ready; in sof_fw_ready()
446 offset = snd_sof_dsp_get_mailbox_offset(sdev); in sof_fw_ready()
448 dev_err(sdev->dev, "error: have no mailbox offset\n"); in sof_fw_ready()
452 bar = snd_sof_dsp_get_bar_index(sdev, SOF_FW_BLK_TYPE_SRAM); in sof_fw_ready()
454 dev_err(sdev->dev, "error: have no bar mapping\n"); in sof_fw_ready()
458 dev_dbg(sdev->dev, "ipc: DSP is ready 0x%8.8x offset 0x%x\n", in sof_fw_ready()
462 if (!sdev->first_boot) in sof_fw_ready()
466 sof_block_read(sdev, bar, offset, fw_ready, sizeof(*fw_ready)); in sof_fw_ready()
469 ret = snd_sof_ipc_valid(sdev); in sof_fw_ready()
474 snd_sof_fw_parse_ext_data(sdev, bar, offset + in sof_fw_ready()
477 sof_get_windows(sdev); in sof_fw_ready()
484 int snd_sof_parse_module_memcpy(struct snd_sof_dev *sdev, in snd_sof_parse_module_memcpy() argument
492 dev_dbg(sdev->dev, "new module size 0x%x blocks 0x%x type 0x%x\n", in snd_sof_parse_module_memcpy()
502 dev_err(sdev->dev, "error: not enough data remaining\n"); in snd_sof_parse_module_memcpy()
510 dev_warn(sdev->dev, in snd_sof_parse_module_memcpy()
512 dev_warn(sdev->dev, " type 0x%x offset 0x%x\n", in snd_sof_parse_module_memcpy()
525 bar = snd_sof_dsp_get_bar_index(sdev, block->type); in snd_sof_parse_module_memcpy()
527 dev_err(sdev->dev, in snd_sof_parse_module_memcpy()
534 dev_err(sdev->dev, "error: bad type 0x%x for block 0x%x\n", in snd_sof_parse_module_memcpy()
539 dev_dbg(sdev->dev, in snd_sof_parse_module_memcpy()
545 dev_err(sdev->dev, "error: invalid block size 0x%x\n", in snd_sof_parse_module_memcpy()
549 snd_sof_dsp_block_write(sdev, bar, offset, in snd_sof_parse_module_memcpy()
553 dev_err(sdev->dev, "error: not enough data remaining\n"); in snd_sof_parse_module_memcpy()
568 static int check_header(struct snd_sof_dev *sdev, const struct firmware *fw, in check_header() argument
575 dev_err(sdev->dev, "error: firmware size must be greater than firmware offset\n"); in check_header()
584 dev_err(sdev->dev, "error: invalid firmware signature\n"); in check_header()
590 dev_err(sdev->dev, "error: invalid filesize mismatch got 0x%zx expected 0x%zx\n", in check_header()
595 dev_dbg(sdev->dev, "header size=0x%x modules=0x%x abi=0x%x size=%zu\n", in check_header()
602 static int load_modules(struct snd_sof_dev *sdev, const struct firmware *fw, in load_modules() argument
613 load_module = sof_ops(sdev)->load_module; in load_modules()
623 dev_err(sdev->dev, "error: fw size smaller than header size\n"); in load_modules()
630 dev_err(sdev->dev, "error: not enough data remaining\n"); in load_modules()
638 ret = load_module(sdev, module); in load_modules()
640 dev_err(sdev->dev, "error: invalid module %d\n", count); in load_modules()
645 dev_err(sdev->dev, "error: not enough data remaining\n"); in load_modules()
658 int snd_sof_load_firmware_raw(struct snd_sof_dev *sdev) in snd_sof_load_firmware_raw() argument
660 struct snd_sof_pdata *plat_data = sdev->pdata; in snd_sof_load_firmware_raw()
675 ret = request_firmware(&plat_data->fw, fw_filename, sdev->dev); in snd_sof_load_firmware_raw()
678 dev_err(sdev->dev, "error: request firmware %s failed err: %d\n", in snd_sof_load_firmware_raw()
682 dev_dbg(sdev->dev, "request_firmware %s successful\n", in snd_sof_load_firmware_raw()
687 ext_man_size = snd_sof_fw_ext_man_parse(sdev, plat_data->fw); in snd_sof_load_firmware_raw()
693 dev_dbg(sdev->dev, "firmware doesn't contain extended manifest\n"); in snd_sof_load_firmware_raw()
696 dev_err(sdev->dev, "error: firmware %s contains unsupported or invalid extended manifest: %d\n", in snd_sof_load_firmware_raw()
707 int snd_sof_load_firmware_memcpy(struct snd_sof_dev *sdev) in snd_sof_load_firmware_memcpy() argument
709 struct snd_sof_pdata *plat_data = sdev->pdata; in snd_sof_load_firmware_memcpy()
712 ret = snd_sof_load_firmware_raw(sdev); in snd_sof_load_firmware_memcpy()
717 ret = check_header(sdev, plat_data->fw, plat_data->fw_offset); in snd_sof_load_firmware_memcpy()
719 dev_err(sdev->dev, "error: invalid FW header\n"); in snd_sof_load_firmware_memcpy()
724 ret = snd_sof_dsp_reset(sdev); in snd_sof_load_firmware_memcpy()
726 dev_err(sdev->dev, "error: failed to reset DSP\n"); in snd_sof_load_firmware_memcpy()
731 ret = load_modules(sdev, plat_data->fw, plat_data->fw_offset); in snd_sof_load_firmware_memcpy()
733 dev_err(sdev->dev, "error: invalid FW modules\n"); in snd_sof_load_firmware_memcpy()
747 int snd_sof_load_firmware(struct snd_sof_dev *sdev) in snd_sof_load_firmware() argument
749 dev_dbg(sdev->dev, "loading firmware\n"); in snd_sof_load_firmware()
751 if (sof_ops(sdev)->load_firmware) in snd_sof_load_firmware()
752 return sof_ops(sdev)->load_firmware(sdev); in snd_sof_load_firmware()
757 int snd_sof_run_firmware(struct snd_sof_dev *sdev) in snd_sof_run_firmware() argument
762 init_waitqueue_head(&sdev->boot_wait); in snd_sof_run_firmware()
765 if (sdev->first_boot) { in snd_sof_run_firmware()
766 ret = snd_sof_debugfs_buf_item(sdev, &sdev->fw_version, in snd_sof_run_firmware()
767 sizeof(sdev->fw_version), in snd_sof_run_firmware()
771 dev_err(sdev->dev, "error: snd_sof_debugfs_buf_item failed\n"); in snd_sof_run_firmware()
777 ret = snd_sof_dsp_pre_fw_run(sdev); in snd_sof_run_firmware()
779 dev_err(sdev->dev, "error: failed pre fw run op\n"); in snd_sof_run_firmware()
783 dev_dbg(sdev->dev, "booting DSP firmware\n"); in snd_sof_run_firmware()
786 ret = snd_sof_dsp_run(sdev); in snd_sof_run_firmware()
788 dev_err(sdev->dev, "error: failed to reset DSP\n"); in snd_sof_run_firmware()
800 ret = wait_event_timeout(sdev->boot_wait, in snd_sof_run_firmware()
801 sdev->fw_state > SOF_FW_BOOT_IN_PROGRESS, in snd_sof_run_firmware()
802 msecs_to_jiffies(sdev->boot_timeout)); in snd_sof_run_firmware()
804 dev_err(sdev->dev, "error: firmware boot failure\n"); in snd_sof_run_firmware()
805 snd_sof_dsp_dbg_dump(sdev, SOF_DBG_REGS | SOF_DBG_MBOX | in snd_sof_run_firmware()
807 sdev->fw_state = SOF_FW_BOOT_FAILED; in snd_sof_run_firmware()
811 if (sdev->fw_state == SOF_FW_BOOT_COMPLETE) in snd_sof_run_firmware()
812 dev_dbg(sdev->dev, "firmware boot complete\n"); in snd_sof_run_firmware()
817 ret = snd_sof_dsp_post_fw_run(sdev); in snd_sof_run_firmware()
819 dev_err(sdev->dev, "error: failed post fw run op\n"); in snd_sof_run_firmware()
824 sdev->enabled_cores_mask = init_core_mask; in snd_sof_run_firmware()
830 void snd_sof_fw_unload(struct snd_sof_dev *sdev) in snd_sof_fw_unload() argument
833 release_firmware(sdev->pdata->fw); in snd_sof_fw_unload()
834 sdev->pdata->fw = NULL; in snd_sof_fw_unload()