Audio: basefw: Implement ipc4 modules info get

Add support to handle IPC4_MODULES_INFO_GET message.
This make it possible to get information about the current loaded modules.

Signed-off-by: Grzegorz Bernat <grzegorzx.bernat@intel.com>
This commit is contained in:
Grzegorz Bernat 2024-04-11 12:51:17 +02:00 committed by Kai Vehmanen
parent d7681434e9
commit 25423f5b6b
4 changed files with 53 additions and 4 deletions

View File

@ -334,6 +334,11 @@ static int basefw_libraries_info_get(uint32_t *data_offset, char *data)
return 0;
}
static int basefw_modules_info_get(uint32_t *data_offset, char *data)
{
return platform_basefw_modules_info_get(data_offset, data);
}
int schedulers_info_get(uint32_t *data_off_size,
char *data,
uint32_t core_id)
@ -458,15 +463,15 @@ static int basefw_get_large_config(struct comp_dev *dev,
extended_param_id.part.parameter_instance);
case IPC4_PIPELINE_LIST_INFO_GET:
return basefw_pipeline_list_info_get(data_offset, data);
case IPC4_MODULES_INFO_GET:
return basefw_modules_info_get(data_offset, data);
case IPC4_LIBRARIES_INFO_GET:
return basefw_libraries_info_get(data_offset, data);
/* TODO: add more support */
case IPC4_DSP_RESOURCE_STATE:
case IPC4_NOTIFICATION_MASK:
case IPC4_MODULES_INFO_GET:
case IPC4_PIPELINE_PROPS_GET:
case IPC4_GATEWAYS_INFO_GET:
break;
case IPC4_LIBRARIES_INFO_GET:
return basefw_libraries_info_get(data_offset, data);
case IPC4_PERF_MEASUREMENTS_STATE:
case IPC4_GLOBAL_PERF_DATA:
COMPILER_FALLTHROUGH;

View File

@ -44,6 +44,15 @@ int platform_basefw_hw_config(uint32_t *data_offset, char *data);
*/
struct sof_man_fw_desc *platform_base_fw_get_manifest(void);
/**
* \brief Platform specific routine to get information about modules.
* Function add information and sent to host via IPC.
* \param[out] data_offset data offset after structure added
* \param[in] data pointer where to add new entries
* \return 0 if successful, error code otherwise.
*/
int platform_basefw_modules_info_get(uint32_t *data_offset, char *data);
/**
* \brief Implement platform specific parameter for basefw module.
* This function is called for parameters not handled by

View File

@ -20,6 +20,12 @@
#endif
#include <ipc4/base_fw.h>
#include <rimage/sof/user/manifest.h>
struct ipc4_modules_info {
uint32_t modules_count;
struct sof_man_module modules[0];
} __packed __aligned(4);
LOG_MODULE_REGISTER(basefw_platform, CONFIG_SOF_LOG_LEVEL);
@ -72,6 +78,28 @@ struct sof_man_fw_desc *platform_base_fw_get_manifest(void)
return desc;
}
int platform_basefw_modules_info_get(uint32_t *data_offset, char *data)
{
struct ipc4_modules_info *const module_info = (struct ipc4_modules_info *)data;
struct sof_man_fw_desc *desc = platform_base_fw_get_manifest();
if (!desc)
return -EINVAL;
module_info->modules_count = desc->header.num_module_entries;
for (int idx = 0; idx < module_info->modules_count; ++idx) {
struct sof_man_module *module_entry =
(struct sof_man_module *)((char *)desc + SOF_MAN_MODULE_OFFSET(idx));
memcpy_s(&module_info->modules[idx], sizeof(module_info->modules[idx]),
module_entry, sizeof(struct sof_man_module));
}
*data_offset = sizeof(*module_info) +
module_info->modules_count * sizeof(module_info->modules[0]);
return 0;
}
/* There are two types of sram memory : high power mode sram and
* low power mode sram. This function retures memory size in page
* , memory bank power and usage status of each sram to host driver

View File

@ -30,6 +30,13 @@ struct sof_man_fw_desc *platform_base_fw_get_manifest(void)
return desc;
}
int platform_basefw_modules_info_get(uint32_t *data_offset, char *data)
{
*data_offset = 0;
return 0;
}
int platform_basefw_get_large_config(struct comp_dev *dev,
uint32_t param_id,
bool first_block,