/**
 * Copyright (c) 2026 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 CCE_RUNTIME_RT_INNER_DEVICE_H
#define CCE_RUNTIME_RT_INNER_DEVICE_H

#include "base.h"

#if defined(__cplusplus)
extern "C" {
#endif

typedef enum rtAtomicOperationCapability {
    RT_ATOMIC_CAPABILITY_SIGNED = 1U << 0U,
    RT_ATOMIC_CAPABILITY_UNSIGNED = 1U << 1U,
    RT_ATOMIC_CAPABILITY_REDUCATION = 1U << 2U, // DEPRECATED: Use RT_ATOMIC_CAPABILITY_REDUCTION
    RT_ATOMIC_CAPABILITY_REDUCTION = 1U << 2U,
    RT_ATOMIC_CAPABILITY_SCALAR8 = 1U << 3U,
    RT_ATOMIC_CAPABILITY_SCALAR16 = 1U << 4U,
    RT_ATOMIC_CAPABILITY_SCALAR32 = 1U << 5U,
    RT_ATOMIC_CAPABILITY_SCALAR64 = 1U << 6U,
    RT_ATOMIC_CAPABILITY_SCALAR128 = 1U << 7U,
    RT_ATOMIC_CAPABILITY_VECTOR32X4 = 1U << 8U,
} rtAtomicOperationCapability;

typedef enum rtAtomicOperation {
    RT_ATOMIC_OPERATION_INTEGER_ADD = 0,
    RT_ATOMIC_OPERATION_INTEGER_MIN = 1,
    RT_ATOMIC_OPERATION_INTEGER_MAX = 2,
    RT_ATOMIC_OPERATION_INTEGER_INCREMENT = 3,
    RT_ATOMIC_OPERATION_INTEGER_DECREMENT = 4,
    RT_ATOMIC_OPERATION_AND = 5,
    RT_ATOMIC_OPERATION_OR = 6,
    RT_ATOMIC_OPERATION_XOR = 7,
    RT_ATOMIC_OPERATION_EXCHANGE = 8,
    RT_ATOMIC_OPERATION_CAS = 9,
    RT_ATOMIC_OPERATION_FLOAT_ADD = 10,
    RT_ATOMIC_OPERATION_FLOAT_MIN = 11,
    RT_ATOMIC_OPERATION_FLOAT_MAX = 12,

    RT_ATOMIC_OPERATION_DMA_ADD = 30,
    RT_ATOMIC_OPERATION_DMA_MIN = 31,
    RT_ATOMIC_OPERATION_DMA_MAX = 32,

    RT_ATOMIC_OPERATION_SIMD_SCALAR_ADD = 40,
    RT_ATOMIC_OPERATION_SIMD_SCALAR_MIN = 41,
    RT_ATOMIC_OPERATION_SIMD_SCALAR_MAX = 42,
    RT_ATOMIC_OPERATION_SIMD_SCALAR_CAS = 43,
    RT_ATOMIC_OPERATION_SIMD_SCALAR_EXCH = 44,
} rtAtomicOperation;

/**
 * @ingroup dvrt_dev
 * @brief get h2d atomic capabilities by device id
 * @param [out] capabilities   atomic capabilities
 * @param [in] operations   atomic operations
 * @param [in] count   atomic operations count
 * @param [in] deviceId   device id
 * @return RT_ERROR_NONE for ok
 */
RTS_API rtError_t rtDeviceGetHostAtomicCapabilities(
    uint32_t* capabilities, const rtAtomicOperation* operations, const uint32_t count, int32_t deviceId);

/**
 * @ingroup dvrt_dev
 * @brief get p2p atomic capabilities by device id
 * @param [out] capabilities   atomic capabilities
 * @param [in] operations   atomic operations
 * @param [in] count   atomic operations count
 * @param [in] srcDeviceId   source device id
 * @param [in] dstDeviceId   destination device id
 * @return RT_ERROR_NONE for ok
 */
RTS_API rtError_t rtDeviceGetP2PAtomicCapabilities(
    uint32_t* capabilities, const rtAtomicOperation* operations, const uint32_t count, int32_t srcDeviceId,
    int32_t dstDeviceId);

/**
 * @ingroup dvrt_dev
 * @brief get device resource limit value
 * @param [in] type   limit type
 * @param [out] val   limit value
 * @return RT_ERROR_NONE for ok
 * @return RT_ERROR_INVALID_VALUE for error input
 */
RTS_API rtError_t rtDeviceGetLimit(rtLimitType_t type, uint32_t* val);

/**
 * @ingroup dvrt_dev
 * @brief Flush L2 cache for current device
 * @param [in] rsv Reserved parameter, must be nullptr
 * @return RT_ERROR_NONE for success
 * @return RT_ERROR_FEATURE_NOT_SUPPORT driver does not support this feature
 */
RTS_API rtError_t rtDeviceL2CacheFlush(void* rsv);

#if defined(__cplusplus)
}
#endif
#endif // CCE_RUNTIME_RT_INNER_DEVICE_H