/****************************************************************************
	Copyright (c) 2013-2022, Qualcomm Technologies, Inc.
	All Rights Reserved.
	Confidential and Proprietary - Qualcomm Technologies, Inc.
	**********************************************************************
	2013 Qualcomm Atheros, Inc.
	****************************************************************************/

/*====================================================================*
 *
 *   nvm.h - nvm file format definitions and declarations;
 *
 *   Contributor(s):
 *      Charles Maier <cmaier@qca.qualcomm.com>
 *
 *--------------------------------------------------------------------*/

#ifndef NVM_HEADER
#define NVM_HEADER

/*====================================================================*
 *   system header files;
 *--------------------------------------------------------------------*/

#include <unistd.h>

/*====================================================================*
 *   custom header files;
 *--------------------------------------------------------------------*/

#include "../tools/types.h"

/*====================================================================*
 *   nvm program constants;
 *--------------------------------------------------------------------*/

#define NVM_IMAGETYPES 18 
#define NVM_PLATFORMS 5 

/*====================================================================*
 *   nvm program flags;
 *--------------------------------------------------------------------*/

#define NVM_SILENCE     (1 << 0)
#define NVM_VERBOSE     (1 << 1)
#define NVM_MANIFEST    (1 << 2)
#define NVM_REVISION    (1 << 3)
#define NVM_IDENTITY    (1 << 4)
#define NVM_SDRAM       (1 << 5)
#define NVM_PUBLISH     (1 << 6)

/*====================================================================*
 *   nvm header execute masks;
 *--------------------------------------------------------------------*/

#define NVM_IGNORE_MASK_INT6000         (1 << 0)
#define NVM_IGNORE_MASK_INT6300         (1 << 1)
#define NVM_IGNORE_MASK_INT6400         (1 << 2)
#define NVM_IGNORE_MASK_AR7400          (1 << 4)
#define NVM_IGNORE_MASK_QCA7420         (1 << 8)

/*====================================================================*
 *   image chain types;
 *--------------------------------------------------------------------*/

#define NVM_CHAIN_SOFTLOADER            0
#define NVM_CHAIN_FIRMWARE              1
#define NVM_CHAIN_PIB                   2
#define NVM_CHAIN_CUSTOM_MODULE         3
#define NVM_CHAIN_MODULE_OP_SESSION     4

/*====================================================================*
 *   nvm build types;
 *--------------------------------------------------------------------*/

#define NVM_BUILD_NIGHTLY               0
#define NVM_BUILD_RELEASE               1
#define NVM_BUILD_CUSTOM                2

/*====================================================================*
 *   nvm image types;
 *--------------------------------------------------------------------*/

#define NVM_IMAGE_GENERIC               0x0000
#define NVM_IMAGE_CONFIG_SYNOPSIS       0x0001
#define NVM_IMAGE_CONFIG_DENALI         0x0002
#define NVM_IMAGE_APPLET_DENALI         0x0003
#define NVM_IMAGE_FIRMWARE              0x0004
#define NVM_IMAGE_OASCLIENT             0x0005
#define NVM_IMAGE_CUSTOM                0x0006
#define NVM_IMAGE_MEMCTL                0x0007
#define NVM_IMAGE_ADVPWRMGMT            0x0008
#define NVM_IMAGE_OAS_CLIENT_IP_STK     0x0009
#define NVM_IMAGE_OAS_CLIENT_TR069      0x000A
#define NVM_IMAGE_NVM_SOFTLOADER        0x000B
#define NVM_IMAGE_FLASH_LAYOUT          0x000C
#define NVM_IMAGE_MANIFEST              0x000E
#define NVM_IMAGE_PIB                   0x000F

/*====================================================================*
 *   manifest field types;
 *--------------------------------------------------------------------*/

#define NVM_FIELD_SIGNATURE             0
#define NVM_FIELD_HARDWARE_COMPAT       1
#define NVM_FIELD_CHAIN_MAJOR_VERSION   2
#define NVM_FIELD_CHAIN_MINOR_VERSION   3
#define NVM_FIELD_CHAIN_TYPE            4
#define NVM_FIELD_BUILD_MAJOR_VERSION   5
#define NVM_FIELD_BUILD_MINOR_VERSION   6
#define NVM_FIELD_BUILD_TYPE            7
#define NVM_FIELD_MANIFEST_VERSION      8
#define NVM_FIELD_BUILD_NUMBER          9
#define NVM_FIELD_BUILD_DATE            10
#define NVM_FIELD_BUILD_TIME            11
#define NVM_FIELD_DEVICE_TYPE           12
#define NVM_FIELD_BUILD_HOSTNAME        13
#define NVM_FIELD_BUILD_USERNAME        14
#define NVM_FIELD_BUILD_DESCRIPTION     15
#define NVM_FIELD_BUILD_VERSION_STRING  16
#define NVM_FIELD_BUILD_SUSTAINING_RELEASE 17
#define NVM_FIELD_BUILD_MAJOR_SUBVERSION 18
#define NVM_FIELD_GENERIC_ID0           19
#define NVM_FIELD_GENERIC_ID1           20
#define NVM_FIELD_SL_MAJOR_VERSION      21
#define NVM_FIELD_SL_MINOR_VERSION      22
#define NVM_FIELD_FREE_SPACE            23

