/*
 *
 * Copyright 2018-2020 NXP
 * SPDX-License-Identifier: Apache-2.0
 */

#ifndef _FSL_SSCP_A71CH_H_
#define _FSL_SSCP_A71CH_H_

#include "fsl_sscp.h"
#include "fsl_sss_sscp.h"

#if SSS_HAVE_A71XX

#include <HLSEAPI.h>
#include <fsl_sss_keyid_map.h>
#include <nxScp03_Types.h>
#include <sm_api.h>

/*******************************************************************************
 * API
 ******************************************************************************/

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

/**
 * struct _sscp_a71ch_context - SSCP context struct for A71 CH implementation
 *
 * This data type is used to keep context of the SSCP link.
 * It is completely implementation specific.
 *
 * @param context Container for the implementation specific data.
 */
typedef struct _sss_a71ch_key_store
{
    sss_sscp_session_t *session;
    /*! Implementation specific part */

    keyStoreTable_t *keystore_shadow;
    HLSE_OBJECT_HANDLE shadow_handle;

} sss_a71ch_key_store_t;

typedef struct _sscp_a71ch_context
{
    fn_sscp_invoke_command_t invoke;
    /*! Implementation specific part */
    sss_a71ch_key_store_t *keyStore;
} sscp_a71ch_context_t;

/*! @brief Initializes the SSCP link
 *
 * This function initializes the SSCP for operation - e.g.underlaying hardware
 * is initialized and prepared for data exchange.
 *
 * @param context Context structure for the SSCP.
 * @param base The A71ch peripheral base address to be used for communication
 *
 * @returns Status of the operation
 * @retval kStatus_SSCP_Success SSCP init success
 * @retval kStatus_SSCP_Fail SSCP init failure
 */
sss_status_t sscp_a71ch_init(sscp_a71ch_context_t *context, sss_a71ch_key_store_t *keyStore);

/*! @brief Close the SSCP link
 *
 * This function closes the SSCP link - e.g.underlying hardware is disabled.
 *
 * @param context Context structure for the SSCP.
 */
void sscp_a71ch_free(sscp_a71ch_context_t *context);

/*! @brief Sends a command and associated parameters to security sub-system
 *
 *  The commandID and operation content is serialized and sent over to the
 * selected security sub-system. This is implementation specific function. The
 * function can invoke both blocking and non-blocking secure functions in the
 * selected security sub-system.
 *
 * @param context Initialized SSCP context
 * @param commandID Command - an id of a remote secure function to be invoked
 * @param op Description of function arguments as a sequence of buffers and
 * values
 * @param ret Return code of the remote secure function (application layer
 * return value)
 *
 * @returns Status of the operation
 * @retval kStatus_SSCP_Success A blocking command has completed or a
 * non-blocking command has been accepted.
 * @retval kStatus_SSCP_Fail Operation failure, for example hardware fail.
 * @retval kStatus_SSCP_InvalidArgument One of the arguments is invalid for the
 * function to execute.
 */
sscp_status_t sscp_a71ch_invoke_command(
    sscp_context_t *context, uint32_t commandID, sscp_operation_t *op, uint32_t *ret);

sss_status_t sscp_a71ch_openSession(void *connectionData, sss_sscp_session_t *openSession);

void sscp_a71chkey_store_context_free(sss_a71ch_key_store_t *context);

void sscp_a71ch_closeSession(sss_sscp_session_t *closeSession);
void sscp_a71ch_closeConnect(void);

#if defined(__cplusplus)
}
#endif

/*!
 *@}
 */ /* end of sscp_a71ch */

#endif /* SSS_HAVE_A71CH */
#endif /* _FSL_SSCP_A71CH_H_ */
