diff mbox series

[09/17] ASoC: Intel: avs: Add ROM requests

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

Commit Message

Cezary Rojewski Feb. 7, 2022, 12:21 p.m. UTC
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.

Signed-off-by: Amadeusz Sławiński <amadeuszx.slawinski@linux.intel.com>
Signed-off-by: Cezary Rojewski <cezary.rojewski@intel.com>
---
 sound/soc/intel/avs/messages.c | 18 ++++++++++++++++++
 sound/soc/intel/avs/messages.h | 14 ++++++++++++++
 2 files changed, 32 insertions(+)

Comments

Pierre-Louis Bossart Feb. 25, 2022, 1:42 a.m. UTC | #1
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.
Cezary Rojewski Feb. 25, 2022, 7:19 p.m. UTC | #2
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 mbox series

Patch

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);