/** @file
  OP-TEE specific header file.

  Copyright (c) 2018, Linaro Ltd. All rights reserved.<BR>
  Copyright (c) 2021, Arm Limited. All rights reserved.<BR>

  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#ifndef OPTEE_LIB_H_
#define OPTEE_LIB_H_

/*
 * The 'Trusted OS Call UID' is supposed to return the following UUID for
 * OP-TEE OS. This is a 128-bit value.
 */
#define OPTEE_OS_UID0  0x384fb3e0
#define OPTEE_OS_UID1  0xe7f811e3
#define OPTEE_OS_UID2  0xaf630002
#define OPTEE_OS_UID3  0xa5d5c51b

#define OPTEE_MESSAGE_ATTRIBUTE_TYPE_NONE           0x0
#define OPTEE_MESSAGE_ATTRIBUTE_TYPE_VALUE_INPUT    0x1
#define OPTEE_MESSAGE_ATTRIBUTE_TYPE_VALUE_OUTPUT   0x2
#define OPTEE_MESSAGE_ATTRIBUTE_TYPE_VALUE_INOUT    0x3
#define OPTEE_MESSAGE_ATTRIBUTE_TYPE_MEMORY_INPUT   0x9
#define OPTEE_MESSAGE_ATTRIBUTE_TYPE_MEMORY_OUTPUT  0xa
#define OPTEE_MESSAGE_ATTRIBUTE_TYPE_MEMORY_INOUT   0xb

#define OPTEE_MESSAGE_ATTRIBUTE_TYPE_MASK  0xff

#define OPTEE_SUCCESS               0x00000000
#define OPTEE_ORIGIN_COMMUNICATION  0x00000002
#define OPTEE_ERROR_COMMUNICATION   0xFFFF000E

typedef struct {
  UINT64    BufferAddress;
  UINT64    Size;
  UINT64    SharedMemoryReference;
} OPTEE_MESSAGE_PARAM_MEMORY;

typedef struct {
  UINT64    A;
  UINT64    B;
  UINT64    C;
} OPTEE_MESSAGE_PARAM_VALUE;

typedef union {
  OPTEE_MESSAGE_PARAM_MEMORY    Memory;
  OPTEE_MESSAGE_PARAM_VALUE     Value;
} OPTEE_MESSAGE_PARAM_UNION;

typedef struct {
  UINT64                       Attribute;
  OPTEE_MESSAGE_PARAM_UNION    Union;
} OPTEE_MESSAGE_PARAM;

#define OPTEE_MAX_CALL_PARAMS  4

typedef struct {
  UINT32                 Command;
  UINT32                 Function;
  UINT32                 Session;
  UINT32                 CancelId;
  UINT32                 Pad;
  UINT32                 Return;
  UINT32                 ReturnOrigin;
  UINT32                 NumParams;

  // NumParams tells the actual number of element in Params
  OPTEE_MESSAGE_PARAM    Params[OPTEE_MAX_CALL_PARAMS];
} OPTEE_MESSAGE_ARG;

typedef struct {
  EFI_GUID    Uuid;         // [in] GUID/UUID of the Trusted Application
  UINT32      Session;      // [out] Session id
  UINT32      Return;       // [out] Return value
  UINT32      ReturnOrigin; // [out] Origin of the return value
} OPTEE_OPEN_SESSION_ARG;

typedef struct {
  UINT32                 Function;                      // [in] Trusted Application function, specific to the TA
  UINT32                 Session;                       // [in] Session id
  UINT32                 Return;                        // [out] Return value
  UINT32                 ReturnOrigin;                  // [out] Origin of the return value
  OPTEE_MESSAGE_PARAM    Params[OPTEE_MAX_CALL_PARAMS]; // Params for function to be invoked
} OPTEE_INVOKE_FUNCTION_ARG;

BOOLEAN
EFIAPI
IsOpteePresent (
  VOID
  );

EFI_STATUS
EFIAPI
OpteeInit (
  VOID
  );

EFI_STATUS
EFIAPI
OpteeOpenSession (
  IN OUT OPTEE_OPEN_SESSION_ARG  *OpenSessionArg
  );

EFI_STATUS
EFIAPI
OpteeCloseSession (
  IN UINT32  Session
  );

EFI_STATUS
EFIAPI
OpteeInvokeFunction (
  IN OUT OPTEE_INVOKE_FUNCTION_ARG  *InvokeFunctionArg
  );

#endif // OPTEE_LIB_H_
