Skip to content

Commit

Permalink
Audio: basefw: Implement ipc4 modules info get
Browse files Browse the repository at this point in the history
Added support for ipc4 query no 9.
This make it possible to get information about the current loaded modules.

Signed-off-by: Grzegorz Bernat <grzegorzx.bernat@intel.com>
  • Loading branch information
gbernatxintel committed Apr 24, 2024
1 parent a7c6383 commit 1111c34
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 1 deletion.
9 changes: 8 additions & 1 deletion src/audio/base_fw.c
Original file line number Diff line number Diff line change
Expand Up @@ -436,7 +436,7 @@ static int basefw_libraries_info_get(uint32_t *data_offset, char *data)
tr_err(&basefw_comp_tr, "Error with message size");
return -ENOMEM;
}

// test
struct ipc4_libraries_info *const libs_info = (struct ipc4_libraries_info *)data;
const struct sof_man_fw_desc *desc;
int lib_counter = 0;
Expand Down Expand Up @@ -479,6 +479,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);
}

static int fw_config_set_force_l1_exit(const struct sof_tlv *tlv)
{
#if defined(CONFIG_SOC_SERIES_INTEL_ADSP_ACE)
Expand Down Expand Up @@ -655,7 +660,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;
Expand Down
9 changes: 9 additions & 0 deletions src/include/ipc4/base_fw_platform.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,13 @@ 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);

#endif /* __SOF_IPC4_BASE_FW_PLATFORM_H__ */
28 changes: 28 additions & 0 deletions src/platform/intel/ace/lib/base_fw_platform.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,12 @@
#include <sof/tlv.h>
#include <sof/lib/dai.h>
#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);

int platform_basefw_hw_config(uint32_t *data_offset, char *data)
{
Expand Down Expand Up @@ -39,3 +45,25 @@ 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;
}
7 changes: 7 additions & 0 deletions src/platform/posix/base_fw_platform.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,10 @@ 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;
}

0 comments on commit 1111c34

Please sign in to comment.