/*====================================================================*
*
* Copyright (c) 2013 Qualcomm Atheros, Inc.
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted (subject to the limitations
* in the disclaimer below) 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 Qualcomm Atheros nor the names of
* its contributors may be used to endorse or promote products
* derived from this software without specific prior written
* permission.
*
* NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
* GRANTED BY THIS LICENSE. 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.
*
*--------------------------------------------------------------------*/
/*====================================================================*
*
* 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_FIRMWARE (1 << 3)
#define NVM_IDENTITY (1 << 4)
#define NVM_SDRAM (1 << 5)
/*====================================================================*
* 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 nvm_header1
{
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;
}
nvm_header1;
#ifndef __GNUC__
#pragma pack (pop)
#endif
/*====================================================================*
* new nvm image header (96 bytes);
*--------------------------------------------------------------------*/
#ifndef __GNUC__
#pragma pack (push,1)
#endif
typedef struct __packed nvm_header2
{
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;
}
nvm_header2;
#ifndef __GNUC__
#pragma pack (pop)
#endif
/*====================================================================*
* nvm functions;
*--------------------------------------------------------------------*/
signed manifest (void const * memory, size_t extent);
void * manifetch (void const * memory, size_t extent, uint32_t type);
signed nvmfile (struct _file_ const *);
signed nvmfile1 (struct _file_ const *);
signed nvmfile2 (struct _file_ const *);
signed fdmanifest (signed fd, char const * filename, struct nvm_header2 *, unsigned module);
signed nvmseek1 (signed fd, char const * filename, struct nvm_header1 *, uint32_t imagetype);
signed nvmseek2 (signed fd, char const * filename, struct nvm_header2 *, uint32_t imagetype);
void nvmpeek (void const *);
void nvmpeek1 (void const *);
void nvmpeek2 (void const *);
/*====================================================================*
*
*--------------------------------------------------------------------*/
#endif