/**

 * 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.

 */



#include <stdint.h>

#include "ascend_hal_error.h"

#include "ascend_hal.h"

#ifdef ENABLE_BUILD_PRODUCT

#include "drv_user_common.h"

#endif



typedef enum tagdrvErrorCode_t {

    DRV_ERRCOED_NONE = 0,

    DRV_ERRCOED_NO_DEVICE = 1,

    DRV_ERRCOED_INVALID_DEVICE = 2,

    DRV_ERRCOED_INVALID_ARGUMENT = 3,

    DRV_ERRCOED_MALLOC_FAIL = 4,

    DRV_ERRCOED_RESOURCES_BUSY = 5,

    DRV_ERRCOED_NO_RESOURCES = 6,

    DRV_ERRCOED_OPER_NOT_PERMITTED = 7,

    DRV_ERRCOED_NO_EVENT_RESOURCES = 8,

    DRV_ERRCOED_NO_STREAM_RESOURCES = 9,

    DRV_ERRCOED_NO_NOTIFY_RESOURCES = 10,

    DRV_ERRCOED_NO_MODEL_RESOURCES = 11,

    DRV_ERRCOED_QUEUE_FULL = 12,

    DRV_ERRCOED_CDQ_RESOURCES = 13,

    DRV_ERRCOED_NOT_SUPPORT = 14,

    DRV_ERRCOED_UNAUTHORIZED_ACCESS_DEVICE = 15,

    DRV_ERRCOED_QUEUE_EMPTY = 16,

    DRV_ERRCOED_NO_PROCESS = 17,

    DRV_ERRCODE_WAIT_TIMEOUT = 18,

    DRV_ERRCODE_NOT_EXIST = 19,

    DRV_ERRCOED_INNER = 9999,

} drvErrorCode_t;



