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

/*
 * Generated by erpcgen 1.9.1 on Fri Jul 21 17:28:31 2023.
 *
 * AUTOGENERATED - DO NOT EDIT
 */


#if !defined(_tfm_erpc_h_)
#define _tfm_erpc_h_

#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include "erpc_version.h"
#include "psa/client.h"

#if 10901 != ERPC_VERSION_NUMBER
#error "The generated shim code version is different to the rest of eRPC code."
#endif

#if !defined(ERPC_TYPE_DEFINITIONS)
#define ERPC_TYPE_DEFINITIONS

// Aliases data types declarations
typedef struct list_binary_1_t list_binary_1_t;
typedef struct binary_t binary_t;

// Structures/unions data types declarations
struct list_binary_1_t
{
    binary_t * elements;
    uint32_t elementsCount;
};

struct binary_t
{
    uint8_t * data;
    uint32_t dataLength;
};


#endif // ERPC_TYPE_DEFINITIONS

/*! @brief psa_client_api identifiers */
enum _psa_client_api_ids
{
    kpsa_client_api_service_id = 1,
    kpsa_client_api_psa_framework_version_id = 1,
    kpsa_client_api_psa_version_id = 2,
    kpsa_client_api_erpc_psa_call_id = 3,
    kpsa_client_api_psa_connect_id = 4,
    kpsa_client_api_psa_close_id = 5,
};

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

//! @name psa_client_api
//@{
uint32_t psa_framework_version(void);

uint32_t psa_version(uint32_t sid);

psa_status_t erpc_psa_call(psa_handle_t handle, int32_t t, const list_binary_1_t * erpc_in_vec, list_binary_1_t * erpc_out_vec);

psa_handle_t psa_connect(uint32_t sid, uint32_t ver);

void psa_close(psa_handle_t handle);
//@}

#if defined(__cplusplus)
}
#endif

#endif // _tfm_erpc_h_
