|
19 | 19 | #define CREATE_TRACE_POINTS |
20 | 20 | #include <trace/events/sof.h> |
21 | 21 |
|
| 22 | +/* Module parameters for firmware, topology and IPC type override */ |
| 23 | +static char *override_fw_path; |
| 24 | +module_param_named(fw_path, override_fw_path, charp, 0444); |
| 25 | +MODULE_PARM_DESC(fw_path, "alternate path for SOF firmware."); |
| 26 | + |
| 27 | +static char *override_fw_filename; |
| 28 | +module_param_named(fw_filename, override_fw_filename, charp, 0444); |
| 29 | +MODULE_PARM_DESC(fw_filename, "alternate filename for SOF firmware."); |
| 30 | + |
| 31 | +static char *override_lib_path; |
| 32 | +module_param_named(lib_path, override_lib_path, charp, 0444); |
| 33 | +MODULE_PARM_DESC(lib_path, "alternate path for SOF firmware libraries."); |
| 34 | + |
| 35 | +static char *override_tplg_path; |
| 36 | +module_param_named(tplg_path, override_tplg_path, charp, 0444); |
| 37 | +MODULE_PARM_DESC(tplg_path, "alternate path for SOF topology."); |
| 38 | + |
| 39 | +static char *override_tplg_filename; |
| 40 | +module_param_named(tplg_filename, override_tplg_filename, charp, 0444); |
| 41 | +MODULE_PARM_DESC(tplg_filename, "alternate filename for SOF topology."); |
| 42 | + |
| 43 | +static int override_ipc_type = -1; |
| 44 | +module_param_named(ipc_type, override_ipc_type, int, 0444); |
| 45 | +MODULE_PARM_DESC(ipc_type, "Force SOF IPC type. 0 - IPC3, 1 - IPC4"); |
| 46 | + |
22 | 47 | /* see SOF_DBG_ flags */ |
23 | 48 | static int sof_core_debug = IS_ENABLED(CONFIG_SND_SOC_SOF_DEBUG_ENABLE_FIRMWARE_TRACE); |
24 | 49 | module_param_named(sof_debug, sof_core_debug, int, 0444); |
25 | 50 | MODULE_PARM_DESC(sof_debug, "SOF core debug options (0x0 all off)"); |
26 | 51 |
|
| 52 | +#if IS_ENABLED(CONFIG_SND_SOC_SOF_DEBUG) |
| 53 | +static unsigned int sof_ipc_timeout_ms; |
| 54 | +static unsigned int sof_boot_timeout_ms; |
| 55 | +module_param_named(ipc_timeout, sof_ipc_timeout_ms, uint, 0444); |
| 56 | +MODULE_PARM_DESC(ipc_timeout, |
| 57 | + "Set the IPC timeout value in ms (0 to use the platform default)"); |
| 58 | +module_param_named(boot_timeout, sof_boot_timeout_ms, uint, 0444); |
| 59 | +MODULE_PARM_DESC(boot_timeout, |
| 60 | + "Set the DSP boot timeout value in ms (0 to use the platform default)"); |
| 61 | +#endif |
| 62 | + |
27 | 63 | /* SOF defaults if not provided by the platform in ms */ |
28 | 64 | #define TIMEOUT_DEFAULT_IPC_MS 500 |
29 | 65 | #define TIMEOUT_DEFAULT_BOOT_MS 2000 |
@@ -570,6 +606,23 @@ static void sof_probe_work(struct work_struct *work) |
570 | 606 | } |
571 | 607 | } |
572 | 608 |
|
| 609 | +static void |
| 610 | +sof_apply_profile_override(struct sof_loadable_file_profile *path_override) |
| 611 | +{ |
| 612 | + if (override_ipc_type >= 0 && override_ipc_type < SOF_IPC_TYPE_COUNT) |
| 613 | + path_override->ipc_type = override_ipc_type; |
| 614 | + if (override_fw_path) |
| 615 | + path_override->fw_path = override_fw_path; |
| 616 | + if (override_fw_filename) |
| 617 | + path_override->fw_name = override_fw_filename; |
| 618 | + if (override_lib_path) |
| 619 | + path_override->fw_lib_path = override_lib_path; |
| 620 | + if (override_tplg_path) |
| 621 | + path_override->tplg_path = override_tplg_path; |
| 622 | + if (override_tplg_filename) |
| 623 | + path_override->tplg_name = override_tplg_filename; |
| 624 | +} |
| 625 | + |
573 | 626 | int snd_sof_device_probe(struct device *dev, struct snd_sof_pdata *plat_data) |
574 | 627 | { |
575 | 628 | struct snd_sof_dev *sdev; |
@@ -601,6 +654,8 @@ int snd_sof_device_probe(struct device *dev, struct snd_sof_pdata *plat_data) |
601 | 654 | } |
602 | 655 | } |
603 | 656 |
|
| 657 | + sof_apply_profile_override(&plat_data->ipc_file_profile_base); |
| 658 | + |
604 | 659 | /* Initialize sof_ops based on the initial selected IPC version */ |
605 | 660 | ret = sof_init_sof_ops(sdev); |
606 | 661 | if (ret) |
@@ -632,6 +687,15 @@ int snd_sof_device_probe(struct device *dev, struct snd_sof_pdata *plat_data) |
632 | 687 | else |
633 | 688 | sdev->boot_timeout = plat_data->desc->boot_timeout; |
634 | 689 |
|
| 690 | +#if IS_ENABLED(CONFIG_SND_SOC_SOF_DEBUG) |
| 691 | + /* Override the timeout values with module parameter, if set */ |
| 692 | + if (sof_ipc_timeout_ms) |
| 693 | + sdev->ipc_timeout = sof_ipc_timeout_ms; |
| 694 | + |
| 695 | + if (sof_boot_timeout_ms) |
| 696 | + sdev->boot_timeout = sof_boot_timeout_ms; |
| 697 | +#endif |
| 698 | + |
635 | 699 | sof_set_fw_state(sdev, SOF_FW_BOOT_NOT_STARTED); |
636 | 700 |
|
637 | 701 | /* |
|
0 commit comments