/*
 * (C) Copyright 2007-2013
 * Allwinner Technology Co., Ltd. <www.allwinnertech.com>
 * Jerry Wang <wangflord@allwinnertech.com>
 *
 * See file CREDITS for list of people who contributed to this
 * project.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 * MA 02111-1307 USA
 */

#ifndef  __toc_v2_h
#define  __toc_v2_h


#include "spare_head.h"

#define  TOC0_MAGIC             "TOC0.GLH"
#define  TOC_MAIN_INFO_MAGIC    0x89119800

#define  SECURE_SWITCH_OTHER   0
#define  SECURE_SWITCH_NORMAL  1
#define  SECURE_NON_SECUREOS   2

/*增加安全启动下，toc0的头部数据结构 */
typedef struct {
	u8 name[8];    /*字符串，可以更改，没有作限制 */
	u32 magic;     /*必须是0x89119800 */
	u32 check_sum; /*整个数据的校验和，参考现在boot0做法 */

	u32 serial_num; /*序列号，可以更改，没有限制 */
	u32 status;     /*可以更改，没有限制 */

	u32 items_nr;     /*总的项目个数，对TOC0来说，必须是2 */
	u32 length;       /*TOC0的长度 */
	u8  platform[4];  /*toc_platform[0]标示启动介质 */
			/*0：nand；1：卡0；2：卡2；3：spinor */
	u32 reserved[2];  /*保留位 */
	u32 end;          /*表示头部结构体结束，必须是0x3b45494d */

}
toc0_private_head_t;

//增加安全启动下，toc1的头部数据结构
typedef struct sbrom_toc1_head_info
{
	char name[16]	;	//user can modify
	u32  magic	;	//must equal TOC_U32_MAGIC
	u32  add_sum	;

	u32  serial_num	;	//user can modify
	u32  status		;	//user can modify,such as TOC_MAIN_INFO_STATUS_ENCRYP_NOT_USED

	u32  items_nr;	//total entry number
	u32  valid_len;
	u32  version_main;	//only one byte
	u32  version_sub;   //two bytes
	u32  reserved[3];	//reserved for future

	u32  end;
}
sbrom_toc1_head_info_t;


typedef struct sbrom_toc1_item_info
{
	char name[64];			//such as ITEM_NAME_SBROMSW_CERTIF
	u32  data_offset;
	u32  data_len;
	u32  encrypt;			//0: no aes   //1: aes
	u32  type;				//0: normal file, dont care  1: key certif  2: sign certif 3: bin file
	u32  run_addr;          //if it is a bin file, then run on this address; if not, it should be 0
	u32  index;             //if it is a bin file, this value shows the index to run; if not
	                       //if it is a certif file, it should equal to the bin file index
	                       //that they are in the same group
	                       //it should be 0 when it anyother data type
	u32  reserved[69];	   //reserved for future;
	u32  end;
}sbrom_toc1_item_info_t;

typedef struct sbrom_toc0_config
{
	unsigned char    	config_vsn[4];
	unsigned int      	dram_para[32];  	// dram参数
	int				  	uart_port;      	// UART控制器编号
	normal_gpio_cfg   	uart_ctrl[2];    	// UART控制器GPIO
	int              	enable_jtag;    	// JTAG使能
	normal_gpio_cfg   	jtag_gpio[5];    	// JTAG控制器GPIO
	normal_gpio_cfg  	storage_gpio[50]; 	// 存储设备 GPIO信息
                							// 0-23放nand，24-31存放卡0，32-39放卡2
                							// 40-49存放spi
	char   				storage_data[384];  // 0-159,存储nand信息；160-255,存放卡信息
	unsigned int       secure_dram_mbytes; //
	unsigned int       drm_start_mbytes;   //
	unsigned int       drm_size_mbytes;    //
	unsigned int       boot_cpu;           //
	special_gpio_cfg    a15_power_gpio;  //the gpio config is to a15 extern power enable gpio
	unsigned int       next_exe_pa;
	unsigned int       secure_without_OS;   //secure boot without semelis
	unsigned char       debug_mode;         //1:turn on printf; 0 :turn off printf
	unsigned char       power_mode;          /* 0:axp , 1: dummy pmu  */
	unsigned char       rotpk_flag;
	unsigned char       reserver[1];
	unsigned int		card_work_mode;
	unsigned int        dram_size;  /*write back to spl to limit dram size*/
	unsigned int      	res[1];   			// 总共1024字节

}
sbrom_toc0_config_t;

