/** @file
*
*  Copyright (c) 2017 Marvell International Ltd.
*
*  SPDX-License-Identifier: BSD-2-Clause-Patent
*
**/

#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