static const int32_t g_error_code_map[] = {

    [DRV_ERROR_NONE] = DRV_ERRCOED_NONE,

    [DRV_ERROR_NO_DEVICE] = DRV_ERRCOED_NO_DEVICE,

    [DRV_ERROR_INVALID_DEVICE] = DRV_ERRCOED_INVALID_DEVICE,

    [DRV_ERROR_INVALID_VALUE] = DRV_ERRCOED_INVALID_ARGUMENT,

    [DRV_ERROR_INVALID_HANDLE] = DRV_ERRCOED_INVALID_ARGUMENT,

    [DRV_ERROR_INVALID_MALLOC_TYPE] = DRV_ERRCOED_INNER,

    [DRV_ERROR_OUT_OF_MEMORY] = DRV_ERRCOED_MALLOC_FAIL,

    [DRV_ERROR_INNER_ERR] = DRV_ERRCOED_INNER,

    [DRV_ERROR_PARA_ERROR] = DRV_ERRCOED_INVALID_ARGUMENT,

    [DRV_ERROR_UNINIT] = DRV_ERRCOED_INNER,

    [DRV_ERROR_REPEATED_INIT] = DRV_ERRCOED_INNER,

    [DRV_ERROR_NOT_EXIST] = DRV_ERRCODE_NOT_EXIST,

    [DRV_ERROR_REPEATED_USERD] = DRV_ERRCOED_INNER,

    [DRV_ERROR_BUSY] = DRV_ERRCOED_RESOURCES_BUSY,

    [DRV_ERROR_NO_RESOURCES] = DRV_ERRCOED_NO_RESOURCES,

    [DRV_ERROR_OUT_OF_CMD_SLOT] = DRV_ERRCOED_INNER,

    [DRV_ERROR_WAIT_TIMEOUT] = DRV_ERRCODE_WAIT_TIMEOUT,

    [DRV_ERROR_IOCRL_FAIL] = DRV_ERRCOED_INNER,

    [DRV_ERROR_SOCKET_CREATE] = DRV_ERRCOED_INNER,

    [DRV_ERROR_SOCKET_CONNECT] = DRV_ERRCOED_INNER,

    [DRV_ERROR_SOCKET_BIND] = DRV_ERRCOED_INNER,

    [DRV_ERROR_SOCKET_LISTEN] = DRV_ERRCOED_INNER,

    [DRV_ERROR_SOCKET_ACCEPT] = DRV_ERRCOED_INNER,

    [DRV_ERROR_CLIENT_BUSY] = DRV_ERRCOED_INNER,

    [DRV_ERROR_SOCKET_SET] = DRV_ERRCOED_INNER,

    [DRV_ERROR_SOCKET_CLOSE] = DRV_ERRCOED_INNER,

    [DRV_ERROR_RECV_MESG] = DRV_ERRCOED_INNER,

    [DRV_ERROR_SEND_MESG] = DRV_ERRCOED_INNER,

    [DRV_ERROR_SERVER_BUSY] = DRV_ERRCOED_INNER,

    [DRV_ERROR_CONFIG_READ_FAIL] = DRV_ERRCOED_INNER,

    [DRV_ERROR_STATUS_FAIL] = DRV_ERRCOED_INNER,

    [DRV_ERROR_SERVER_CREATE_FAIL] = DRV_ERRCOED_INNER,

    [DRV_ERROR_WAIT_INTERRUPT] = DRV_ERRCOED_INNER,

    [DRV_ERROR_BUS_DOWN] = DRV_ERRCOED_INNER,

    [DRV_ERROR_DEVICE_NOT_READY] = DRV_ERRCOED_INNER,

    [DRV_ERROR_REMOTE_NOT_LISTEN] = DRV_ERRCOED_INNER,

    [DRV_ERROR_NON_BLOCK] = DRV_ERRCOED_INNER,

    [DRV_ERROR_OVER_LIMIT] = DRV_ERRCOED_INNER,

    [DRV_ERROR_FILE_OPS] = DRV_ERRCOED_INNER,

    [DRV_ERROR_MBIND_FAIL] = DRV_ERRCOED_INNER,

    [DRV_ERROR_MALLOC_FAIL] = DRV_ERRCOED_MALLOC_FAIL,

    [DRV_ERROR_REPEATED_SUBSCRIBED] = DRV_ERRCOED_INNER,

    [DRV_ERROR_PROCESS_EXIT] = DRV_ERRCOED_INNER,

    [DRV_ERROR_DEV_PROCESS_HANG] = DRV_ERRCOED_INNER,

    [DRV_ERROR_REMOTE_NO_SESSION] = DRV_ERRCOED_INNER,

    [DRV_ERROR_HOT_RESET_IN_PROGRESS] = DRV_ERRCOED_INNER,

    [DRV_ERROR_OPER_NOT_PERMITTED] = DRV_ERRCOED_OPER_NOT_PERMITTED,

    [DRV_ERROR_NO_EVENT_RESOURCES] = DRV_ERRCOED_NO_EVENT_RESOURCES,

    [DRV_ERROR_NO_STREAM_RESOURCES] = DRV_ERRCOED_NO_STREAM_RESOURCES,

    [DRV_ERROR_NO_NOTIFY_RESOURCES] = DRV_ERRCOED_NO_NOTIFY_RESOURCES,

    [DRV_ERROR_NO_MODEL_RESOURCES] = DRV_ERRCOED_NO_MODEL_RESOURCES,

    [DRV_ERROR_TRY_AGAIN] = DRV_ERRCOED_INNER,

    [DRV_ERROR_DST_PATH_ILLEGAL] = DRV_ERRCOED_INNER,

    [DRV_ERROR_OPEN_FAILED] = DRV_ERRCOED_INNER,

    [DRV_ERROR_NO_FREE_SPACE] = DRV_ERRCOED_INNER,

    [DRV_ERROR_LOCAL_ABNORMAL_FILE] = DRV_ERRCOED_INNER,

    [DRV_ERROR_DST_PERMISSION_DENIED] = DRV_ERRCOED_INNER,

    [DRV_ERROR_DST_NO_SUCH_FILE] = DRV_ERRCOED_INNER,

    [DRV_ERROR_MEMORY_OPT_FAIL] = DRV_ERRCOED_INNER,

    [DRV_ERROR_RUNTIME_ON_OTHER_PLAT] = DRV_ERRCOED_INNER,

    [DRV_ERROR_SQID_FULL] = DRV_ERRCOED_INNER,

    [DRV_ERROR_SERVER_HAS_BEEN_CREATED] = DRV_ERRCOED_INNER,

    [DRV_ERROR_NO_PROCESS] = DRV_ERRCOED_NO_PROCESS,

    [DRV_ERROR_NO_SUBSCRIBE_THREAD] = DRV_ERRCOED_INNER,

    [DRV_ERROR_NON_SCHED_GRP_MUL_THREAD] = DRV_ERRCOED_INNER,

    [DRV_ERROR_NO_GROUP] = DRV_ERRCOED_INNER,

    [DRV_ERROR_GROUP_EXIST] = DRV_ERRCOED_INNER,

    [DRV_ERROR_THREAD_EXCEEDS_SPEC] = DRV_ERRCOED_INNER,

    [DRV_ERROR_THREAD_NOT_RUNNIG] = DRV_ERRCOED_INNER,

    [DRV_ERROR_PROCESS_NOT_MATCH] = DRV_ERRCOED_INNER,

    [DRV_ERROR_EVENT_NOT_MATCH] = DRV_ERRCOED_INNER,

    [DRV_ERROR_PROCESS_REPEAT_ADD] = DRV_ERRCOED_INNER,

    [DRV_ERROR_GROUP_NON_SCHED] = DRV_ERRCOED_INNER,

    [DRV_ERROR_NO_EVENT] = DRV_ERRCOED_INNER,

    [DRV_ERROR_COPY_USER_FAIL] = DRV_ERRCOED_INNER,

    [DRV_ERROR_QUEUE_EMPTY] = DRV_ERRCOED_QUEUE_EMPTY,

    [DRV_ERROR_QUEUE_FULL] = DRV_ERRCOED_QUEUE_FULL,

    [DRV_ERROR_RUN_IN_ILLEGAL_CPU] = DRV_ERRCOED_INNER,

    [DRV_ERROR_SUBSCRIBE_THREAD_TIMEOUT] = DRV_ERRCOED_INNER,

    [DRV_ERROR_BAD_ADDRESS] = DRV_ERRCOED_INNER,

    [DRV_ERROR_DST_FILE_IS_BEING_WRITTEN] = DRV_ERRCOED_INNER,

    [DRV_ERROR_EPOLL_CLOSE] = DRV_ERRCOED_INNER,

    [DRV_ERROR_CDQ_ABNORMAL] = DRV_ERRCOED_INNER,

    [DRV_ERROR_CDQ_NOT_EXIST] = DRV_ERRCOED_INNER,

    [DRV_ERROR_NO_CDQ_RESOURCES] = DRV_ERRCOED_CDQ_RESOURCES,

    [DRV_ERROR_CDQ_QUIT] = DRV_ERRCOED_INNER,

    [DRV_ERROR_PARTITION_NOT_RIGHT] = DRV_ERRCOED_INNER,

    [DRV_ERROR_RESOURCE_OCCUPIED] = DRV_ERRCOED_RESOURCES_BUSY,

    [DRV_ERROR_PERMISSION] = DRV_ERRCOED_OPER_NOT_PERMITTED,

    [DRV_ERROR_RESUME] = DRV_ERRCOED_INNER,

    [DEV_ERROR_UNAUTHORIZED_ACCESS_DEVICE] = DRV_ERRCOED_UNAUTHORIZED_ACCESS_DEVICE,

};



