nvm.h 12 KB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409
/***************************************************************************************
//
// 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_

typedef struct _FLASH_SECTOR_INFO
{
	UINT uiSectorSig;
	UINT uiSectorSize;

}FLASH_SECTOR_INFO,*PFLASH_SECTOR_INFO;

typedef struct _FLASH_CS_INFO
{
	B_UINT32 MagicNumber;
// let the magic number be 0xBECE-F1A5 - F1A5 for "flas-h"

	B_UINT32 FlashLayoutVersion ;

    // ISO Image/Format/BuildTool versioning
    B_UINT32 ISOImageVersion;

    // SCSI/Flash BootLoader versioning
    B_UINT32 SCSIFirmwareVersion;


	B_UINT32 OffsetFromZeroForPart1ISOImage;
// typically 0

	B_UINT32 OffsetFromZeroForScsiFirmware;
//typically at 12MB

	B_UINT32 SizeOfScsiFirmware ;
//size of the firmware - depends on binary size

	B_UINT32 OffsetFromZeroForPart2ISOImage;
// typically at first Word Aligned offset 12MB +                 sizeOfScsiFirmware.

	B_UINT32 OffsetFromZeroForCalibrationStart;
// typically at 15MB

	B_UINT32 OffsetFromZeroForCalibrationEnd;

// VSA0 offsets
	B_UINT32 OffsetFromZeroForVSAStart;
	B_UINT32 OffsetFromZeroForVSAEnd;

// Control Section offsets
	B_UINT32 OffsetFromZeroForControlSectionStart;
	B_UINT32 OffsetFromZeroForControlSectionData;

// NO Data Activity timeout to switch from MSC to NW Mode
	B_UINT32 CDLessInactivityTimeout;

// New ISO Image Signature
	B_UINT32 NewImageSignature;

// Signature to validate the sector size.
	B_UINT32 FlashSectorSizeSig;

// Sector Size
	B_UINT32 FlashSectorSize;

// Write Size Support
	B_UINT32 FlashWriteSupportSize;

// Total Flash Size
	B_UINT32 TotalFlashSize;

// Flash Base Address for offset specified
	B_UINT32 FlashBaseAddr;

// Flash Part Max Size
	B_UINT32 FlashPartMaxSize;

// Is CDLess or Flash Bootloader
	B_UINT32 IsCDLessDeviceBootSig;

// MSC Timeout after reset to switch from MSC to NW Mode
	B_UINT32 MassStorageTimeout;


}FLASH_CS_INFO,*PFLASH_CS_INFO;

#define FLASH2X_TOTAL_SIZE (64*1024*1024)
#define DEFAULT_SECTOR_SIZE                     (64*1024)

typedef struct _FLASH_2X_CS_INFO
{

	// magic number as 0xBECE-F1A5 - F1A5 for "flas-h"
	B_UINT32 MagicNumber;

	B_UINT32 FlashLayoutVersion ;

    // ISO Image/Format/BuildTool versioning
    B_UINT32 ISOImageVersion;

    // SCSI/Flash BootLoader versioning
    B_UINT32 SCSIFirmwareVersion;

	// ISO Image1 Part1/SCSI Firmware/Flash Bootloader Start offset, size
	B_UINT32 OffsetFromZeroForPart1ISOImage;
	B_UINT32 OffsetFromZeroForScsiFirmware;
	B_UINT32 SizeOfScsiFirmware ;

	// ISO Image1 Part2 start offset
	B_UINT32 OffsetFromZeroForPart2ISOImage;


	// DSD0 offset
	B_UINT32 OffsetFromZeroForDSDStart;
	B_UINT32 OffsetFromZeroForDSDEnd;

	// VSA0 offset
	B_UINT32 OffsetFromZeroForVSAStart;
	B_UINT32 OffsetFromZeroForVSAEnd;

	// Control Section offset
	B_UINT32 OffsetFromZeroForControlSectionStart;
	B_UINT32 OffsetFromZeroForControlSectionData;

	// NO Data Activity timeout to switch from MSC to NW Mode
	B_UINT32 CDLessInactivityTimeout;

	// New ISO Image Signature
	B_UINT32 NewImageSignature;

	B_UINT32 FlashSectorSizeSig;			// Sector Size Signature
	B_UINT32 FlashSectorSize;			// Sector Size
	B_UINT32 FlashWriteSupportSize; 	// Write Size Support

	B_UINT32 TotalFlashSize;			// Total Flash Size

	// Flash Base Address for offset specified
	B_UINT32 FlashBaseAddr;
	B_UINT32 FlashPartMaxSize;			// Flash Part Max Size

	// Is CDLess or Flash Bootloader
	B_UINT32 IsCDLessDeviceBootSig;

	// MSC Timeout after reset to switch from MSC to NW Mode
	B_UINT32 MassStorageTimeout;

	/* Flash Map 2.0 Field */
	B_UINT32 OffsetISOImage1Part1Start; 	// ISO Image1 Part1 offset
	B_UINT32 OffsetISOImage1Part1End;
	B_UINT32 OffsetISOImage1Part2Start; 	// ISO Image1 Part2 offset
	B_UINT32 OffsetISOImage1Part2End;
	B_UINT32 OffsetISOImage1Part3Start; 	// ISO Image1 Part3 offset
	B_UINT32 OffsetISOImage1Part3End;

	B_UINT32 OffsetISOImage2Part1Start; 	// ISO Image2 Part1 offset
	B_UINT32 OffsetISOImage2Part1End;
	B_UINT32 OffsetISOImage2Part2Start; 	// ISO Image2 Part2 offset
	B_UINT32 OffsetISOImage2Part2End;
	B_UINT32 OffsetISOImage2Part3Start; 	// ISO Image2 Part3 offset
	B_UINT32 OffsetISOImage2Part3End;


	// DSD Header offset from start of DSD
	B_UINT32 OffsetFromDSDStartForDSDHeader;
	B_UINT32 OffsetFromZeroForDSD1Start;	// DSD 1 offset
	B_UINT32 OffsetFromZeroForDSD1End;
	B_UINT32 OffsetFromZeroForDSD2Start;	// DSD 2 offset
	B_UINT32 OffsetFromZeroForDSD2End;

	B_UINT32 OffsetFromZeroForVSA1Start;	// VSA 1 offset
	B_UINT32 OffsetFromZeroForVSA1End;
	B_UINT32 OffsetFromZeroForVSA2Start;	// VSA 2 offset
	B_UINT32 OffsetFromZeroForVSA2End;

	/*
*	 ACCESS_BITS_PER_SECTOR	2
*	ACCESS_RW			0
*	ACCESS_RO				1
*	ACCESS_RESVD			2
*	ACCESS_RESVD			3
*	*/
	B_UINT32 SectorAccessBitMap[FLASH2X_TOTAL_SIZE/(DEFAULT_SECTOR_SIZE *16)];

