/** @file
*
*  Copyright (c) 2017 Marvell International Ltd.
*
*  This program and the accompanying materials
*  are licensed and made available under the terms and conditions of the BSD License
*  which accompanies this distribution.  The full text of the license may be found at
*  http://opensource.org/licenses/bsd-license.php
*
*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
*
**/

#ifndef __NOR_FLASH_ID_LIB_H__
#define __NOR_FLASH_ID_LIB_H__

#include <Uefi/UefiBaseType.h>

#define NOR_FLASH_MAX_ID_LEN    6

typedef struct {
  /* Device name */
  UINT16 *Name;

  /*
   * JEDEC ID
   */
  UINT8  Id[NOR_FLASH_MAX_ID_LEN];
  UINT8  IdLen;

  UINT16 PageSize;

  /*
   * Below parameters can be referred as BlockSize
   * and BlockCount, when treating the NorFlash as
   * block device.
   */
  UINT32 SectorSize;
  UINT32 SectorCount;

  UINT16 Flags;
#define NOR_FLASH_ERASE_4K     (1 << 0)  /* Use 4 KB erase blocks and CMD_ERASE_4K */
#define NOR_FLASH_ERASE_32K    (1 << 1)  /* Use 32 KB erase blocks and CMD_ERASE_32K */
#define NOR_FLASH_WRITE_FSR    (1 << 2)  /* Use flag status register for write */
#define NOR_FLASH_4B_ADDR      (1 << 3)  /* Use 4B addressing */
} NOR_FLASH_INFO;

/* Vendor IDs */
#define NOR_FLASH_ID_ATMEL      0x1f
#define NOR_FLASH_ID_EON        0x1c
#define NOR_FLASH_ID_GIGADEVICE 0xc8
#define NOR_FLASH_ID_ISSI       0x9d
#define NOR_FLASH_ID_MACRONIX   0xc2
#define NOR_FLASH_ID_SPANSION   0x01
#define NOR_FLASH_ID_STMICRO    0x20
#define NOR_FLASH_ID_SST        0xbf
#define NOR_FLASH_ID_WINDBOND   0xef

/**
  Return an allocated copy pool of the NOR flash information structure.

  @param[in]       Id                 Pointer to an array with JEDEC ID obtained
                                      from the NOR flash with READ_ID command
                                      (0x9f)
  @param[in out]   FlashInfo          Pointer to NOR flash information structure
  @param[in]       AllocateForRuntime A flag specifying a type of a copy pool
                                      allocation (TRUE for runtime, FALSE for
                                      normal)

  @retval       EFI_SUCCESS           Operation completed successfully
  @retval       EFI_NOT_FOUND         No matching entry in NOR ID table found
  @retval       EFI_OUT_OF_RESOURCES  No pool memory available

**/
EFI_STATUS
EFIAPI
NorFlashGetInfo (
  IN UINT8                *Id,
  IN OUT NOR_FLASH_INFO  **FlashInfo,
  IN BOOLEAN               AllocateForRuntime
  );

/**
  Print NOR flash information basing on data stored in
  the NOR_FLASH_INFO structure.

  @param[in]       FlashInfo          Pointer to NOR flash information structure

**/
VOID
EFIAPI
NorFlashPrintInfo (
  IN     NOR_FLASH_INFO  *Info
  );
#endif
