Unverified Commit ace9b3da authored by Peter Ujfalusi's avatar Peter Ujfalusi Committed by Mark Brown
Browse files

ASoC: SOF: ipc4/Intel: Add support for library restore firmware functionality



The firmware will be able to only save and restore the context related to
library management.
This means that even without a full context save, the libraries do not
need to be re-loaded to the firmware after second or consecutive boots.

This is reported via the FW_READY notification, where BIT(15) indicates:
0 - the library restore is not done
1 - library restore is done

This bit is only valid if full context save is not enabled, full context
save is by definition saves and restores the library related book-keeping
as well.

Add a new flag to tell the platform code if the libraries have been
restored, no need to reload them after boot.

Signed-off-by: default avatarPeter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: default avatarGuennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
Reviewed-by: default avatarLiam Girdwood <liam.r.girdwood@intel.com>
Reviewed-by: default avatarRanjani Sridharan <ranjani.sridharan@linux.intel.com>
Reviewed-by: default avatarBard Liao <yung-chuan.liao@linux.intel.com>
Reviewed-by: default avatarKai Vehmanen <kai.vehmanen@linux.intel.com>
Link: https://patch.msgid.link/20250619105623.4546-3-peter.ujfalusi@linux.intel.com


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent cec49fa4
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -498,6 +498,8 @@ struct sof_ipc4_intel_mic_privacy_cap {
#define SOF_IPC4_LOG_CORE_GET(x)		(((x) & SOF_IPC4_LOG_CORE_MASK) >> \
						 SOF_IPC4_LOG_CORE_SHIFT)

#define SOF_IPC4_FW_READY_LIB_RESTORED		BIT(15)

/* Value of notification type field - must fit into 8 bits */
enum sof_ipc4_notification_type {
	/* Phrase detected (notification from WoV module) */
+5 −2
Original line number Diff line number Diff line
@@ -579,8 +579,11 @@ int hda_dsp_ipc4_load_library(struct snd_sof_dev *sdev,
	struct sof_ipc4_msg msg = {};
	int ret, ret1;

	/* if IMR booting is enabled and fw context is saved for D3 state, skip the loading */
	if (reload && hda->booted_from_imr && ipc4_data->fw_context_save)
	/*
	 * if IMR booting is enabled and libraries have been restored during fw
	 * boot, skip the loading
	 */
	if (reload && hda->booted_from_imr && ipc4_data->libraries_restored)
		return 0;

	/* the fw_lib has been verified during loading, we can trust the validity here */
+6 −0
Original line number Diff line number Diff line
@@ -494,6 +494,12 @@ int sof_ipc4_query_fw_configuration(struct snd_sof_dev *sdev)
			break;
		case SOF_IPC4_FW_CONTEXT_SAVE:
			ipc4_data->fw_context_save = *tuple->value;
			/*
			 * Set the default libraries_restored value - if full
			 * context save is supported then it means that
			 * libraries are restored
			 */
			ipc4_data->libraries_restored = ipc4_data->fw_context_save;
			break;
		default:
			break;
+2 −0
Original line number Diff line number Diff line
@@ -73,6 +73,7 @@ struct sof_ipc4_fw_library {
 * @max_libs_count: Maximum number of libraries support by the FW including the
 *		    base firmware
 * @fw_context_save: Firmware supports full context save and restore
 * @libraries_restored: The libraries have been retained during firmware boot
 *
 * @load_library: Callback function for platform dependent library loading
 * @pipeline_state_mutex: Mutex to protect pipeline triggers, ref counts, states and deletion
@@ -88,6 +89,7 @@ struct sof_ipc4_fw_data {
	int max_num_pipelines;
	u32 max_libs_count;
	bool fw_context_save;
	bool libraries_restored;

	int (*load_library)(struct snd_sof_dev *sdev,
			    struct sof_ipc4_fw_library *fw_lib, bool reload);
+12 −2
Original line number Diff line number Diff line
@@ -576,9 +576,19 @@ EXPORT_SYMBOL(sof_ipc4_find_debug_slot_offset_by_type);

static int ipc4_fw_ready(struct snd_sof_dev *sdev, struct sof_ipc4_msg *ipc4_msg)
{
	/* no need to re-check version/ABI for subsequent boots */
	if (!sdev->first_boot)
	if (!sdev->first_boot) {
		struct sof_ipc4_fw_data *ipc4_data = sdev->private;

		/*
		 * After the initial boot only check if the libraries have been
		 * restored when full context save is not enabled
		 */
		if (!ipc4_data->fw_context_save)
			ipc4_data->libraries_restored = !!(ipc4_msg->primary &
							   SOF_IPC4_FW_READY_LIB_RESTORED);

		return 0;
	}

	sof_ipc4_create_exception_debugfs_node(sdev);