Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Audio: basefw: Implemented ipc4 libraries info get #9031

Merged
merged 1 commit into from
Apr 23, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 55 additions & 0 deletions src/audio/base_fw.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
#include <sof_versions.h>
#include <sof/lib/cpu-clk-manager.h>
#include <sof/lib/cpu.h>
#include <sof/platform.h>
#include <sof/lib_manager.h>
#include <rtos/init.h>
#include <platform/lib/clk.h>
#if defined(CONFIG_SOC_SERIES_INTEL_ADSP_ACE)
Expand Down Expand Up @@ -426,6 +428,57 @@ static int basefw_power_state_info_get(uint32_t *data_offset, char *data)
return 0;
}

static int basefw_libraries_info_get(uint32_t *data_offset, char *data)
{
if (sizeof(struct ipc4_libraries_info) +
LIB_MANAGER_MAX_LIBS * sizeof(struct ipc4_library_props) >
SOF_IPC_MSG_MAX_SIZE) {
tr_err(&basefw_comp_tr, "Error with message size");
return -ENOMEM;
}

struct ipc4_libraries_info *const libs_info = (struct ipc4_libraries_info *)data;
const struct sof_man_fw_desc *desc;
int lib_counter = 0;

for (int lib_id = 0; lib_id < LIB_MANAGER_MAX_LIBS; ++lib_id) {
if (lib_id == 0) {
desc = platform_base_fw_get_manifest();
} else {
#if CONFIG_LIBRARY_MANAGER
desc = (struct sof_man_fw_desc *)lib_manager_get_library_manifest(lib_id);
#else
desc = NULL;
#endif
}

if (!desc)
continue;

libs_info->libraries[lib_id].id = lib_id;
memcpy_s(libs_info->libraries[lib_counter].name,
SOF_MAN_FW_HDR_FW_NAME_LEN, desc->header.name, sizeof(desc->header.name));
libs_info->libraries[lib_counter].major_version =
desc->header.major_version;
libs_info->libraries[lib_counter].minor_version =
desc->header.minor_version;
libs_info->libraries[lib_counter].hotfix_version =
desc->header.hotfix_version;
libs_info->libraries[lib_counter].build_version =
desc->header.build_version;
libs_info->libraries[lib_counter].num_module_entries =
desc->header.num_module_entries;

lib_counter++;
}

libs_info->library_count = lib_counter;
*data_offset =
sizeof(libs_info) + libs_info->library_count * sizeof(libs_info->libraries[0]);

return 0;
}

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 @@ -605,7 +658,9 @@ static int basefw_get_large_config(struct comp_dev *dev,
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;
Expand Down
25 changes: 25 additions & 0 deletions src/include/ipc4/base_fw.h
Original file line number Diff line number Diff line change
Expand Up @@ -637,6 +637,31 @@ enum ipc4_alh_version {
IPC4_ALH_CAVS_1_8 = 0x10000,
};

struct ipc4_library_props {
/* Library run-time identifier, depends on order of loading. */
/* Base FW is always reported with id 0. */
uint32_t id;
/* Name of the library. */
uint8_t name[8];
/* Major version of the library. */
uint16_t major_version;
/* Minor version of the library. */
uint16_t minor_version;
/* Hotfix version of the library. */
uint16_t hotfix_version;
/* Build version of the library. */
uint16_t build_version;
/* Number of modules packed into the library. */
uint32_t num_module_entries;
} __packed __aligned(4);

struct ipc4_libraries_info {
/* Specifies number of items in libraries array. */
uint32_t library_count;
/* Array of libraries properties. */
struct ipc4_library_props libraries[0];
} __packed __aligned(4);

struct ipc4_log_state_info {
/*
* Specifies how frequently FW sends Log Buffer Status
Expand Down
9 changes: 8 additions & 1 deletion src/include/ipc4/base_fw_platform.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,11 @@
*/
int platform_basefw_hw_config(uint32_t *data_offset, char *data);

#endif
/**
* \brief Platform specific routine which return the pointer to
* the boot base manifest.
* \return pointer to struct if successful, null otherwise.
*/
struct sof_man_fw_desc *platform_base_fw_get_manifest(void);

#endif /* __SOF_IPC4_BASE_FW_PLATFORM_H__ */
3 changes: 3 additions & 0 deletions src/include/sof/lib_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,9 @@ static inline struct lib_manager_mod_ctx *lib_manager_get_mod_ctx(int module_id)
uint32_t lib_id = LIB_MANAGER_GET_LIB_ID(module_id);
struct ext_library *_ext_lib = ext_lib_get();

if (!_ext_lib)
return NULL;

return _ext_lib->desc[lib_id];
}

Expand Down
9 changes: 9 additions & 0 deletions src/platform/intel/ace/lib/base_fw_platform.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,12 @@ int platform_basefw_hw_config(uint32_t *data_offset, char *data)

return 0;
}

struct sof_man_fw_desc *platform_base_fw_get_manifest(void)
{
struct sof_man_fw_desc *desc;

desc = (struct sof_man_fw_desc *)IMR_BOOT_LDR_MANIFEST_BASE;

return desc;
}
8 changes: 8 additions & 0 deletions src/platform/posix/base_fw_platform.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
// Author: Kai Vehmanen <[email protected]>

#include <stdint.h>
#include <stddef.h>
#include <ipc4/base_fw_platform.h>

int platform_basefw_hw_config(uint32_t *data_offset, char *data)
Expand All @@ -13,3 +14,10 @@ int platform_basefw_hw_config(uint32_t *data_offset, char *data)

return 0;
}

struct sof_man_fw_desc *platform_base_fw_get_manifest(void)
{
struct sof_man_fw_desc *desc = NULL;

return desc;
}