mirror of https://github.com/thesofproject/sof.git
Audio: basefw: Implemented ipc4 libraries info get
Added support for ipc4 query no 16. This makes it possible to get information about the current basefw library. Signed-off-by: Grzegorz Bernat <grzegorzx.bernat@intel.com>
This commit is contained in:
parent
9737e124bc
commit
7b0c202f7b
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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__ */
|
||||
|
|
|
@ -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];
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
// Author: Kai Vehmanen <kai.vehmanen@linux.intel.com>
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
#include <ipc4/base_fw_platform.h>
|
||||
|
||||
int platform_basefw_hw_config(uint32_t *data_offset, char *data)
|
||||
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue