ASoC: SOF: ipc4/ipc4-loader: Add SOF_INFO and CODEC_INFO to fw_config_params

SOF_INFO (id == 35) tuple holds tuple structured information about SOF
features.

The first entry in SOF_INFO is the SOF_CODEC_INFO (id == 0) which contains
information about the supported codecs for decode/encode in the booted
firmware.

If present in the fw_config payload, make a copy of it and store it
sof_ipc4_fw_data->codec_info to be used by the compressed code.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: Liam Girdwood <liam.r.girdwood@intel.com>
Link: https://patch.msgid.link/20261007084955.1256-20-peter.ujfalusi@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
Peter Ujfalusi 2026-10-07 11:49:46 +03:00 committed by Mark Brown
parent 03f3ae9e89
commit 9fdc525713
3 changed files with 53 additions and 6 deletions

View File

@ -436,12 +436,10 @@ enum sof_ipc4_fw_config_params {
SOF_IPC4_FW_CFG_RESERVED,
SOF_IPC4_FW_CFG_POWER_GATING_POLICY,
SOF_IPC4_FW_CFG_ASSERT_MODE,
SOF_IPC4_FW_RESERVED1,
SOF_IPC4_FW_RESERVED2,
SOF_IPC4_FW_RESERVED3,
SOF_IPC4_FW_RESERVED4,
SOF_IPC4_FW_RESERVED5,
SOF_IPC4_FW_CONTEXT_SAVE
/* Reserved: 24 - 28 */
SOF_IPC4_FW_CONTEXT_SAVE = 29,
/* Reserved: 30 - 34 */
SOF_IPC4_FW_CFG_SOF_INFO = 35,
};
struct sof_ipc4_fw_version {
@ -451,6 +449,14 @@ struct sof_ipc4_fw_version {
uint16_t build;
} __packed;
/*
* tuple based array for SOF specific information under SOF_IPC4_FW_CFG_SOF_INFO
* tuple of fw_config
*/
enum ipc4_fw_sof_info_params {
SOF_IPC4_SOF_CODEC_INFO,
};
/* Payload data for SOF_IPC4_MOD_SET_DX */
struct sof_ipc4_dx_state_info {
/* core(s) to apply the change */

View File

@ -408,6 +408,38 @@ static int sof_ipc4_validate_firmware(struct snd_sof_dev *sdev)
return 0;
}
static int sof_ipc4_query_sof_info(struct snd_sof_dev *sdev,
void *sof_info_data, u32 sof_info_size)
{
struct sof_ipc4_fw_data *ipc4_data = sdev->private;
struct sof_ipc4_tuple *tuple;
size_t offset = 0;
/*
* No size validation is needed as the sof_info data is coming from
* firmware as part of the firmware config, it is guarantied to be
* correct.
*/
while (offset < sof_info_size) {
tuple = (struct sof_ipc4_tuple *)((u8 *)sof_info_data + offset);
switch (tuple->type) {
case SOF_IPC4_SOF_CODEC_INFO:
ipc4_data->codec_info = devm_kmemdup(sdev->dev, tuple->value,
tuple->size, GFP_KERNEL);
if (!ipc4_data->codec_info)
return -ENOMEM;
break;
default:
break;
}
offset += sizeof(*tuple) + tuple->size;
}
return 0;
}
int sof_ipc4_query_fw_configuration(struct snd_sof_dev *sdev)
{
struct sof_ipc4_fw_data *ipc4_data = sdev->private;
@ -483,6 +515,11 @@ int sof_ipc4_query_fw_configuration(struct snd_sof_dev *sdev)
*/
ipc4_data->libraries_restored = ipc4_data->fw_context_save;
break;
case SOF_IPC4_FW_CFG_SOF_INFO:
ret = sof_ipc4_query_sof_info(sdev, tuple->value, tuple->size);
if (ret)
goto out;
break;
default:
break;
}

View File

@ -75,6 +75,8 @@ struct sof_ipc4_fw_library {
* @fw_context_save: Firmware supports full context save and restore
* @libraries_restored: The libraries have been retained during firmware boot
*
* @codec_info: Information about the available codecs in booted firmware. The
* data is to be used by the code for compressed support.
* @load_library: Callback function for platform dependent library loading
* @pipeline_state_mutex: Mutex to protect pipeline triggers, ref counts, states and deletion
*/
@ -91,6 +93,8 @@ struct sof_ipc4_fw_data {
bool fw_context_save;
bool libraries_restored;
void *codec_info;
int (*load_library)(struct snd_sof_dev *sdev,
struct sof_ipc4_fw_library *fw_lib, bool reload);
void (*intel_configure_mic_privacy)(struct snd_sof_dev *sdev,