/**

 * Copyright (c) 2025 Huawei Technologies Co., Ltd.

 * This program is free software, you can redistribute it and/or modify it under the terms and conditions of

 * CANN Open Software License Agreement Version 2.0 (the "License").

 * Please refer to the License for details. You may not use this file except in compliance with the License.

 * 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 FITNESS FOR A PARTICULAR PURPOSE.

 * See LICENSE in the root of the software repository for the full text of the License.

 */



#ifndef TRS_RES_H__

#define TRS_RES_H__



#include "ascend_hal.h"

#include "ascend_hal_define.h"



#include "trs_ioctl.h"

#include "trs_user_msg.h"



struct res_id_info_val {

    uint32_t res_len;

    uint64_t res_addr;

};



struct res_id_usr_info {

    uint32_t valid;

    uint32_t res_len;

    uint64_t res_addr;

    uint32_t priv;

};



int trs_dev_res_id_init(uint32_t dev_id);

void trs_dev_res_id_uninit(uint32_t dev_id);

struct res_id_usr_info *trs_get_res_id_info(uint32_t dev_id, uint32_t ts_id, drvIdType_t type, uint32_t id);

uint32_t trs_get_res_id_num(uint32_t dev_id, uint32_t ts_id, drvIdType_t type);

int trs_id_query(uint32_t dev_id, uint32_t cmd, struct trs_res_id_para *para, uint32_t *value);

int trs_res_id_info_init(uint32_t dev_id, uint32_t ts_id, uint32_t res_id, drvIdType_t type,

    struct res_id_info_val *id_info_val);



drvError_t _halResourceIdAlloc(uint32_t dev_id, struct halResourceIdInputInfo *in, struct halResourceIdOutputInfo *out);

drvError_t _halResourceIdFree(uint32_t dev_id, struct halResourceIdInputInfo *in);

drvError_t _halResourceConfig(uint32_t dev_id, struct halResourceIdInputInfo *in, struct halResourceConfigInfo *para);

drvError_t trs_res_config_para_check(uint32_t dev_id, struct halResourceIdInputInfo *in,

    struct halResourceConfigInfo *para);

drvError_t trs_local_res_config(uint32_t dev_id, struct halResourceIdInputInfo *in,

    struct halResourceConfigInfo *para);



struct trs_res_remote_ops {

    drvError_t (*resid_alloc)(uint32_t dev_id, struct halResourceIdInputInfo *in, struct halResourceIdOutputInfo *out);

    drvError_t (*resid_free)(uint32_t dev_id, struct halResourceIdInputInfo *in);

    drvError_t (*resid_config)(uint32_t dev_id, struct halResourceIdInputInfo *in, struct halResourceConfigInfo *para);

};

drvError_t trs_remote_res_config(uint32_t dev_id, struct halResourceIdInputInfo *in,

    struct halResourceConfigInfo *para);



void trs_register_res_remote_ops(struct trs_res_remote_ops *ops);



int trs_res_map_reg_init(uint32_t dev_id, uint32_t ts_id, uint32_t res_id, drvIdType_t type, struct res_id_usr_info *id_info);

void trs_res_map_reg_un_init(uint32_t dev_id, uint32_t tsid, uint32_t res_id, drvIdType_t type, struct res_id_usr_info *id_info);

#endif