Message ID | 20220207122108.3780926-10-cezary.rojewski@intel.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | ASoC: Intel: AVS - Audio DSP for cAVS | expand |
On 2/7/22 06:21, Cezary Rojewski wrote: > ROM requests are messages initiated by Host to alter firmware early boot > process. They specify whether the next boot should be a fresh start or if > IMR can be used to speed things up. 'can' is an imprecise term in technical documentation. did you mean 'shall' (requirement), 'may' (permission) or 'should' (recommendation)? It's my understanding that it's legal to redo a complete reboot from a clean-slate. It's also unclear if the firmware can use this mechanism to prevent the use of IMR, e.g. if in some firmware builds state save/restore was disabled for some reason.
On 2022-02-25 2:42 AM, Pierre-Louis Bossart wrote: > On 2/7/22 06:21, Cezary Rojewski wrote: >> ROM requests are messages initiated by Host to alter firmware early boot >> process. They specify whether the next boot should be a fresh start or if >> IMR can be used to speed things up. > > 'can' is an imprecise term in technical documentation. > > did you mean 'shall' (requirement), 'may' (permission) or 'should' > (recommendation)? > > It's my understanding that it's legal to redo a complete reboot from a > clean-slate. > > It's also unclear if the firmware can use this mechanism to prevent the > use of IMR, e.g. if in some firmware builds state save/restore was > disabled for some reason. This is a very good feedback, indeed I miss out on the 'can' vs 'shall' (and similar) quite often when speaking about hw/fw procedures. Thank you for paying attention, Pierre. Yes, in this case driver has total control over the procedure and chooses which method to use when booting the DSP. While I can't say the details, closed-source firmware (from APL and onwards) is built with IMR in mind. By that I mean that it assumes IMR is always present. So I believe such scenario - having save/restore disabled - is not possible here.
diff --git a/sound/soc/intel/avs/messages.c b/sound/soc/intel/avs/messages.c index 1b589689410f..b7a4ba6717b7 100644 --- a/sound/soc/intel/avs/messages.c +++ b/sound/soc/intel/avs/messages.c @@ -12,6 +12,24 @@ #define AVS_CL_TIMEOUT_MS 5000 +int avs_ipc_set_boot_config(struct avs_dev *adev, u32 dma_id, u32 purge) +{ + union avs_global_msg msg = AVS_GLOBAL_REQUEST(ROM_CONTROL); + struct avs_ipc_msg request = {0}; + int ret; + + msg.boot_cfg.rom_ctrl_msg_type = AVS_ROM_SET_BOOT_CONFIG; + msg.boot_cfg.dma_id = dma_id; + msg.boot_cfg.purge_request = purge; + request.header = msg.val; + + ret = avs_dsp_send_rom_msg(adev, &request); + if (ret) + avs_ipc_err(adev, &request, "set boot config", ret); + + return ret; +} + int avs_ipc_load_modules(struct avs_dev *adev, u16 *mod_ids, u32 num_mod_ids) { union avs_global_msg msg = AVS_GLOBAL_REQUEST(LOAD_MULTIPLE_MODULES); diff --git a/sound/soc/intel/avs/messages.h b/sound/soc/intel/avs/messages.h index bbdba4631b1f..580229772395 100644 --- a/sound/soc/intel/avs/messages.h +++ b/sound/soc/intel/avs/messages.h @@ -24,6 +24,7 @@ enum avs_msg_direction { }; enum avs_global_msg_type { + AVS_GLB_ROM_CONTROL = 1, AVS_GLB_LOAD_MULTIPLE_MODULES = 15, AVS_GLB_UNLOAD_MULTIPLE_MODULES = 16, AVS_GLB_CREATE_PIPELINE = 17, @@ -45,6 +46,12 @@ union avs_global_msg { u32 msg_direction:1; u32 msg_target:1; }; + /* set boot config */ + struct { + u32 rom_ctrl_msg_type:9; + u32 dma_id:5; + u32 purge_request:1; + } boot_cfg; /* module loading */ struct { u32 mod_cnt:8; @@ -260,6 +267,13 @@ struct avs_notify_mod_data { u32 data[]; } __packed; +/* ROM messages */ +enum avs_rom_control_msg_type { + AVS_ROM_SET_BOOT_CONFIG = 0, +}; + +int avs_ipc_set_boot_config(struct avs_dev *adev, u32 dma_id, u32 purge); + /* Code loading messages */ int avs_ipc_load_modules(struct avs_dev *adev, u16 *mod_ids, u32 num_mod_ids); int avs_ipc_unload_modules(struct avs_dev *adev, u16 *mod_ids, u32 num_mod_ids);