mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-03-22 23:46:49 +08:00
ASoC: SOF: ipc4/Intel: Support for partial context
Merge series from Peter Ujfalusi <peter.ujfalusi@linux.intel.com>: 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.
This commit is contained in:
@@ -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) */
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -72,6 +72,8 @@ struct sof_ipc4_fw_library {
|
||||
* @max_num_pipelines: max number of pipelines
|
||||
* @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
|
||||
@@ -87,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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user