// All expansions to the control data structure should add here

}FLASH2X_CS_INFO,*PFLASH2X_CS_INFO;

typedef struct _VENDOR_SECTION_INFO
{
	B_UINT32 OffsetFromZeroForSectionStart;
	B_UINT32 OffsetFromZeroForSectionEnd;
	B_UINT32 AccessFlags;
	B_UINT32 Reserved[16];

} VENDOR_SECTION_INFO, *PVENDOR_SECTION_INFO;

typedef struct _FLASH2X_VENDORSPECIFIC_INFO
{
	VENDOR_SECTION_INFO VendorSection[TOTAL_SECTIONS];
	B_UINT32 Reserved[16];

} FLASH2X_VENDORSPECIFIC_INFO, *PFLASH2X_VENDORSPECIFIC_INFO;

typedef struct _DSD_HEADER
{
	B_UINT32 DSDImageSize;
	B_UINT32 DSDImageCRC;
	B_UINT32 DSDImagePriority;
	//We should not consider right now. Reading reserve is worthless.
	B_UINT32 Reserved[252]; // Resvd for DSD Header
	B_UINT32 DSDImageMagicNumber;

}DSD_HEADER, *PDSD_HEADER;

typedef struct _ISO_HEADER
{
	B_UINT32 ISOImageMagicNumber;
	B_UINT32 ISOImageSize;
	B_UINT32 ISOImageCRC;
	B_UINT32 ISOImagePriority;
	//We should not consider right now. Reading reserve is worthless.
	B_UINT32 Reserved[60]; //Resvd for ISO Header extension

}ISO_HEADER, *PISO_HEADER;

#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) ((PUCHAR)&((HeaderPointer)(NULL))->Field - (PUCHAR)(NULL))

#endif