/*
 * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.
 *
 * this file licensed under the Mulan PSL v2.
 * You can use this software according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of Mulan PSL v2 at:
 * http://license.coscl.org.cn/MulanPSL2
 *
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
 * PURPOSE.
 * See the Mulan PSL v2 for more details.
 */

#ifndef __HS_CTRL_UPGRADE_H__
#define __HS_CTRL_UPGRADE_H__
#include "sml.h"

#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif
#endif /* __cplusplus */

#define RAIDADM_UPDATE_IMG_HEADER_LEN 1024
#define RAIDADM_UPDATE_IMG_VERSION_LEN 16
#define RAIDADM_UPDATE_CHECKSUM_LEN 32
#define RAIDADM_UPDATE_TGT_VERSION_LEN 16
#define RAIDADM_UPDATE_IN_IMG_TGT_DESC_NUM 14
#define RAIDADM_UPDATE_ALGO_SHA256 0
#define RAIDADM_UPDATE_ALGO_SM3 1
#define RAIDADM_UPDATE_IMG_FILE_MAX_SIZE 0x2000000L // 32MB

#define ADM_MAX_FILE_NAME_LENGTH 255
#define ADM_PATH_MAX 512
#define MAX_FILE_NAME_LENGTH ((ADM_PATH_MAX) + (ADM_MAX_FILE_NAME_LENGTH))

#define DATA_TRANS_START_FLAG    (1U << 0)    /* 开始标识 */
#define DATA_TRANS_ING_FLAG      (1U << 1)    /* 继续加载标识 */
#define DATA_TRANS_END_FLAG      (1U << 2)    /* 结束加载标识 */

#define HISTORE_ADM_MAX_DATA_SIZE 0x1000U

#define CRC_TABLE_SIZE 256
#define CRC_OFFSET_8_BITS 8
#define CRC_OFFSET_24_BITS 24
#define TRAS_TIME_4 4

struct raidadm_tgt_desc {
    guint32 type; // 镜像分类
    guint32 offset; // 对象相对头部0地址的偏移
    guint32 len; // 对象的长度
    guint32 rsv;
    /* 对象的哈希值（使用SHA256即可，非安全升级时使用；安全启动场景，本字段无用） */
    guint8 checksum[RAIDADM_UPDATE_CHECKSUM_LEN];
    guint8 ver[RAIDADM_UPDATE_TGT_VERSION_LEN]; // 保留（如存放版本信息）
};

typedef struct raidadm_img_header_info {
    guint32 ver; // 结构体版本定义（默认0x01）
    guint32 algo; // 算法体系选择：0：RSA, others: reserved（e.g.0x20：SM2）
    guint8 fw_ver[RAIDADM_UPDATE_IMG_VERSION_LEN]; // 存放总体版本信息（4B+12B）
    guint32 tgt_num; // 对象个数（约定范围）
    guint32 total_size; // 总大小（从header0地址起始，到最后一个升级组件的尾地址）
    /* 大包的完整性校验哈希值（使用SHA256即可，非安全升级时使用）从1KB到Total Size的数据完整性 */
    guint8 packet_checksum[RAIDADM_UPDATE_CHECKSUM_LEN];
    struct raidadm_tgt_desc tgt_desc[RAIDADM_UPDATE_IN_IMG_TGT_DESC_NUM];
    guint8 rsv[32]; // 预留对齐使结构sizeof为1024byte
    guint8 header_checksum[RAIDADM_UPDATE_CHECKSUM_LEN]; // 头部的完整性校验哈希值（使用SHA256即可，非安全升级时使用）
} RAIDADM_IMG_HEADER_INFO_S;

typedef struct histore_cmd_update_firmware {
    guint16 seq; // 分片序号，每个组件都从0开始
    guint16 tgt_bit_map; // 待升级组件的bitmap
    guint8 fw_type; // 当前组件类型，update_tgt_type_e
    guint8 algo_type; // 算法类型
    guint8 trans_flag; // 当前分片类型（起始、中部、尾部、全部）
    guint8 finish_flag;
    guint32 tgt_len; // 当前组件不包含padding的总长度
    guint32 data_crc; // 当前传输片的数据CRC32结果
    guint32 cur_slice_len; // 当前传输片的数据长度（大小限制  RAID:256KB；HBA:64KB，考虑到nvme驱动每次传输最大4K，固定为4K）
} CMD_UPDATE_FIRMWARE_S;

typedef struct _tag_sml_ctrl_upgrade_param {
    guint8 controller_index; // RAID控制器的索引号，从0开始
    gchar file_path[MAX_FILEPATH_LENGTH]; // 升级文件的路径
    size_t file_size; // 升级文件的大小
} SML_CTRL_UPGRADE_PARAM;

gint32 histore_upgrade_ctrl_process(guint32 ctrl_id, const gchar *file_path);
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* __cplusplus */

#endif
