Skip to content

Commit 1111c34

Browse files
committed
Audio: basefw: Implement ipc4 modules info get
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>
1 parent a7c6383 commit 1111c34

File tree

4 files changed

+52
-1
lines changed

4 files changed

+52
-1
lines changed

src/audio/base_fw.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -436,7 +436,7 @@ static int basefw_libraries_info_get(uint32_t *data_offset, char *data)
436436
tr_err(&basefw_comp_tr, "Error with message size");
437437
return -ENOMEM;
438438
}
439-
439+
// test
440440
struct ipc4_libraries_info *const libs_info = (struct ipc4_libraries_info *)data;
441441
const struct sof_man_fw_desc *desc;
442442
int lib_counter = 0;
@@ -479,6 +479,11 @@ static int basefw_libraries_info_get(uint32_t *data_offset, char *data)
479479
return 0;
480480
}
481481

482+
static int basefw_modules_info_get(uint32_t *data_offset, char *data)
483+
{
484+
return platform_basefw_modules_info_get(data_offset, data);
485+
}
486+
482487
static int fw_config_set_force_l1_exit(const struct sof_tlv *tlv)
483488
{
484489
#if defined(CONFIG_SOC_SERIES_INTEL_ADSP_ACE)
@@ -655,7 +660,9 @@ static int basefw_get_large_config(struct comp_dev *dev,
655660
/* TODO: add more support */
656661
case IPC4_DSP_RESOURCE_STATE:
657662
case IPC4_NOTIFICATION_MASK:
663+
break;
658664
case IPC4_MODULES_INFO_GET:
665+
return basefw_modules_info_get(data_offset, data);
659666
case IPC4_PIPELINE_PROPS_GET:
660667
case IPC4_GATEWAYS_INFO_GET:
661668
break;

src/include/ipc4/base_fw_platform.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,13 @@ int platform_basefw_hw_config(uint32_t *data_offset, char *data);
2929
*/
3030
struct sof_man_fw_desc *platform_base_fw_get_manifest(void);
3131

32+
/**
33+
* \brief Platform specific routine to get information about modules.
34+
* Function add information and sent to host via IPC.
35+
* \param[out] data_offset data offset after structure added
36+
* \param[in] data pointer where to add new entries
37+
* \return 0 if successful, error code otherwise.
38+
*/
39+
int platform_basefw_modules_info_get(uint32_t *data_offset, char *data);
40+
3241
#endif /* __SOF_IPC4_BASE_FW_PLATFORM_H__ */

src/platform/intel/ace/lib/base_fw_platform.c

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,12 @@
88
#include <sof/tlv.h>
99
#include <sof/lib/dai.h>
1010
#include <ipc4/base_fw.h>
11+
#include <rimage/sof/user/manifest.h>
12+
13+
struct ipc4_modules_info {
14+
uint32_t modules_count;
15+
struct sof_man_module modules[0];
16+
} __packed __aligned(4);
1117

1218
int platform_basefw_hw_config(uint32_t *data_offset, char *data)
1319
{
@@ -39,3 +45,25 @@ struct sof_man_fw_desc *platform_base_fw_get_manifest(void)
3945

4046
return desc;
4147
}
48+
49+
int platform_basefw_modules_info_get(uint32_t *data_offset, char *data)
50+
{
51+
struct ipc4_modules_info *const module_info = (struct ipc4_modules_info *)data;
52+
struct sof_man_fw_desc *desc = platform_base_fw_get_manifest();
53+
54+
if (!desc)
55+
return -EINVAL;
56+
57+
module_info->modules_count = desc->header.num_module_entries;
58+
59+
for (int idx = 0; idx < module_info->modules_count; ++idx) {
60+
struct sof_man_module *module_entry =
61+
(struct sof_man_module *)((char *)desc + SOF_MAN_MODULE_OFFSET(idx));
62+
memcpy_s(&module_info->modules[idx], sizeof(module_info->modules[idx]),
63+
module_entry, sizeof(struct sof_man_module));
64+
}
65+
66+
*data_offset = sizeof(module_info) +
67+
module_info->modules_count * sizeof(module_info->modules[0]);
68+
return 0;
69+
}

src/platform/posix/base_fw_platform.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,10 @@ struct sof_man_fw_desc *platform_base_fw_get_manifest(void)
2121

2222
return desc;
2323
}
24+
25+
int platform_basefw_modules_info_get(uint32_t *data_offset, char *data)
26+
{
27+
*data_offset = 0;
28+
29+
return 0;
30+
}

0 commit comments

Comments
 (0)