KL520_SDK_2.2/mdw/include/kmdw_model.h
2025-12-17 15:55:25 +08:00

315 lines
9.1 KiB
C

/**
* @file kmdw_model.h
* @brief model manager APIs
*
* @copyright Copyright (c) 2019 Kneron Inc. All rights reserved.
*/
#ifndef __KMDW_MODEL_H__
#define __KMDW_MODEL_H__
#include "cmsis_os2.h"
#include "base.h"
#include "ipc.h" /* for MULTI_MODEL_MAX */
#include "model_type.h"
#define KMDW_MODEL_ALL_MODELS -1 /**< A term means ALL_MODELS */
#define KMDW_MODEL_MAX_MODEL_COUNT MULTI_MODEL_MAX /**< MAX model count for DME and flash */
/* These crc values will ONLY change if model is changed in FLASH */
#define MODEL_INFO_SUM32_VALUE 0x00eee074 /**< SUM32 value */
#define MODEL_IN_DDR 1 /**< - */
#define MODEL_IN_FLASH 0 /**< - */
/**
* @brief npu data format
*/
enum kmdw_model_data_layout {
DATA_FMT_UNKNOWN = -1,
DATA_FMT_4W4C8B = 16,
DATA_FMT_16W1C8B = 8
};
/**
* @brief return code of kmdw_model_run()
*/
enum kmdw_model_rc {
// 0 - 9 is reserved for ncpu return
// defined in ipc.h
// IMAGE_STATE_INACTIVE == 0
// IMAGE_STATE_ACTIVE == 1
// IMAGE_STATE_NPU_DONE == 2
// IMAGE_STATE_DONE == 3
KMDW_MODEL_RUN_RC_ABORT = 10, /**< return code: abort */
KMDW_MODEL_RUN_RC_ERROR = 11, /**< return code: error */
KMDW_MODEL_RUN_RC_END /**< dummy item for enum table end */
};
/**
* @brief data structure of model run time
*/
typedef struct kmdw_model_img_run_time_s {
uint32_t round_trip_time; /**< round trip time */
uint32_t pre_proc_time; /**< pre process time */
uint32_t npu_proc_time; /**< npu process time */
uint32_t post_proc_time; /**< post process time */
} kmdw_model_run_time_t;
/**
* @brief a mask for easy read fw_info data
*/
typedef struct kmdw_model_fw_info_s {
uint32_t model_count; /**< model count */
struct kdp_model_s models[1]; /**< the address of dynamical count of models */
} kmdw_model_fw_info_t;
/**
* @brief a mask for easy read fw_info_ext data
*/
typedef struct kmdw_model_fw_info_ext_s {
uint32_t model_dram_addr_end; /**< model end address */
uint32_t model_total_size; /**< model total size */
uint32_t model_checksum; /**< checksum */
} kmdw_model_fw_info_ext_t;
/**
* @brief a basic descriptor for a input/output node in model
*/
typedef struct
{
uint32_t index; /**< index of node */
uint32_t shape_npu_len; /**< length of npu shape */
uint32_t shape_npu[4]; /**< npu shape BxCxHxW (Compatable with KL720 NEFv1 4-dims shape interface) */
uint32_t data_layout; /**< npu memory layout */
float scale; /**< scale of node (KL520 only support layer wised quantization param) */
int32_t radix; /**< radix of node (KL520 only support layer wised quantization param) */
} kmdw_model_tensor_descriptor_t;
/* ############################
* ## Public Functions ##
* ############################ */
/**
* @brief Init model functionality
*/
void kmdw_model_init(void);
/**
* @brief A wrapper of load_model from flash
* @param model_index_p: model info index,
* 0-n: info_index of model to load
* -1 means to load all models
* @return 0: failes; 1: OK(means 1 model is loaded)
*/
int32_t kmdw_model_load_model(int8_t model_info_index_p);
/**
* @brief A wrapper of load_model_info
* @param [in] is_model_from_ddr: if model is from ddr/host command
* @return reloaded model count; 0 means failed
*/
int32_t kmdw_model_reload_model_info(bool from_ddr);
/**
* @brief Refresh all models
* @return refreshed model count; 0 means failed
*/
int32_t kmdw_model_refresh_models(void);
/**
* @brief Output model_info of specified index
* @param[in] idx_p the index of programmed models
* @return model_info defined in ipc.h
*/
struct kdp_model_s* kmdw_model_get_model_info(int idx_p);
/**
* @brief Output total number of models and all model IDs
* @param[in] trust_ddr_data if true, no need to check validness of ddr data
* @return a list of model count, id0, id1, id2
* @note only obtain data from ddr space
* model must be loaded from file or flash to ddr first
*/
uint32_t *kmdw_model_get_all_model_info(bool trust_ddr_data);
/**
* @brief Output model end address defined in model file
* @param[in] trust_ddr_data if true, no need to check validness of ddr data
* @return model end address when loaded
* @note only obtain data from ddr space
* model must be loaded from file or flash to ddr first
*/
uint32_t kmdw_model_get_model_end_addr(bool trust_ddr_data);
/**
* @brief Output crc value
* @param[in] trust_ddr_data if true, no need to check validness of ddr data
* @return crc value
* @note only obtain data from ddr space
* model must be loaded from file or flash to ddr first
*/
uint32_t kmdw_model_get_crc(bool trust_ddr_data);
/**
* @brief Get the buffer address of fw_info
* @param[in] trust_ddr_data if true, no need to check validness of ddr data
* @return the buffer address of fw_info or NULL when model is not loaded
*/
kmdw_model_fw_info_t* kmdw_model_get_fw_info(bool trust_ddr_data);
/**
* @brief Check if a model is in flash
* @param[in] model_type model type
* @return 1 - the model is in flash; 0 - not in flash
*/
int kmdw_model_is_model_in_flash(uint32_t model_type);
/**
* @brief Specify output address for model run in ncpu/npu
* @return always 0
* @note must be called after kmdw_model_config_model()
*/
int32_t kmdw_model_config_result(osEventFlagsId_t result_evt, uint32_t result_evt_flag);
/**
* @brief Config model image
* @param img_cfg image config
* @param ext_param extra param
*/
void kmdw_model_config_img(struct kdp_img_cfg *img_cfg, void *ext_param);
/**
* @brief Get raw image config
* @param idx image index
* @return raw image config
*/
struct kdp_img_raw_s* kmdw_model_get_raw_img(int idx);
/**
* @brief Run model
* @param tag model tag
* @param output model output
* @param model_type model type
* @param dme DME mode
* @return kmdw_model_rc
*/
int kmdw_model_run(const char *tag, void *output, uint32_t model_type, bool dme);
/**
* @brief Abort model execution
*/
void kmdw_model_abort(void);
/**
* @brief Get round-trip/pre/npu/post times
* @param [in] img_idx raw image index
* @param [out] run_time run time of pre/npu/post/
* @return void
*/
void kmdw_model_get_run_time(int img_idx, kmdw_model_run_time_t *run_time);
/**
* @brief Check if a model is loaded in memory
* @param[in] model_type model type
* @return 1 - loaded in memory; 0 - not loaded
*/
int kmdw_model_is_model_loaded(uint32_t model_type);
/**
* @brief Set model storage location
* @param[in] model_inddr // model is from flash : false, ddr : true
*/
void kmdw_model_set_location(bool model_inddr);
/**
* @brief Get model storage location
* @return 1 - DDR; 0 - Flash
*/
bool kmdw_model_get_location(void);
/**
* @brief Get model input tensor/node number
* @param[in] model_type model type
* @return input tensor/node number, 0 means failed
*/
int kmdw_model_get_input_tensor_num(uint32_t model_type);
/**
* @brief Get model input tensor/node information
* @param[in] model_type model type
* @param[in] tensor_idx input tensor index
* @param[out] tensor_info input tensor information
* @return 1: success; 0: fail
*/
int kmdw_model_get_input_tensor_info(uint32_t model_type, uint32_t tensor_idx, kmdw_model_tensor_descriptor_t *tensor_info);
/**
* @brief Get model output tensor/node number
* @param[in] model_type model type
* @return output tensor/node number, 0 means failed
*/
int kmdw_model_get_output_tensor_num(uint32_t model_type);
/**
* @brief Check if a model is loaded in memory
* @param[in] model_type model type
* @param[in] tensor_idx output tensor index
* @param[out] tensor_info output tensor information
* @return 1: success; 0: fail
*/
int kmdw_model_get_output_tensor_info(uint32_t model_type, uint32_t tensor_idx, kmdw_model_tensor_descriptor_t *tensor_info);
#ifdef EMBED_CMP_NPU
/**
* @brief A wrapper of adding or update specific model configuration
* @param model_type model type
* @param cmd_len model command length
* @param wt_len model weight length
* @param input_len input data length
* @param output_len output data length
* @param setup_len setup data length
* @param cmd_mem_addr model command memory address
* @param wt_mem_addr model weight memory address
* @param input_mem_addr input data memory address
* @param output_mem_addr output data memory address
* @param setup_mem_addr setup data memory address
* @return int8_t 0: config ok
* -1: model not found
*/
int8_t kmdw_model_add_update_model(uint32_t model_type,
int cmd_len, int wt_len, int input_len, int output_len, int setup_len,
uint32_t cmd_mem_addr, uint32_t wt_mem_addr,
uint32_t input_mem_addr, uint32_t output_mem_addr, uint32_t setup_mem_addr);
#endif // EMBED_CMP_NPU
#if DEBUG
/**
* @brief Dump model debug info
*/
void kmdw_model_dump_model_info(void);
#endif
#endif