/*
 * =====================================================================================
 *
 *       Filename:  tz_pebble_interface.h
 *
 *    Description:  Commom interface for pebble
 *
 *        Version:  1.0
 *        Created:  06/02/2020
 *       Revision:  none
 *       Compiler:  gcc
 *
 *        Company:  Samsung Electronics
 *        Copyright (c) 2020 by Samsung Electronics, All rights reserved.
 *
 * =====================================================================================
 */

#ifndef _TZ_PEBBLE_INTERFACE_H_
#define _TZ_PEBBLE_INTERFACE_H_

/**
 * Includes
 */
#include "stdint.h"
#include "tz_msg.h"
#include <openssl/sha.h>

/**
 * Length
 */

/**
 * PEBBLE Commands
 */
#define MAKE_NETWORK_CMD 1
#define WORKSPACE_NETWORK_CMD 2
#define MAKE_CONV_CMD 3
#define MAKE_MAX_CMD 4
#define MAKE_DROP_CMD 5
#define MAKE_CONNECTED_CMD 6
#define MAKE_SOFTMAX_CMD 7
#define MAKE_COST_CMD 8
#define FORWARD_CMD 9
#define BACKWARD_CMD 10
#define BACKWARD_ADD_CMD 11
#define UPDATE_CMD 12
#define NET_TRUTH_CMD 13
#define CALC_LOSS_CMD 14
#define TRANS_WEI_CMD 15
#define OUTPUT_RETURN_CMD 16
#define SAVE_WEI_CMD 17

#define FORWARD_BACK_CMD 18
#define BACKWARD_BACK_CMD 19
#define BACKWARD_BACK_ADD_CMD 20


#define BUF_T(MAX_BUF_LEN) \
	struct { \
	   uint32_t len; \
	   uint8_t buf[MAX_BUF_LEN]; \
	} __attribute__ ((packed))

#define DECLARE_BUF_T(MAX_BUF_LEN) \
	typedef struct { \
	   uint32_t len; \
	   uint8_t buf[MAX_BUF_LEN]; \
	} __attribute__ ((packed))

/**
 * Possible return codes
 */
typedef enum pebble_return_code {
	PEBBLE_STATUS_SUCCESS = 0x0,
	PEBBLE_STATUS_FAIL = 0x1,
	PEBBLE_INVALID_JWS = 0x2,
	PEBBLE_JWS_INVALID_FORMAT = 0x3,
	PEBBLE_JWS_NULL = 0x4,
	PEBBLE_JWS_INVALID_LENGTH = 0x5,
	PEBBLE_INVALID_SIGNATURE = 0x6,
	PEBBLE_INVALID_CERTCHAIN = 0x7,
	PEBBLE_INVALID_CA = 0x8,
	PEBBLE_COMPUTE_HASH_FAIL = 0xC,
	PEBBLE_GEN_DEVICE_ID_FAIL = 0x10,
	PEBBLE_KEY_ERROR = 0x11,
	PEBBLE_SIGNATURE_ERROR = 0x12,
	PEBBLE_CERT_DRK_FAIL = 0x13,
	PEBBLE_ALLOC_ERROR = 0x14,
	PEBBLE_GEN_RESPONSE_FAIL = 0x15,
	PEBBLE_BUF_SIZE_ERROR = 0x16,
	PEBBLE_CONVERT_DER_CERT_FAIL = 0x17,
	PEBBLE_DEVICE_ID_CHECK_FAIL = 0x18,
	PEBBLE_DEVICE_OK = 0x19,
	PEBBLE_DEVICE_COMPROMISED = 0x1A,
	PEBBLE_WRONG_POLICY_VERSION = 0x1B,
	PEBBLE_UNWRAP_DECAPSULATE_ERROR = 0x1C,
	PEBBLE_UNWRAP_APP_NAME_FAILED = 0x1D,
	PEBBLE_UNWRAP_FAILED_WRAP = 0x1E,
	PEBBLE_UNWRAP_FAILED_NO_KEY = 0x1F,
	PEBBLE_UNWRAP_FAILED = 0x20,
	PEBBLE_UNWRAP_VERSION_MISMATCH = 0x21,
	PEBBLE_UNWRAP_UNKNOWN = 0x22,
	PEBBLE_UNWRAP_LOAD_KEY_ERROR = 0x23,
	PEBBLE_UNWRAP_KEY_LENGTH_FAILED = 0x24,
	PEBBLE_ICCC_CHECK_FAIL = 0x28,
	PEBBLE_JSON_FAIL = 0x29,
	PEBBLE_DEREGISTER_SHARED_BUF_FAIL = 0x2A,
	PEBBLE_REGISTER_SHARED_BUF_FAIL = 0x2B,
	PEBBLE_READ_EM_STATUS_FAIL = 0x30,
	PEBBLE_INVALID_CN_CHECK = 0x31,
	PEBBLE_NONCE_NOT_READY = 0x32,
	PEBBLE_GEN_NONCE_FAIL = 0x33,
	PEBBLE_WRAP_FAILED = 0x34,
	PEBBLE_ATN_NONCE_MISMATCH = 0x35,
	PEBBLE_GEN_CHECKSUM_FAIL = 0x36,
	PEBBLE_DRK_NOT_READY = 0x37,
	PEBBLE_CREATE_JWE_FAILED = 0x38,
	PEBBLE_CREATE_JWS_FAILED = 0x39,
	PEBBLE_EXTRACT_JWE_FAILED = 0x3A,
	PEBBLE_EXTRACT_JWS_FAILED = 0x3B,
	PEBBLE_SHARE_CHECKSUM_MISMATCH = 0x40,
	PEBBLE_INVALID_USER_INPUT_LEN = 0x41,
	PEBBLE_SSS_SPLIT_ERROR = 0x42,
	PEBBLE_SSS_JOIN_ERROR = 0x43,
} pebble_return_code_t;

