diff --git a/src/audio/base_fw.c b/src/audio/base_fw.c index 7261e0c775eb..06441381bded 100644 --- a/src/audio/base_fw.c +++ b/src/audio/base_fw.c @@ -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) @@ -461,7 +466,9 @@ static int basefw_get_large_config(struct comp_dev *dev, /* TODO: add more support */ case IPC4_DSP_RESOURCE_STATE: case IPC4_NOTIFICATION_MASK: + break; case IPC4_MODULES_INFO_GET: + return basefw_modules_info_get(data_offset, data); case IPC4_PIPELINE_PROPS_GET: case IPC4_GATEWAYS_INFO_GET: break; diff --git a/src/include/ipc4/base_fw_platform.h b/src/include/ipc4/base_fw_platform.h index 4fb7f70fd7fc..a4694dde4708 100644 --- a/src/include/ipc4/base_fw_platform.h +++ b/src/include/ipc4/base_fw_platform.h @@ -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 diff --git a/src/platform/intel/ace/lib/base_fw_platform.c b/src/platform/intel/ace/lib/base_fw_platform.c index 828845a4ea65..77d4d2d283e4 100644 --- a/src/platform/intel/ace/lib/base_fw_platform.c +++ b/src/platform/intel/ace/lib/base_fw_platform.c @@ -20,6 +20,12 @@ #endif #include +#include + +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 diff --git a/src/platform/posix/base_fw_platform.c b/src/platform/posix/base_fw_platform.c index 4ec98d952855..79bf0d9b33ca 100644 --- a/src/platform/posix/base_fw_platform.c +++ b/src/platform/posix/base_fw_platform.c @@ -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,