blob: e765cca5d96659f7b977dc233f9d004cd517f6c8 [file] [log] [blame]
/***************************************************************************************
*
* Copyright (c) Beceem Communications Inc.
*
* Module Name:
* NVM.h
*
* Abstract:
* This file has the prototypes,preprocessors and definitions various NVM libraries.
*
*
* Revision History:
* Who When What
* -------- -------- ----------------------------------------------
* Name Date Created/reviewed/modified
*
* Notes:
*
****************************************************************************************/
#ifndef _NVM_H_
#define _NVM_H_
struct bcm_flash_cs_info {
u32 MagicNumber;
/* let the magic number be 0xBECE-F1A5 - F1A5 for "flas-h" */
u32 FlashLayoutVersion;
u32 ISOImageVersion;
u32 SCSIFirmwareVersion;
u32 OffsetFromZeroForPart1ISOImage;
u32 OffsetFromZeroForScsiFirmware;
u32 SizeOfScsiFirmware;
u32 OffsetFromZeroForPart2ISOImage;
u32 OffsetFromZeroForCalibrationStart;
u32 OffsetFromZeroForCalibrationEnd;
u32 OffsetFromZeroForVSAStart;
u32 OffsetFromZeroForVSAEnd;
u32 OffsetFromZeroForControlSectionStart;
u32 OffsetFromZeroForControlSectionData;
u32 CDLessInactivityTimeout;
u32 NewImageSignature;
u32 FlashSectorSizeSig;
u32 FlashSectorSize;
u32 FlashWriteSupportSize;
u32 TotalFlashSize;
u32 FlashBaseAddr;
u32 FlashPartMaxSize;
u32 IsCDLessDeviceBootSig;
/* MSC Timeout after reset to switch from MSC to NW Mode */
u32 MassStorageTimeout;
};
#define FLASH2X_TOTAL_SIZE (64 * 1024 * 1024)
#define DEFAULT_SECTOR_SIZE (64 * 1024)
struct bcm_flash2x_cs_info {
/* magic number as 0xBECE-F1A5 - F1A5 for "flas-h" */
u32 MagicNumber;
u32 FlashLayoutVersion;
u32 ISOImageVersion;
u32 SCSIFirmwareVersion;
u32 OffsetFromZeroForPart1ISOImage;
u32 OffsetFromZeroForScsiFirmware;
u32 SizeOfScsiFirmware;
u32 OffsetFromZeroForPart2ISOImage;
u32 OffsetFromZeroForDSDStart;
u32 OffsetFromZeroForDSDEnd;
u32 OffsetFromZeroForVSAStart;
u32 OffsetFromZeroForVSAEnd;
u32 OffsetFromZeroForControlSectionStart;
u32 OffsetFromZeroForControlSectionData;
/* NO Data Activity timeout to switch from MSC to NW Mode */
u32 CDLessInactivityTimeout;
u32 NewImageSignature;
u32 FlashSectorSizeSig;
u32 FlashSectorSize;
u32 FlashWriteSupportSize;
u32 TotalFlashSize;
u32 FlashBaseAddr;
u32 FlashPartMaxSize;
u32 IsCDLessDeviceBootSig;
/* MSC Timeout after reset to switch from MSC to NW Mode */
u32 MassStorageTimeout;
/* Flash Map 2.0 Field */
u32 OffsetISOImage1Part1Start;
u32 OffsetISOImage1Part1End;
u32 OffsetISOImage1Part2Start;
u32 OffsetISOImage1Part2End;
u32 OffsetISOImage1Part3Start;
u32 OffsetISOImage1Part3End;
u32 OffsetISOImage2Part1Start;
u32 OffsetISOImage2Part1End;
u32 OffsetISOImage2Part2Start;
u32 OffsetISOImage2Part2End;
u32 OffsetISOImage2Part3Start;
u32 OffsetISOImage2Part3End;
/* DSD Header offset from start of DSD */
u32 OffsetFromDSDStartForDSDHeader;
u32 OffsetFromZeroForDSD1Start;
u32 OffsetFromZeroForDSD1End;
u32 OffsetFromZeroForDSD2Start;
u32 OffsetFromZeroForDSD2End;
u32 OffsetFromZeroForVSA1Start;
u32 OffsetFromZeroForVSA1End;
u32 OffsetFromZeroForVSA2Start;
u32 OffsetFromZeroForVSA2End;
/*
* ACCESS_BITS_PER_SECTOR 2
* ACCESS_RW 0
* ACCESS_RO 1
* ACCESS_RESVD 2
* ACCESS_RESVD 3
*/
u32 SectorAccessBitMap[FLASH2X_TOTAL_SIZE / (DEFAULT_SECTOR_SIZE * 16)];
/* All expansions to the control data structure should add here */
};
struct bcm_vendor_section_info {
u32 OffsetFromZeroForSectionStart;
u32 OffsetFromZeroForSectionEnd;
u32 AccessFlags;
u32 Reserved[16];
};
struct bcm_flash2x_vendor_info {
struct bcm_vendor_section_info VendorSection[TOTAL_SECTIONS];
u32 Reserved[16];
};
struct bcm_dsd_header {
u32 DSDImageSize;
u32 DSDImageCRC;
u32 DSDImagePriority;
/* We should not consider right now. Reading reserve is worthless. */
u32 Reserved[252]; /* Resvd for DSD Header */
u32 DSDImageMagicNumber;
};
struct bcm_iso_header {
u32 ISOImageMagicNumber;
u32 ISOImageSize;
u32 ISOImageCRC;
u32 ISOImagePriority;
/* We should not consider right now. Reading reserve is worthless. */
u32 Reserved[60]; /* Resvd for ISO Header extension */
};
#define EEPROM_BEGIN_CIS (0)
#define EEPROM_BEGIN_NON_CIS (0x200)
#define EEPROM_END (0x2000)
#define INIT_PARAMS_SIGNATURE (0x95a7a597)
#define MAX_INIT_PARAMS_LENGTH (2048)
#define MAC_ADDRESS_OFFSET 0x200
#define INIT_PARAMS_1_SIGNATURE_ADDRESS EEPROM_BEGIN_NON_CIS
#define INIT_PARAMS_1_DATA_ADDRESS (INIT_PARAMS_1_SIGNATURE_ADDRESS+16)
#define INIT_PARAMS_1_MACADDRESS_ADDRESS (MAC_ADDRESS_OFFSET)
#define INIT_PARAMS_1_LENGTH_ADDRESS (INIT_PARAMS_1_SIGNATURE_ADDRESS+4)
#define INIT_PARAMS_2_SIGNATURE_ADDRESS (EEPROM_BEGIN_NON_CIS + 2048 + 16)
#define INIT_PARAMS_2_DATA_ADDRESS (INIT_PARAMS_2_SIGNATURE_ADDRESS + 16)
#define INIT_PARAMS_2_MACADDRESS_ADDRESS (INIT_PARAMS_2_SIGNATURE_ADDRESS + 8)
#define INIT_PARAMS_2_LENGTH_ADDRESS (INIT_PARAMS_2_SIGNATURE_ADDRESS + 4)
#define EEPROM_SPI_DEV_CONFIG_REG 0x0F003000
#define EEPROM_SPI_Q_STATUS1_REG 0x0F003004
#define EEPROM_SPI_Q_STATUS1_MASK_REG 0x0F00300C
#define EEPROM_SPI_Q_STATUS_REG 0x0F003008
#define EEPROM_CMDQ_SPI_REG 0x0F003018
#define EEPROM_WRITE_DATAQ_REG 0x0F00301C
#define EEPROM_READ_DATAQ_REG 0x0F003020
#define SPI_FLUSH_REG 0x0F00304C
#define EEPROM_WRITE_ENABLE 0x06000000
#define EEPROM_READ_STATUS_REGISTER 0x05000000
#define EEPROM_16_BYTE_PAGE_WRITE 0xFA000000
#define EEPROM_WRITE_QUEUE_EMPTY 0x00001000
#define EEPROM_WRITE_QUEUE_AVAIL 0x00002000
#define EEPROM_WRITE_QUEUE_FULL 0x00004000
#define EEPROM_16_BYTE_PAGE_READ 0xFB000000
#define EEPROM_4_BYTE_PAGE_READ 0x3B000000
#define EEPROM_CMD_QUEUE_FLUSH 0x00000001
#define EEPROM_WRITE_QUEUE_FLUSH 0x00000002
#define EEPROM_READ_QUEUE_FLUSH 0x00000004
#define EEPROM_ETH_QUEUE_FLUSH 0x00000008
#define EEPROM_ALL_QUEUE_FLUSH 0x0000000f
#define EEPROM_READ_ENABLE 0x06000000
#define EEPROM_16_BYTE_PAGE_WRITE 0xFA000000
#define EEPROM_READ_DATA_FULL 0x00000010
#define EEPROM_READ_DATA_AVAIL 0x00000020
#define EEPROM_READ_QUEUE_EMPTY 0x00000002
#define EEPROM_CMD_QUEUE_EMPTY 0x00000100
#define EEPROM_CMD_QUEUE_AVAIL 0x00000200
#define EEPROM_CMD_QUEUE_FULL 0x00000400
/* Most EEPROM status register bit 0 indicates if the EEPROM is busy
* with a write if set 1. See the details of the EEPROM Status Register
* in the EEPROM data sheet.
*/
#define EEPROM_STATUS_REG_WRITE_BUSY 0x00000001
/* We will have 1 mSec for every RETRIES_PER_DELAY count and have a max attempts of MAX_EEPROM_RETRIES
* This will give us 80 mSec minimum of delay = 80mSecs
*/
#define MAX_EEPROM_RETRIES 80
#define RETRIES_PER_DELAY 64
#define MAX_RW_SIZE 0x10
#define MAX_READ_SIZE 0x10
#define MAX_SECTOR_SIZE (512 * 1024)
#define MIN_SECTOR_SIZE (1024)
#define FLASH_SECTOR_SIZE_OFFSET 0xEFFFC
#define FLASH_SECTOR_SIZE_SIG_OFFSET 0xEFFF8
#define FLASH_SECTOR_SIZE_SIG 0xCAFEBABE
#define FLASH_CS_INFO_START_ADDR 0xFF0000
#define FLASH_CONTROL_STRUCT_SIGNATURE 0xBECEF1A5
#define SCSI_FIRMWARE_MAJOR_VERSION 0x1
#define SCSI_FIRMWARE_MINOR_VERSION 0x5
#define BYTE_WRITE_SUPPORT 0x1
#define FLASH_AUTO_INIT_BASE_ADDR 0xF00000
#define FLASH_CONTIGIOUS_START_ADDR_AFTER_INIT 0x1C000000
#define FLASH_CONTIGIOUS_START_ADDR_BEFORE_INIT 0x1F000000
#define FLASH_CONTIGIOUS_START_ADDR_BCS350 0x08000000
#define FLASH_CONTIGIOUS_END_ADDR_BCS350 0x08FFFFFF
#define FLASH_SIZE_ADDR 0xFFFFEC
#define FLASH_SPI_CMDQ_REG 0xAF003040
#define FLASH_SPI_WRITEQ_REG 0xAF003044
#define FLASH_SPI_READQ_REG 0xAF003048
#define FLASH_CONFIG_REG 0xAF003050
#define FLASH_GPIO_CONFIG_REG 0xAF000030
#define FLASH_CMD_WRITE_ENABLE 0x06
#define FLASH_CMD_READ_ENABLE 0x03
#define FLASH_CMD_RESET_WRITE_ENABLE 0x04
#define FLASH_CMD_STATUS_REG_READ 0x05
#define FLASH_CMD_STATUS_REG_WRITE 0x01
#define FLASH_CMD_READ_ID 0x9F
#define PAD_SELECT_REGISTER 0xAF000410
#define FLASH_PART_SST25VF080B 0xBF258E
#define EEPROM_CAL_DATA_INTERNAL_LOC 0xbFB00008
#define EEPROM_CALPARAM_START 0x200
#define EEPROM_SIZE_OFFSET 524
/* As Read/Write time vaires from 1.5 to 3.0 ms.
* so After Ignoring the rdm/wrm time(that is dependent on many factor like interface etc.),
* here time calculated meets the worst case delay, 3.0 ms
*/
#define MAX_FLASH_RETRIES 4
#define FLASH_PER_RETRIES_DELAY 16
#define EEPROM_MAX_CAL_AREA_SIZE 0xF0000
#define BECM ntohl(0x4245434d)
#define FLASH_2X_MAJOR_NUMBER 0x2
#define DSD_IMAGE_MAGIC_NUMBER 0xBECE0D5D
#define ISO_IMAGE_MAGIC_NUMBER 0xBECE0150
#define NON_CDLESS_DEVICE_BOOT_SIG 0xBECEB007
#define MINOR_VERSION(x) ((x >> 16) & 0xFFFF)
#define MAJOR_VERSION(x) (x & 0xFFFF)
#define CORRUPTED_PATTERN 0x0
#define UNINIT_PTR_IN_CS 0xBBBBDDDD
#define VENDOR_PTR_IN_CS 0xAAAACCCC
#define FLASH2X_SECTION_PRESENT (1 << 0)
#define FLASH2X_SECTION_VALID (1 << 1)
#define FLASH2X_SECTION_RO (1 << 2)
#define FLASH2X_SECTION_ACT (1 << 3)
#define SECTOR_IS_NOT_WRITABLE STATUS_FAILURE
#define INVALID_OFFSET STATUS_FAILURE
#define INVALID_SECTION STATUS_FAILURE
#define SECTOR_1K 1024
#define SECTOR_64K (64 * SECTOR_1K)
#define SECTOR_128K (2 * SECTOR_64K)
#define SECTOR_256k (2 * SECTOR_128K)
#define SECTOR_512K (2 * SECTOR_256k)
#define FLASH_PART_SIZE (16 * 1024 * 1024)
#define RESET_CHIP_SELECT -1
#define CHIP_SELECT_BIT12 12
#define SECTOR_READWRITE_PERMISSION 0
#define SECTOR_READONLY 1
#define SIGNATURE_SIZE 4
#define DEFAULT_BUFF_SIZE 0x10000
#define FIELD_OFFSET_IN_HEADER(HeaderPointer, Field) ((u8 *)&((HeaderPointer)(NULL))->Field - (u8 *)(NULL))
#endif