int32_t halMapErrorCode(drvError_t code)

{

    if ((uint32_t)code < sizeof(g_error_code_map) / sizeof(int32_t)) {

        return g_error_code_map[code];

    } else if (code == DRV_ERROR_NOT_SUPPORT) {

        return (int32_t)DRV_ERRCOED_NOT_SUPPORT;

    }



    return (int32_t)DRV_ERRCOED_INNER;

}



#ifdef ENABLE_BUILD_PRODUCT

#define ERROR_CODE_MAX_NUM 128

int error_code_filter(unsigned int *errorcode, int *errorcount)

{

    int index = 0;

    bool isDuplicate;

    int i, j;



    if (errorcode == NULL || errorcount == NULL || *errorcount < 0

        || *errorcount > ERROR_CODE_MAX_NUM) {

        return DRV_ERRCOED_INVALID_ARGUMENT;

    }



    for (i = 0; i < *errorcount; i++) {

        isDuplicate = false;

        for (j = 0; j < index; j++) {

            if (errorcode[i] == errorcode[j]) {

                isDuplicate = true;

                break;

            }

        }

        if (!isDuplicate) {

            errorcode[index++] = errorcode[i];

        }

    }

    *errorcount = index; // 更新错误码数量



    return DRV_ERRCOED_NONE;

}

#endif