/*******************************************************************************
Copyright (C) Marvell International Ltd. and its affiliates

This software file (the "File") is owned and distributed by Marvell 
International Ltd. and/or its affiliates ("Marvell") under the following
alternative licensing terms.  Once you have made an election to distribute the
File under one of the following license alternatives, please (i) delete this
introductory statement regarding license alternatives, (ii) delete the two
license alternatives that you have not elected to use and (iii) preserve the
Marvell copyright notice above.

********************************************************************************
Marvell Commercial License Option

If you received this File from Marvell and you have entered into a commercial
license agreement (a "Commercial License") with Marvell, the File is licensed
to you under the terms of the applicable Commercial License.

********************************************************************************
Marvell GPL License Option

If you received this File from Marvell, you may opt to use, redistribute and/or 
modify this File in accordance with the terms and conditions of the General 
Public License Version 2, June 1991 (the "GPL License"), a copy of which is 
available along with the File in the license.txt file or by writing to the Free 
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 or 
on the worldwide web at http://www.gnu.org/licenses/gpl.txt. 

THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED 
WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY 
DISCLAIMED.  The GPL License provides additional details about this warranty 
disclaimer.
********************************************************************************
Marvell BSD License Option

If you received this File from Marvell, you may opt to use, redistribute and/or 
modify this File under the following licensing terms. 
Redistribution and use in source and binary forms, with or without modification, 
are permitted provided that the following conditions are met:

    *   Redistributions of source code must retain the above copyright notice,
	    this list of conditions and the following disclaimer. 

    *   Redistributions in binary form must reproduce the above copyright
        notice, this list of conditions and the following disclaimer in the
        documentation and/or other materials provided with the distribution. 

    *   Neither the name of Marvell nor the names of its contributors may be 
        used to endorse or promote products derived from this software without 
        specific prior written permission. 
    
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

*******************************************************************************/

#ifndef _INC_BOOTSTRAP__DEF_H
#define _INC_BOOTSTRAP__DEF_H
//#include "bootstrap_os.h"

#ifndef MV_ASMLANGUAGE

#define	MAIN_HDR_VERSION	1

#define MAIN_HDR_NAND_SLC	0
#define MAIN_HDR_NAND_MLC	1

typedef struct BHR_t
{
//	type		name		 byte order
	MV_U8		blockID;	//0
	MV_U8		rsvd1;		//1
	MV_U16		nandPageSize;	//2-3
	MV_U32		blockSize;	//4-7
	MV_U8		version;		//8
	MV_U8		hdrSizeMsb;		//9
	MV_U16		hdrSizeLsb;		//10-11
	MV_U32		sourceAddr;	//12-15
	MV_U32		destinationAddr;//16-19
	MV_U32		executionAddr;	//20-23
	MV_U8		rsvd3;		//24
	MV_U8		nandBlockSize;	//25
	MV_U8		nandTechnology;	//26
	MV_U8		rsvd4;		//27
	MV_U16		rsvd2;		//28-29
	MV_U8		ext;		//30
	MV_U8		checkSum;	//31

} BHR_t, * pBHR_t;

#define MAIN_HDR_GET_LEN(pHdr)	\
	(((MV_U32)((pHdr)->hdrSizeMsb) << 16) | (cpu_to_le16((MV_U32)((pHdr)->hdrSizeLsb))))

#define EXT_HDR_TYP_SECURITY	0x01
#define EXT_HDR_TYP_BINARY	0x02
#define EXT_HDR_TYP_REGISTER	0x03

typedef struct headExtBHR_t /* Common extention header head */
{
//  type        name        byte order
	MV_U8		type;
	MV_U8		lenMsb;
	MV_U16		lenLsb;
	
} headExtBHR_t;

#define EXT_HDR_SET_LEN(pHead, len)	\
	do {\
		(pHead)->lenMsb = ((len) & 0x00FF0000) >> 16;\
		(pHead)->lenLsb =  (len) & 0x0000FFFF;\
	} while(0)

#define EXT_HDR_GET_LEN(pHead)	\
	(((MV_U32)((pHead)->lenMsb) << 16) | ((pHead)->lenLsb))

typedef struct tailExtBHR_t /* Common extention header tail */
{
//	type		name		byte order
	MV_U8		nextHdr;
	MV_U8		delay;
	MV_U16		rsvd2;
	
} tailExtBHR_t;

#define	RSA_MAX_KEY_LEN_BYTES	256

typedef struct secExtBHR_t
{
	headExtBHR_t	head;
	MV_U8		encrypt;
	MV_U8		rsrvd0;
	MV_U16		rsrvd1;
	MV_U8		pubKey[524];
	MV_U8		jtagEn;
	MV_U8		rsrvd2;
	MV_U16		rsrvd3;
	MV_U32		boxId;
	MV_U16		flashId;
	MV_U16		rsrvd4;
	MV_U8		hdrSign[256];
	MV_U8		imgSign[256];
	tailExtBHR_t	tail;

} secExtBHR_t, *pSecExtBHR_T;

#ifdef MV_TEST_PLATFORM
#define BOOTROM_SIZE		(64 * 1024)
#else
#define BOOTROM_SIZE		(48 * 1024)
#endif

#define EXT_HDR_BASE_SIZE	(sizeof(headExtBHR_t) + sizeof(tailExtBHR_t))
/* MAX size of entire headers block */
#define MAX_HEADER_SIZE		(64 * 1024)
/* MAX header size on restricted HW (no L2 cache) */
#define MAX_REST_HEADER_SIZE	(8 * 1024)
#define MAX_TWSI_HDR_SIZE	(60 * 1024) /* MAX eeprom is 64K & leave 4K for image and header */

#define MAX_HDR_SZ(rest)	((rest) == 0 ? MAX_HEADER_SIZE : MAX_REST_HEADER_SIZE)

/* Boot Type - block ID */
#define IBR_HDR_I2C_ID		0x4D
#define IBR_HDR_SPI_ID    	0x5A
#define IBR_HDR_NAND_ID     	0x8B
#define IBR_HDR_SATA_ID     	0x78
#define IBR_HDR_PEX_ID		0x9C
#define IBR_HDR_UART_ID     	0x69
#define IBR_DEF_ATTRIB      	0x00

#endif /* MV_ASMLANGUAGE */
#endif /* _INC_BOOTSTRAP_H */

