/*
**********************************************************************************************************************
*
*						           the Embedded Secure Bootloader System
*
*
*						       Copyright(C), 2006-2014, Allwinnertech Co., Ltd.
*                                           All Rights Reserved
*
* File    :
*
* By      :
*
* Version : V2.00
*
* Date	  :
*
* Descript:
**********************************************************************************************************************
*/

#ifndef __EFUSE_H__
#define __EFUSE_H__

#include "../sunxi_def.h"

#define SID_PRCTL				(SUNXI_SID_BASE + 0x40)
#define SID_PRKEY				(SUNXI_SID_BASE + 0x50)
#define SID_RDKEY				(SUNXI_SID_BASE + 0x60)
#define SJTAG_AT0				(SUNXI_SID_BASE + 0x80)
#define SJTAG_AT1				(SUNXI_SID_BASE + 0x84)
#define SJTAG_S					(SUNXI_SID_BASE + 0x88)
#define SID_RF(n)               (SUNXI_SID_BASE + (n) * 4 + 0x80)

#define SID_EFUSE               (SUNXI_SID_BASE + 0x200)


#define EFUSE_CHIPID            (0x00)
#define EFUSE_OEM_PROGRAM       (0x10)
#define EFUSE_NV1               (0x14)
#define EFUSE_NV2               (0x18)
#define EFUSE_RSAKEY_HASH       (0x20)
#define EFUSE_THERMAL_SENSOR    (0x34)
#define EFUSE_RENEWABILITY      (0x3C)
#define EFUSE_IN                (0x44)
#define EFUSE_IDENTIFI          (0x5C)
#define EFUSE_ID                (0x60)
#define EFUSE_ROTPK             (0x64)
#define EFUSE_SSK               (0x84)
#define EFUSE_RSSK              (0x94)

#define EFUSE_HDCP_HASH         (0xB4)
#define EFUSE_EK_HASH           (0xC4)

#define EFUSE_SN                (0xD4)
#define EFUSE_NV2_BACKUP        (0xEC)

#define EFUSE_LCJS              (0xF4)
#define EFUSE_DEBUG             (0xF8)
#define EFUSE_CHIP_CONFIG       (0xFC)

// size (bit)
#define SID_CHIPID_SIZE			(128)
#define SID_OEM_PROGRAM_SIZE	(32)
#define	SID_NV1_SIZE			(32)
#define	SID_NV2_SIZE			(64)
#define	SID_RSAKEY_HASH_SIZE	(160)
#define	SID_THERMAL_SIZE		(64)
#define	SID_RENEWABILITY_SIZE	(64)
#define	SID_IN_SIZE			    (192)
#define	SID_IDENTIFY_SIZE		(32)
#define	SID_ID_SIZE			    (32)
#define	SID_ROTPK_SIZE			(256)
#define	SID_SSK_SIZE			(128)
#define	SID_RSSK_SIZE			(256)
#define	SID_HDCP_HASH_SIZE		(128)
#define	SID_EK_HASH_SIZE		(128)
#define	SID_SN_SIZE			    (192)

// chip config show flag
#define	SCC_SN_DONTSHOW_FLAG						(20)
#define	SCC_ID_DONTSHOW_FLAG						(19)
#define	SCC_IN_DONTSHOW_FLAG						(17)
#define	SCC_RSSK_DONTSHOW_FLAG						(16)
#define	SCC_SSK_DONTSHOW_FLAG						(15)
#define	SCC_ROTPK_DONTSHOW_FLAG						(14)

// chip config burned flag
#define	SCC_SN_BURNED_FLAG						    (9)
#define	SCC_RSAKEYHASH_BURNED_FLAG					(8)
#define	SCC_EK_HASH_BURNED_FLAG						(7)
#define	SCC_HDCP_HASH_BURNED_FLAG					(6)
#define	SCC_RSSK_BURNED_FLAG					    (5)
#define	SCC_SSK_BURNED_FLAG							(4)
#define	SCC_ROTPK_BURNED_FLAG						(3)
#define	SCC_SECURE_ENABLE_BURNED_FLAG				(1)
#define	SCC_TEST_DISABLE							(0)


typedef struct
{
    //以下信息重复,表示每个key的信息
    char  name[64];              //key的名称
    unsigned int    len;        //key数据段的总长度
    unsigned int    res;
	unsigned char  *key_data;   //这是一个数组,存放key的全部信息,数据长度由len指定
}
sunxi_efuse_key_info_t;

#define ARM_SVC_EFUSE_BASE_AARCH32       (0x80000000)
#define ARM_SVC_EFUSE_BASE_AARCH64       (0xc0000000)

//efuse cmd
#define ARM_SVC_EFUSE_READ                           (ARM_SVC_EFUSE_BASE_AARCH32 + 0xfe00)
#define ARM_SVC_EFUSE_WRITE                          (ARM_SVC_EFUSE_BASE_AARCH32 + 0xfe01)
#define ARM_SVC_EFUSE_PROBE_SECURE_ENABLE_AARCH32    (ARM_SVC_EFUSE_BASE_AARCH32 + 0xfe03)
#define ARM_SVC_EFUSE_PROBE_SECURE_ENABLE_AARCH64    (ARM_SVC_EFUSE_BASE_AARCH64 + 0xfe03)


extern void sid_program_key(unsigned int key_index, unsigned int key_value);
extern unsigned int sid_read_key(unsigned int key_index);
extern void sid_set_security_mode(void);
extern int sid_probe_security_mode(void);

extern int sunxi_efuse_write(void *key_buf);
int sunxi_efuse_read(void *key_name, void *read_buf);
int sunxi_efuse_probe_security_mode(void);



#endif    /*  #ifndef __EFUSE_H__  */