ASR_BASE

Change-Id: Icf3719cc0afe3eeb3edc7fa80a2eb5199ca9dda1
diff --git a/marvell/obm/Common/Download/ProtocolManager.h b/marvell/obm/Common/Download/ProtocolManager.h
new file mode 100644
index 0000000..a23be4e
--- /dev/null
+++ b/marvell/obm/Common/Download/ProtocolManager.h
@@ -0,0 +1,398 @@
+/******************************************************************************
+**
+** INTEL CONFIDENTIAL
+** Copyright 2003-2004 Intel Corporation All Rights Reserved.
+**
+** The source code contained or described herein and all documents
+** related to the source code (Material) are owned by Intel Corporation
+** or its suppliers or licensors.  Title to the Material remains with
+** Intel Corporation or its suppliers and licensors. The Material contains
+** trade secrets and proprietary and confidential information of Intel
+** or its suppliers and licensors. The Material is protected by worldwide
+** copyright and trade secret laws and treaty provisions. No part of the
+** Material may be used, copied, reproduced, modified, published, uploaded,
+** posted, transmitted, distributed, or disclosed in any way without Intel's
+** prior express written permission.
+**
+** No license under any patent, copyright, trade secret or other intellectual
+** property right is granted to or conferred upon you by disclosure or
+** delivery of the Materials, either expressly, by implication, inducement,
+** estoppel or otherwise. Any license under such intellectual property rights
+** must be express and approved by Intel in writing.
+**
+**	 ProtocolManager.h
+******************************************************************************//******************************************************************************
+ *
+ *  (C)Copyright 2005 - 2011 Marvell. All Rights Reserved.
+ *
+ *  THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MARVELL.
+ *  The copyright notice above does not evidence any actual or intended
+ *  publication of such source code.
+ *  This Module contains Proprietary Information of Marvell and should be
+ *  treated as Confidential.
+ *  The information in this file is provided for the exclusive use of the
+ *  licensees of Marvell.
+ *  Such users have the right to use, modify, and incorporate this code into
+ *  products for purposes authorized by the license agreement provided they
+ *  include this notice and the associated copyright notice with any such
+ *  product.
+ *  The information in this file is provided "AS IS" without warranty.
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+**
+**  FILENAME:	ProtocolManager.h
+**
+**  PURPOSE: 	This module manages the boot ROM protocol used for communication
+**				over the UART or USB ports
+**
+**
+******************************************************************************/
+#ifndef _protocol_manager_h
+#define _protocol_manager_h
+
+#include "Typedef.h"
+#include "Flash.h"
+#include "general.h"
+#include "loadoffsets.h"
+#include "usbapi.h"
+
+#define VERSION_OFFSET 0x24
+/********************* Image Types ***********************************/
+#define FIRSTIMAGE				1
+
+/************* Commands definitions **********************************/
+
+//ErrorCodes for Host Application
+#define Ack						0x00
+#define Nack					0x01
+#define SeqError				0x02
+#define JtagAccessGranted       0x11
+#define JtagAccessDenied        0xFF
+#define JtagREIssued			0x05
+#define DebugCmdIssued			0x06
+#define DebugBootIssued			0x07
+#define Untested				0x02
+#define InvalidParameterError   0x08
+
+//Status Flags
+#define MESSAGE_FLAG 			BIT0
+#define FAST_DOWNLOAD 			BIT2
+#define UUID_FLAG				BIT3
+
+//Commands
+#define INVALIDCMD				0x00
+#define GetVersionCmd			0x20
+#define StartAddrCmd			0x21
+#define DownloadDataCmd			0x22
+#define JumpAddrCmd				0x23
+#define OEMPublicKeyCmd			0x24
+#define OEMSignedKeyCmd			0x25
+#define SelectImageCmd			0x26
+#define VerifyImageCmd			0x27
+#define PasswordCmd				0x28
+#define	DataHeaderCmd			0x2a
+#define MessageCmd				0x2b
+#define ViewOTPCmd				0x2c
+#define DebugBootCmd			0x2d
+#define	DoneCmd					0x30
+#define DisconnectCmd			0x31
+#define UploadDataHeaderCmd     0x32
+#define UploadDataCmd           0x33
+#define ProtocolVersionCmd      0x34
+#define GetParametersCmd        0x35
+#define JtagOverMediaCmd		0x36
+#define GetBadBlockCmd			0x37
+#define GetImageCrcCmd			0x38
+
+#define PROTOCOL_WAITTIME		0x80 // in seconds, max time to wait for command
+//Max time to wait between a PREAMBLE and GETVERSION (triggering a download)
+#define PM_DL_STARTTIME_MS		0x10000 // update to 0x10000 instead of 0x80 to support multi FBFs download
+
+// 0x10000ms might be not enough for SWDConsole to download FBF,
+// enlarge it to 0x40000ms
+#define PM_DL_IMAGE_MS			0x40000	//Max time to wait for a single image to be downloaded
+#define PM_DISCONNET_MS			0x20	//Max time to wait for the disconnect command to appear
+
+#define DATA_BLOCK_SIZE			0x3f8 //block size + sizeof(ProtocolCmd) must be word aligned
+#define FD_BLOCK_SIZE           0x4000 //Fast download block size
+#define UPLOAD_BLOCK_SIZE       0x1FFA // Upload block size. 6 bytes short of USB FIFO size for Status portion,
+#define LENGTHOFMESSAGES		0x40
+#define MAXNUMOFMESSAGES		0x40
+#define PREAMBLE_SIZE           0x4
+#define COMMAND_SIZE			0x8
+
+#define COMMAND_DATALENGTH      0x10 // Maximum command data size
+
+//Communication Protocol Version
+#define COMM_PROTOCOL_MAJOR_VERSION 0x1
+#define COMM_PROTOCOL_MINOR_VERSION 0x1
+#define COMM_PROTOCOL_REV_VERSION   0x0
+
+//Communication Protocol Parameters
+#define COMM_PROTOCOL_BUFFER_SIZE 0x2000
+// 3 more reserved parameters
+
+// Upload Cmd Data Source Types
+#define UPLOAD_FLASH 0x0
+#define UPLOAD_DDR   0x1
+
+//#pragma pack (8) 
+
+//Download ISR information
+typedef struct
+{
+	volatile UINT8_T PreambleReceived;
+	volatile UINT8_T CommandReceived;
+	volatile UINT8_T DisconnectReceived;
+	volatile UINT8_T DownloadsEnabled;
+	volatile UINT8_T FastDLInProgress;
+	volatile UINT8_T DLWaiting;
+	volatile UINT32_T DataLeft;
+	volatile UINT32_T CurrentTransferAddress;
+	volatile UINT32_T MaxImageSize;
+	volatile UINT32_T ErrorCode;
+	UINT32_T CurrentImageID;
+	P_USBAPI_T plinkedUSB;
+} ProtocolISR, *pProtocolISR;
+
+typedef struct {
+    volatile UINT8_T Command;
+    volatile UINT8_T Sequence;
+    volatile UINT8_T CID;
+    volatile UINT8_T Flags;
+    volatile UINT32_T  Length;
+    volatile UINT8_T Data[COMMAND_DATALENGTH];
+} ProtocolCmd, *pProtocolCmd;
+
+typedef struct {
+	UINT8_T Command;
+	UINT8_T Sequence;
+	UINT8_T CID;
+	UINT8_T Status;
+	UINT8_T Flags;
+	UINT8_T Length;
+	UINT8_T Data[32];
+} ProtocolRsp, *pProtocolRsp;
+
+#define REPORT_LENGTH		4
+
+#define REPORT_NOTIFICATION 			0
+#define REPORT_ERROR					1
+#define REPORT_BURNT_IMAGE_LENGTH		2
+#define REPORT_UPLOAD_NOTIFICATION		3
+#define REPORT_FLASH_SIZE_NOTIFICATION		4
+#define REPORT_EXTENDED_FUSE_INFO			5
+#define REPORT_EXTENDED2_FUSE_INFO			6
+
+typedef struct {
+	volatile UINT8_T ReportType; // indicate an error (1) or a notification (0) or others
+	volatile UINT8_T Reserved;
+	volatile UINT8_T ReportCode[REPORT_LENGTH];
+} MessageReport, *pMessageReport;
+
+typedef enum
+{
+	NonTrustedBoot1	= 0x00000000,
+	NonTrustedBoot2	= 0x00000001,
+	TrustedBoot		= 0x00000002,
+	TamperBoot		= 0x00000003 // BootROM will not boot device, so, OBM can't detect such mode.
+}BootROM_Operation_Mode;
+
+typedef struct
+{
+	UINT_T	ChipID		: 16;		// 0x1188
+	UINT_T	RevisionID	: 8;		// 0xB0
+	UINT_T	Reserved 	: 8;
+}ChipIDInfo;
+
+// extended message data
+typedef struct {
+	volatile UINT_T OEMKeyHash[8]; 	// fixed length: 256bits
+	volatile UINT_T DeviceUID[2];	// fixed length: 64bits
+	volatile BootROM_Operation_Mode BRMode;
+	volatile UINT_T MMCSerialNumber;	// fixed length: 32bits
+	volatile UINT_T ID; // ChipIDInfo
+} ExMessageData, *pExMessageData;
+
+// extended message data
+typedef struct {
+	// first message
+	volatile UINT_T OEMKeyHash[8]; 	// fixed length: 256bits
+	volatile UINT_T DeviceUID[2];	// fixed length: 64bits
+	volatile BootROM_Operation_Mode BRMode;
+	volatile UINT_T ID; // ChipIDInfo
+	// second message
+	volatile UINT_T CID[4];			// fixed lenght: 128bits
+	volatile UINT_T reserved0;		// make struct align
+	volatile UINT_T reserved1;		// make struct align
+	volatile UINT_T eMMCSize;		// MB
+	volatile UINT_T DDRSize;		// MB
+} Ex2MessageData, *pEx2MessageData;
+
+// extended message report
+typedef struct {
+	volatile UINT8_T ReportType;
+	volatile UINT8_T ReportLength;
+	volatile UINT8_T TotalNumber;
+	volatile UINT8_T Index;
+	volatile ExMessageData ReportData;
+} ExMessageReport, *pExMessageReport;
+
+// extended message report
+typedef struct {
+	volatile UINT8_T ReportType;
+	volatile UINT8_T ReportLength;
+	volatile UINT8_T TotalNumber;
+	volatile UINT8_T Index;
+	volatile Ex2MessageData ReportData;
+} Ex2MessageReport, *pEx2MessageReport;
+
+typedef struct {
+	VUINT_T MessageFlag;
+	volatile UINT8_T Messages[MAXNUMOFMESSAGES][LENGTHOFMESSAGES];
+	volatile UINT8_T Lengths[MAXNUMOFMESSAGES];
+	volatile UINT8_T MessageType[MAXNUMOFMESSAGES];
+	UINT8_T CurrentMessageIndex;
+	volatile UINT8_T NumMessagesQueued;
+} ProtocolMsg, *pProtocolMsg;
+
+/*
+ * Upload Data structures
+ * UploadDataParams; To select data source, address and size
+ * ProtocolParams  ; To select buffer size etc. This is meant
+ *                 ; to be general for the protocol. But currently
+ *                 ; only used for Upload Data.
+ */
+typedef struct {
+	UINT8_T Type;
+	UINT8_T SubType;
+	UINT8_T Partition;
+	UINT8_T Times; // indicate how many times SWD want to do upload
+	UINT_T Offset;
+	UINT_T DataSize;
+	UINT8_T	IncludeOOB : 1;
+	UINT8_T	UploadBypassBBT	  : 1;
+	UINT8_T DisableECC : 1;
+	UINT8_T	Reserved 	      : 5;
+	UINT8_T ResetUE; // indicate whether reset UE or not
+	UINT8_T ResetTimeDelay; // indicate the delay time before resetting UE
+	UINT8_T Reserved2;   //used as emmc high address if its size exceeds 4GB
+} UploadDataParameters, *pUploadDataParameters;
+
+typedef struct
+{
+	UINT_T BufferSize;
+	UINT_T Rsvd1;
+	UINT_T Rsvd2;
+	UINT_T Rsvd3;
+} ProtocolParams, *pProtocolParams;
+
+typedef struct
+{
+	UINT8_T MajorVersion;
+	UINT8_T MinorVersion;
+	UINT16_T RevisionVersion;
+} ProtocolVersion, *pProtocolVersion;
+
+
+typedef struct {
+	UINT8_T FFUART_Init;
+	UINT8_T ALTUART_Init;
+    UINT8_T CI2_USB_Init;
+} PortStates, *pPortStates;
+
+typedef struct
+{
+	UINT32 ImageID;
+	UINT32 BadCnt;
+}ImageBBInfo;
+
+// Badblock data
+typedef struct {
+	UINT32  TotalBadBlocks;
+	UINT32  TotalBlocks;
+	ImageBBInfo BadCount[8]; //reserved for critical partitions support
+} BadBlockData, *pBadBlockData;
+
+#define CRC_MAX_IMAGE_NUM 32
+
+typedef struct
+{
+	UINT32 ImageID;
+	UINT32 CRC32;
+}CRCInfo;
+
+// Image CRC data
+typedef struct
+{
+	UINT32 	MCPID;
+	UINT32	ImageNum;
+	CRCInfo ImageCRC[CRC_MAX_IMAGE_NUM];
+}ImageCRCInfo, *pImageCRCInfo;
+
+//#pragma pack () 
+
+//Prototype Definitions
+pProtocolISR getProtocolISR(void);
+pProtocolCmd getProtocolCmd(void);
+pProtocolCmd setProtocolCmd(void *addr);
+pProtocolRsp getProtocolRsp(void);
+pProtocolMsg getProtocolMsg(void);
+void setProtocolError(UINT8_T Error);
+UINT8_T getProtocolError(void);
+UCHAR * getProtoBuff(void);
+void setProtoBuff(UCHAR* pAddr);
+void resetProtoBuff(void);
+UINT PreambleReceived(void);
+void ClearPreambleReceived(void);
+unsigned int ImageDownloadWaiting(unsigned int media_num);
+
+//Reply routines
+UINT_T SendResponse(UINT8_T *pAckBuff, UINT_T size);
+UINT_T SendAck(void);
+UINT_T SendError(UINT_T ErrorCode);
+
+//Individual Commmand handler
+UINT_T HandleGetVersionCmd(void);
+UINT_T HandleSelectImageCmd(UINT_T imageType);
+UINT_T HandleVerifyImageCmd(void);
+UINT_T HandleDataHeaderCmd(void);
+UINT_T HandleDataCmd(void);
+UINT_T HandleDoneCmd(void);
+UINT_T HandleMessageCmd(void);
+UINT_T HandleDisconnect(void);
+
+//Routines that interact with upper level
+UINT_T InitPort(UINT_T port);
+void ShutdownPorts ();
+UINT_T PM_ReceiveImage(UINT_T dummy, UINT_T address, UINT_T size, UINT_T image_id);
+
+//Interrupt routines that work with USB drivers
+void PM_ISR(P_USBAPI_T this, UINT bytes, UINT * buffer);
+UINT PM_Handler(UINT packetLength);
+
+//routines for uploads
+UINT_T GetUploadCommand(void);
+UINT_T HandleUploadFlow(UINT_T address);
+UINT_T HandleUploadDataHeaderCmd(void);
+UINT_T HandleUploadDataCmd(void);
+UINT_T CopyUploadDataIntoBuffer(UINT_T address, pUploadDataParameters pUploadParams);
+UINT_T VerifyUploadParameters(pUploadDataParameters pUploadParams);
+UINT_T HandleProtocolVersionCmd(void);
+UINT_T HandleGetParametersCmd(void);
+UINT_T HandleGetCrcCmd();
+UINT_T HandleGetBadBlock();
+
+//message routines
+UINT_T AddMessageError(UINT_T ReportType, UINT_T ReportCode);
+UINT_T AddMessageCompound(UINT8_T* message, UINT number);
+
+//others
+UINT_T HandleRequest(UINT_T src_addr, UINT_T dest_addr, UINT_T max_size, UINT_T image_id);
+UINT8_T PM_VerifyPreamble( UINT8_T *candidateString ) ;
+UINT8_T CheckProtocolTimeOut(UINT_T StartTime);
+
+#endif
+