typedef struct {
        int passint[17];
        float passfloat[15];
} __attribute__ ((packed)) make_network_cmd_t;

typedef struct {
        int cond;
        BUF_T(4096) workspace;
} __attribute__ ((packed)) workspace_network_cmd_t;

typedef struct {
        int passint[14];
        float passflo;
        BUF_T(4096) acti;
} __attribute__ ((packed)) make_conv_cmd_t;

typedef struct {
        int passint[7];
} __attribute__ ((packed)) make_max_cmd_t;

typedef struct {
        int passint[5];
        float  passfloat[1];
        BUF_T(4096) net_prev_output;
        BUF_T(4096) net_prev_delta;
} __attribute__ ((packed)) make_drop_cmd_t;

typedef struct {
        int passarg[5];
        BUF_T(4096) actv;
} __attribute__ ((packed)) make_connected_cmd_t;

typedef struct {
        int passint[8];
        float passflo;
} __attribute__ ((packed)) make_softmax_cmd_t;

typedef struct {
        int passint[2];
        float passflo[4];
        BUF_T(4096) passcost;
} __attribute__ ((packed)) make_cost_cmd_t;

typedef struct {
        BUF_T(524288) vec;
        int passint[3];
        char type;
} __attribute__ ((packed)) trans_wei_cmd_t;

typedef struct {
        int passint[2];
        char type;
} __attribute__ ((packed)) save_wei_cmd_t;

typedef struct {
        BUF_T(4096) weights_back; //output sizeof(float)*length
} __attribute__ ((packed)) save_wei_resp_t;

typedef struct {
        BUF_T(524288) net_input;
        int net_train;
} __attribute__ ((packed)) forward_cmd_t;

typedef struct {
        BUF_T(4096) net_input_back;
} __attribute__ ((packed)) forward_back_cmd_t;

typedef struct {
        BUF_T(4096) net_input_back;
} __attribute__ ((packed)) forward_back_resp_t;

typedef struct {
        BUF_T(4096) net_input;
        int net_train;
} __attribute__ ((packed)) backward_cmd_t;

typedef struct {
        BUF_T(4096) net_input_back; //output
        BUF_T(4096) net_delta_back; //output
} __attribute__ ((packed)) backward_add_cmd_t;

typedef struct {
        BUF_T(4096) net_input_back; //output
        BUF_T(4096) net_delta_back; //output
} __attribute__ ((packed)) backward_add_resp_t;

typedef struct {
        BUF_T(4096) net_input;
        BUF_T(4096) net_delta;
} __attribute__ ((packed)) backward_back_cmd_t;

typedef struct {
        BUF_T(4096) net_input_back; //output
} __attribute__ ((packed)) backward_back_add_cmd_t;

typedef struct {
        BUF_T(4096) net_input_back; //output
} __attribute__ ((packed)) backward_back_add_resp_t;

typedef struct {
        int passint[3];
        float passflo[6];
} __attribute__ ((packed)) update_cmd_t;

typedef struct {
        BUF_T(4096) net_truth;
} __attribute__ ((packed)) net_truth_cmd_t;

typedef struct {
        int passint[2];
} __attribute__ ((packed)) calc_loss_cmd_t;

typedef struct {
        BUF_T(4096) net_output_back; //output
} __attribute__ ((packed)) output_return_cmd_t;

typedef struct {
        BUF_T(4096) net_output_back; //output
} __attribute__ ((packed)) output_return_resp_t;

typedef union {
        make_network_cmd_t         make_network_cmd;
        workspace_network_cmd_t    workspace_network_cmd;
        make_conv_cmd_t            make_conv_cmd;
        make_max_cmd_t             make_max_cmd;
        make_drop_cmd_t            make_drop_cmd;
        make_connected_cmd_t       make_connected_cmd;
        make_softmax_cmd_t         make_softmax_cmd;
        make_cost_cmd_t            make_cost_cmd;
        trans_wei_cmd_t            trans_wei_cmd;
        save_wei_cmd_t             save_wei_cmd;
        save_wei_resp_t            save_wei_resp;
        forward_cmd_t              forward_cmd;
        forward_back_cmd_t         forward_back_cmd;
        forward_back_resp_t        forward_back_resp;
        backward_cmd_t             backward_cmd;
        backward_add_cmd_t         backward_add_cmd;
        backward_add_resp_t        backward_add_resp;
        backward_back_cmd_t        backward_back_cmd;
        backward_back_add_cmd_t    backward_back_add_cmd;
        backward_back_add_resp_t   backward_back_add_resp;
        update_cmd_t               update_cmd;
        net_truth_cmd_t            net_truth_cmd;
        calc_loss_cmd_t            calc_loss_cmd;
        output_return_cmd_t        output_return_cmd;
        output_return_resp_t       output_return_resp;

} __attribute__ ((packed)) payload_t;

/**
 * TCI message
 */
typedef struct {
	tz_msg_header_t header;
	payload_t payload;
} __attribute__ ((packed)) tci_message_t;

#endif /* _TZ_PEBBLE_INTERFACE_H_ */
