Lines Matching refs:sdev

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