#define RSA_BIT			(2048)
#define PK_MAX_LEN_BIT		(RSA_BIT*2)
#define PK_MAX_LEN_BYTE		(PK_MAX_LEN_BIT >> 3)

typedef struct SBROM_TOC0_KEY_ITEM_info {
	unsigned int	vendor_id;
	unsigned int	KEY0_PK_mod_len;
	unsigned int	KEY0_PK_e_len;
	unsigned int	KEY1_PK_mod_len;
	unsigned int	KEY1_PK_e_len;
	unsigned int	sign_len;
	unsigned char	KEY0_PK[PK_MAX_LEN_BYTE];
	unsigned char	KEY1_PK[PK_MAX_LEN_BYTE];
	unsigned char	reserve[32];
	unsigned char	sign[256];
} SBROM_TOC0_KEY_ITEM_info_t;

typedef struct SBROM_TOC0_ITEM_info {
	u32 name;
	u32 data_offset;
	u32 data_len;
	u32 status;
	u32 type;
	u32 run_addr;
	u32 reserved_1;
	u32 end;
}  SBROM_TOC0_ITEM_info_t;

#define ITEM_PARAMETER_NAME             "parameter"
#define ITEM_OPTEE_NAME			"optee"
#define ITEM_SCP_NAME			"scp"
#define ITEM_MONITOR_NAME		"monitor"
#define ITEM_UBOOT_NAME			"u-boot"
#define ITEM_UBOOT_GZ_NAME		"u-boot-gz"
#define ITEM_UBOOT_LZ4_NAME		"u-boot-lz4"
#define ITEM_UBOOT_LZMA_NAME		"u-boot-lzma"
#define ITEM_UBOOT_ZSTD_NAME		"u-boot-zstd"
#define ITEM_RTOS_NAME			"rtos"
#define ITEM_RTOS_GZ_NAME		"rtos-gz"
#define ITEM_RTOS_LZ4_NAME		"rtos-lz4"
#define ITEM_RTOS_LZMA_NAME		"rtos-lzma"
#define ITEM_MELIS_NAME			"melis"
#define ITEM_MELIS_GZ_NAME		"melis-gz"
#define ITEM_MELIS_LZ4_NAME		"melis-lz4"
#define ITEM_MELIS_LZMA_NAME    "melis-lzma"
#define ITEM_MELIS_ZSTD_NAME    "melis-zstd"
#define ITEM_MELIS_ELF_NAME		"melis-elf"
#define ITEM_MELIS_CONFIG_NAME	"melis-config"
#define ITEM_OPENSBI_NAME		"opensbi"
#define ITEM_LOGO_NAME			"logo"
#define ITEM_DTB_NAME			"dtb"
#define ITEM_DTB_GZ_NAME		"dtb-gz"
#define ITEM_DTB_LZ4_NAME		"dtb-lz4"
#define ITEM_DTB_LZMA_NAME		"dtb-lzma"
#define ITEM_DTBO_NAME			"dtbo"
#define ITEM_SOCCFG_NAME		"soc-cfg"
#define ITEM_BDCFG_NAME			"board-cfg"
#define ITEM_ESM_IMG_NAME          "esm-img"
#define ITEM_SHUTDOWNCHARGE_LOGO_NAME	"shutdowncharge"
#define ITEM_ANDROIDCHARGE_LOGO_NAME	"androidcharge"
#define ITEM_EMMC_FW_NAME		"emmc-fw"
#define ITEM_NAME_SBROMSW_KEY		0x010303

extern sbrom_toc0_config_t *toc0_config;

#endif     //  ifndef __toc_h

/* end of toc.h */
