/*
 * Copyright (c) 2017-2022, Arm Limited. All rights reserved.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 *
 */

#ifndef __TFM_PLAT_DEFS_H__
#define __TFM_PLAT_DEFS_H__
/**
 * \note The interfaces defined in this file must be implemented for each
 *       target.
 */

#include <stdint.h>
#include <limits.h>

#ifdef PLATFORM_ERROR_CODES
#include "platform_error_codes.h"
#else
enum tfm_plat_err_t {
    TFM_PLAT_ERR_SUCCESS = 0,
    TFM_PLAT_ERR_SYSTEM_ERR = 0x3A5C,
    TFM_PLAT_ERR_MAX_VALUE = 0x55A3,
    TFM_PLAT_ERR_INVALID_INPUT = 0xA3C5,
    TFM_PLAT_ERR_UNSUPPORTED = 0xC35A,
    TFM_PLAT_ERR_NOT_PERMITTED = 0xC5A3,
    /* Following entry is only to ensure the error code of int size */
    TFM_PLAT_ERR_FORCE_INT_SIZE = INT_MAX
};
#endif /* PLATFORM_ERROR_CODES */

#if defined(TFM_ISOLATION_LEVEL) && (TFM_ISOLATION_LEVEL != 1)

/*!
 * \def TFM_LINK_SET_RO_IN_PARTITION_SECTION(TFM_PARTITION_NAME)
 *
 * \brief This macro provides a mechanism to place a function code or a data
 *        variable in the code section (e.g. RO) of a specific secure partition
 *        at linker time.
 *
 * \param[in] TFM_PARTITION_NAME  TF-M partition name assigned in the manifest
 *                                file "name" field.
 * \param[in] TFM_PARTITION_TYPE  TF-M partition type assigned in the manifest
 *                                file "type" field.
 */
#define TFM_LINK_SET_RO_IN_PARTITION_SECTION(TFM_PARTITION_NAME, \
                                             TFM_PARTITION_TYPE) \
    __attribute__((section(TFM_PARTITION_NAME "_" TFM_PARTITION_TYPE "_ATTR_FN")))

/*!
 * \def TFM_LINK_SET_RW_IN_PARTITION_SECTION(TFM_PARTITION_NAME)
 *
 * \brief This macro provides a mechanism to place data variables in the RW data
 *        section of a specific secure partition at linker time.
 *
 * \param[in] TFM_PARTITION_NAME  TF-M partition name assigned in the manifest
 *                                file "name" field.
 * \param[in] TFM_PARTITION_TYPE  TF-M partition type assigned in the manifest
 *                                file "type" field.
 */
#define TFM_LINK_SET_RW_IN_PARTITION_SECTION(TFM_PARTITION_NAME, \
                                             TFM_PARTITION_TYPE) \
    __attribute__((section(TFM_PARTITION_NAME "_" TFM_PARTITION_TYPE "_ATTR_RW")))

/*!
 * \def TFM_LINK_SET_ZI_IN_PARTITION_SECTION(TFM_PARTITION_NAME)
 *
 * \brief This macro provides a mechanism to place data variables in the ZI data
 *        section of a specific secure partition at linker time.
 *
 * \param[in] TFM_PARTITION_NAME  TF-M partition name assigned in the manifest
 *                                file "name" field.
 * \param[in] TFM_PARTITION_TYPE  TF-M partition type assigned in the manifest
 *                                file "type" field.
 */
#define TFM_LINK_SET_ZI_IN_PARTITION_SECTION(TFM_PARTITION_NAME, \
                                             TFM_PARTITION_TYPE) \
    __attribute__((section(TFM_PARTITION_NAME "_" TFM_PARTITION_TYPE "_ATTR_ZI")))
#else
#define TFM_LINK_SET_RO_IN_PARTITION_SECTION(TFM_PARTITION_NAME, TFM_PARTITION_TYPE)
#define TFM_LINK_SET_RW_IN_PARTITION_SECTION(TFM_PARTITION_NAME, TFM_PARTITION_TYPE)
#define TFM_LINK_SET_ZI_IN_PARTITION_SECTION(TFM_PARTITION_NAME, TFM_PARTITION_TYPE)
#endif
#endif /* __TFM_PLAT_DEFS_H__ */
