/**
 * @file   secdrv_hw_hal.h
 * @brief  Header file for driver structure
 *
 * Copyright (c) 2015 Samsung Electronics Co., Ltd.
 *
 * This software is proprietary of Samsung Electronics.
 * No part of this software, either material or conceptual may be copied
 * or distributed, transmitted, transcribed, stored in a retrieval system
 * or translated into any human or computer language in any form by any means,
 * electronic, mechanical, manual or otherwise, or disclosed to third parties
 * without the express written permission of Samsung Electronics.
 */

#ifndef __SECDRV_HW_HAL_H__
#define __SECDRV_HW_HAL_H__

#include "sec_g2d_4x.h"
#include "error.h"

#define MAXIMUM_DATA_LENGTH	1024
#define MAX_NAME_LENGTH		20

#define SHIFT_8KB	(13u)
#define SIZE_8KB	(1 << SHIFT_8KB)
#define SIZE_1MB	0x100000
#define SHIFT_4MB	(22)

struct secMem_t {
	int index;
	uint8_t name[MAX_NAME_LENGTH];
	uint64_t base;
	uint64_t size;
};

struct secMfcFw_t {
	uint8_t	*addr;
	uint32_t len;
};
enum aesMode_t {
	ECB_MODE_DRM,
	CBC_MODE_DRM,
	CBC_CTS_MODE_DRM,
	CTR_MODE_DRM,
};

enum cipherAlgorithm_t {
	AES_CBC_128_NO_PADDING = 0,
	AES_CTR_128_NO_PADDING = 1,
};

enum contentMode_t {
	VIDEO,
	AUDIO,
};

enum flag_lists {
	OEM_FLAG,
	HDCP_FLAG,
	PLAYREADY_FLAG,
	NUM_FLAGS,
};

enum subsample_flags {
	NO_FIRST_LAST = 0,
	FIRST_SUB_SAMPLE = 1,
	LAST_SUB_SAMPLE = 2,
	BOTH_FIRST_LAST = 3,
};

enum buffer_t {
	CLEAR_BUFFER,
	SECURE_BUFFER,
	DIRECT_BUFFER,
};

struct secCipher_t {
	uint32_t *key;
	uint32_t key_len;
	uint32_t *iv;
	uint32_t iv_len;
	uint8_t	*input;
	uint32_t input_len;
	uint8_t	*output;
	uint32_t output_len;
	size_t block_offset;
	enum cipherAlgorithm_t cipher_algo;
	enum subsample_flags subsample_flags;
	enum buffer_t buf_type;
};

struct secBlit_t {
	enum blit_op op;
	struct fimg2d_param param;
	struct fimg2d_image src;
	struct fimg2d_image msk;
	struct fimg2d_image tmp;
	struct fimg2d_image dst;
	enum blit_sync sync;
	unsigned int seq_no;
};

struct secFlag_t {
	uint32_t *addr;
	uint32_t value;
	uint32_t mask;
};

struct secRtc_t {
	uint32_t tm_sec;
	uint32_t tm_min;
	uint32_t tm_hour;
	uint32_t tm_mday;
	uint32_t tm_mon;
	uint32_t tm_year;
};

struct secRtcTick_t {
	bool tick_enable;
	uint32_t tick_cnt_val;
};

struct secMemcpy_t {
	uint8_t *dst;
	uint8_t *src;
	uint32_t len;
};

struct secHDCPVer_t {
	uint8_t *maximum;
	uint8_t *current;
};

struct secHDCPKeyInfo_t {
	uint32_t *session_key;
	uint32_t *riv;
};

struct secDrm_ctx_t {
	uint32_t chunk_num;
	struct secMem_t *secMem;
	struct secMfcFw_t *secMfcFw;
	struct secSss_t *secSss;
	struct secBlit_t *secBlit;
	struct secFlag_t secFlag[NUM_FLAGS];
	struct secRtc_t *secRtc;
	struct secMemcpy_t *secMemcpy;
	uint8_t *hdcp_bksv;
	uint32_t cp_mask;
	struct secCipher_t *secCipher;
	struct secRtcTick_t *secRtcTick;
	struct secHDCPVer_t *secHDCPVer;
};

#if defined(CONFIG_SRPMB)
typedef struct {
	uint32_t partition;
	uint32_t address;
	uint8_t *data;
	uint32_t blk_num;
} tlapi_rpmb_write_t;

typedef struct {
	uint32_t partition;
	uint32_t address;
	uint32_t blk_num;
	uint8_t *output_data;
} tlapi_rpmb_read_t;
#endif

#endif /* __SECDRV_HW_HAL_H__ */