/*====================================================================*
 *   toolkit nvm error messages;
 *--------------------------------------------------------------------*/

#define NVM_HDR_VERSION "%s found bad NVM header version in %s module %d", __func__
#define NVM_HDR_CHECKSUM "%s found bad NVM header checksum in %s module %d", __func__
#define NVM_HDR_LINK "%s found bad NVM header link in %s module %d", __func__
#define NVM_IMG_CHECKSUM "%s found bad image checksum in %s module %d", __func__
#define NVM_HDR_CANTREAD "%s can't read image header in %s module %d", __func__
#define NVM_HDR_CANTSAVE "%s can't save image header in %s module %d", __func__
#define NVM_IMG_CANTREAD "%s can't read image in %s module %d", __func__
#define NVM_IMG_CANTSAVE "%s can't save image in %s module %d", __func__
#define NVM_IMG_RUN "%s applet %d is still running"

/*====================================================================*
 *   old nvm image header (44 bytes); 
 *--------------------------------------------------------------------*/

#ifndef __GNUC__
#pragma pack (push,1)
#endif

typedef struct __packed lightning_nvm_header 

{ 
	uint32_t HEADERVERSION; 
	uint32_t IMAGEROMADDR; 
	uint32_t IMAGEADDRESS; 
	uint32_t IMAGELENGTH; 
	uint32_t IMAGECHECKSUM; 
	uint32_t ENTRYPOINT; 
	uint8_t HEADERMINORVERSION; 
	uint8_t IMAGETYPE; 
	uint16_t IGNOREMASK; 
	uint32_t MODULEID; 
	uint32_t MODULESUBID; 
	uint32_t NEXTHEADER; 
	uint32_t HEADERCHECKSUM; 
} 

lightning_header; 

#ifndef __GNUC__
#pragma pack (pop)
#endif

/*====================================================================*
 *   new nvm image header (96 bytes);
 *--------------------------------------------------------------------*/

#ifndef __GNUC__
#pragma pack (push,1)
#endif

typedef struct __packed panther_nvm_header 

{ 
	uint16_t MajorVersion; 
	uint16_t MinorVersion; 
	uint32_t ExecuteMask; 
	uint32_t ImageNvmAddress; 
	uint32_t ImageAddress; 
	uint32_t ImageLength; 
	uint32_t ImageChecksum; 
	uint32_t EntryPoint; 
	uint32_t NextHeader; 
	uint32_t PrevHeader; 
	uint32_t ImageType; 
	uint16_t ModuleID; 
	uint16_t ModuleSubID; 
	uint16_t AppletEntryVersion; 
	uint16_t Reserved0; 
	uint32_t Reserved1; 
	uint32_t Reserved2; 
	uint32_t Reserved3; 
	uint32_t Reserved4; 
	uint32_t Reserved5; 
	uint32_t Reserved6; 
	uint32_t Reserved7; 
	uint32_t Reserved8; 
	uint32_t Reserved9; 
	uint32_t Reserved10; 
	uint32_t Reserved11; 
	uint32_t HeaderChecksum; 
} 

panther_header; 

#ifndef __GNUC__
#pragma pack (pop)
#endif


#ifndef __GNUC__
#pragma pack (push,1)
#endif
typedef struct __packed Revision
{
	char const* hardware;
	uint32_t device_type;
	char software[4];
	uint16_t build;
	uint32_t date;
	char const* type;
} Revision;


#ifndef __GNUC__
#pragma pack (pop)
#endif

/*====================================================================*
 *   nvm functions;
 *--------------------------------------------------------------------*/

void * manifetch (void const * memory, size_t extent, uint32_t type); 
signed nvmfile (struct _file_ const *); 
void nvmpeek (void const *); 
signed fdmanifest (signed fd, char const * filename, struct panther_nvm_header *); 
signed fdrevision (signed fd, char const * filename, struct panther_nvm_header *); 
signed lightning_nvm_file (struct _file_ const *); 
void lightning_nvm_peek (void const *); 
signed lightning_nvm_seek (signed fd, char const * filename, struct lightning_nvm_header *, uint32_t imagetype); 
unsigned lightning_nvm_size (signed fd, char const * filename); 
signed panther_nvm_file (struct _file_ const *); 
void panther_nvm_peek (void const *); 
signed panther_nvm_manifest (void const * memory, size_t extent); 
signed panther_nvm_revision (void const * memory, size_t extent);
signed panther_nvm_revision_forChkpib(void const* memory, size_t extent, struct Revision*);
signed panther_nvm_seek (signed fd, char const * filename, struct panther_nvm_header *, uint32_t imagetype); 
signed panther_nvm_seek2(signed fd, char const* filename, struct panther_nvm_header* header, uint32_t imagetype, bool repairchksum);
unsigned panther_nvm_size (signed fd, char const * filename); 

/*====================================================================*
 *   
 *--------------------------------------------------------------------*/

#endif