public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [PATCH v3 1/1] EmbeddedPkg: Implement NorFlashInfoLib
@ 2017-11-03 17:55 Marcin Wojtas
  2017-11-07 15:37 ` Leif Lindholm
  0 siblings, 1 reply; 5+ messages in thread
From: Marcin Wojtas @ 2017-11-03 17:55 UTC (permalink / raw)
  To: edk2-devel
  Cc: feng.tian, michael.d.kinney, liming.gao, leif.lindholm,
	ard.biesheuvel, nadavh, neta, kostap, jinghua, mw, jsd

The SPI NOR flash drivers which base on ArmPlatformPkg's
NorFlashDxe usually make use of static declarations of the
flash instances with their type and parameters. As a result
it implies hardcoding the exact way of flash handling, not to
mention the code does not look very nice. Much better solution
would be obtaining the flash ID and hence its description
in runtime.

JEDEC compliant SPI NOR devices allow to obtain their IDs with
READ_ID command (0x9f), which should return the vendor ID byte,
followed by 2 to 4 following device ID bytes. Use this capability
for implementing a NorFlashInfoLib that gives an access to the
NOR flash description data, such as name, page size, sector
(block) size and others, of more than 50 different models.
The new library user should pass an output array from issuing
READ_ID command to the NorFlashGetInfo () routine - if the
match is found, an allocated (optionally for RT) pool with
the flash description copy will be returned.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Marcin Wojtas <mw@semihalf.com>

==========================
Changelog:
v1 -> v2
  * In flash info flags: s/NF_/NOR_FLASH_/
  * Rename routines to NorFlashGetInfo and NorFlashPrintInfo
  * Fix NorFlashGetInfo description.
  * Improve commit log (fix typos and other minor improvements)

v2 -> v3
  * Add vendor IDs macros
  * s/static/STATIC/
  * Improve commit message
  * Add NOR_FLASH_ERASE_32K flag for possible use of the
    32KB erase blocks and according command

---
 EmbeddedPkg/EmbeddedPkg.dec                             |   1 +
 EmbeddedPkg/Include/Library/NorFlashInfoLib.h           |  96 +++++++++
 EmbeddedPkg/Library/NorFlashInfoLib/NorFlashInfoLib.c   | 225 ++++++++++++++++++++
 EmbeddedPkg/Library/NorFlashInfoLib/NorFlashInfoLib.inf |  34 +++
 4 files changed, 356 insertions(+)

diff --git a/EmbeddedPkg/EmbeddedPkg.dec b/EmbeddedPkg/EmbeddedPkg.dec
index 52482af..aa551ab 100644
--- a/EmbeddedPkg/EmbeddedPkg.dec
+++ b/EmbeddedPkg/EmbeddedPkg.dec
@@ -45,6 +45,7 @@
   EblNetworkLib|Include/Library/EblNetworkLib.h
   GdbSerialLib|Include/Library/GdbSerialLib.h
   DebugAgentTimerLib|Include/Library/DebugAgentTimerLib.h
+  NorFlashInfoLib|Include/Library/NorFlashInfoLib.h
 
   DtPlatformDtbLoaderLib|Include/Library/DtPlatformDtbLoaderLib.h
 
diff --git a/EmbeddedPkg/Include/Library/NorFlashInfoLib.h b/EmbeddedPkg/Include/Library/NorFlashInfoLib.h
new file mode 100644
index 0000000..c376110
--- /dev/null
+++ b/EmbeddedPkg/Include/Library/NorFlashInfoLib.h
@@ -0,0 +1,96 @@
+/** @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
diff --git a/EmbeddedPkg/Library/NorFlashInfoLib/NorFlashInfoLib.c b/EmbeddedPkg/Library/NorFlashInfoLib/NorFlashInfoLib.c
new file mode 100644
index 0000000..750f37a
--- /dev/null
+++ b/EmbeddedPkg/Library/NorFlashInfoLib/NorFlashInfoLib.c
@@ -0,0 +1,225 @@
+/** @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.
+*
+**/
+
+#include <PiDxe.h>
+
+#include <Library/BaseLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
+#include <Library/DxeServicesLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/NorFlashInfoLib.h>
+
+STATIC CONST NOR_FLASH_INFO NorFlashIds[] = {
+  /* ATMEL */
+  {L"at45db011d",     {0x1f, 0x22, 0x00}, 3, 256, 64 * 1024,     4, NOR_FLASH_ERASE_4K},
+  {L"at45db021d",     {0x1f, 0x23, 0x00}, 3, 256, 64 * 1024,     8, NOR_FLASH_ERASE_4K},
+  {L"at45db041d",     {0x1f, 0x24, 0x00}, 3, 256, 64 * 1024,     8, NOR_FLASH_ERASE_4K},
+  {L"at45db081d",     {0x1f, 0x25, 0x00}, 3, 256, 64 * 1024,    16, NOR_FLASH_ERASE_4K},
+  {L"at45db161d",     {0x1f, 0x26, 0x00}, 3, 256, 64 * 1024,    32, NOR_FLASH_ERASE_4K},
+  {L"at45db321d",     {0x1f, 0x27, 0x00}, 3, 256, 64 * 1024,    64, NOR_FLASH_ERASE_4K},
+  {L"at45db641d",     {0x1f, 0x28, 0x00}, 3, 256, 64 * 1024,   128, NOR_FLASH_ERASE_4K},
+  {L"at25df321a",     {0x1f, 0x47, 0x01}, 3, 256, 64 * 1024,    64, NOR_FLASH_ERASE_4K},
+  {L"at25df321",      {0x1f, 0x47, 0x00}, 3, 256, 64 * 1024,    64, NOR_FLASH_ERASE_4K},
+  {L"at26df081a",     {0x1f, 0x45, 0x01}, 3, 256, 64 * 1024,    16, NOR_FLASH_ERASE_4K},
+  /* EON */
+  {L"en25q32b",       {0x1c, 0x30, 0x16}, 3, 256, 64 * 1024,    64, 0},
+  {L"en25q64",        {0x1c, 0x30, 0x17}, 3, 256, 64 * 1024,   128, NOR_FLASH_ERASE_4K},
+  {L"en25q128b",      {0x1c, 0x30, 0x18}, 3, 256, 64 * 1024,   256, 0},
+  {L"en25s64",        {0x1c, 0x38, 0x17}, 3, 256, 64 * 1024,   128, 0},
+  /* GIGADEVICE */
+  {L"gd25q64b",       {0xc8, 0x40, 0x17}, 3, 256, 64 * 1024,   128, NOR_FLASH_ERASE_4K},
+  {L"gd25lq32",       {0xc8, 0x60, 0x16}, 3, 256, 64 * 1024,    64, NOR_FLASH_ERASE_4K},
+  /* ISSI */
+  {L"is25lp032",      {0x9d, 0x60, 0x16}, 3, 256, 64 * 1024,    64, 0},
+  {L"is25lp064",      {0x9d, 0x60, 0x17}, 3, 256, 64 * 1024,   128, 0},
+  {L"is25lp128",      {0x9d, 0x60, 0x18}, 3, 256, 64 * 1024,   256, 0},
+  /* MACRONIX */
+  {L"mx25l2006e",     {0xc2, 0x20, 0x12}, 3, 256, 64 * 1024,     4, 0},
+  {L"mx25l4005",      {0xc2, 0x20, 0x13}, 3, 256, 64 * 1024,     8, 0},
+  {L"mx25l8005",      {0xc2, 0x20, 0x14}, 3, 256, 64 * 1024,    16, 0},
+  {L"mx25l1605d",     {0xc2, 0x20, 0x15}, 3, 256, 64 * 1024,    32, 0},
+  {L"mx25l3205d",     {0xc2, 0x20, 0x16}, 3, 256, 64 * 1024,    64, 0},
+  {L"mx25l6405d",     {0xc2, 0x20, 0x17}, 3, 256, 64 * 1024,   128, 0},
+  {L"mx25l12805",     {0xc2, 0x20, 0x18}, 3, 256, 64 * 1024,   256, 0},
+  {L"mx25l25635f",    {0xc2, 0x20, 0x19}, 3, 256, 64 * 1024,   512, 0},
+  {L"mx25l51235f",    {0xc2, 0x20, 0x1a}, 3, 256, 64 * 1024,  1024, 0},
+  {L"mx25l12855e",    {0xc2, 0x26, 0x18}, 3, 256, 64 * 1024,   256, 0},
+  {L"mx66u51235f",    {0xc2, 0x25, 0x3a}, 3, 256, 64 * 1024,  1024, 0},
+  {L"mx66l1g45g",     {0xc2, 0x20, 0x1b}, 3, 256, 64 * 1024,  2048, 0},
+  /* SPANSION */
+  {L"s25fl008a",      {0x01, 0x02, 0x13}, 3, 256, 64 * 1024,    16, 0},
+  {L"s25fl016a",      {0x01, 0x02, 0x14}, 3, 256, 64 * 1024,    32, 0},
+  {L"s25fl032a",      {0x01, 0x02, 0x15}, 3, 256, 64 * 1024,    64, 0},
+  {L"s25fl064a",      {0x01, 0x02, 0x16}, 3, 256, 64 * 1024,   128, 0},
+  {L"s25fl116k",      {0x01, 0x40, 0x15}, 3, 256, 64 * 1024,   128, 0},
+  {L"s25fl164k",      {0x01, 0x40, 0x17, 0x01, 0x40}, 5, 256,  64 * 1024,   128, 0},
+  {L"s25fl128p_256k", {0x01, 0x20, 0x18, 0x03, 0x00}, 5, 256, 256 * 1024,    64, 0},
+  {L"s25fl128p_64k",  {0x01, 0x20, 0x18, 0x03, 0x01}, 5, 256,  64 * 1024,   256, 0},
+  {L"s25fl032p",      {0x01, 0x02, 0x15, 0x4d, 0x00}, 5, 256,  64 * 1024,    64, 0},
+  {L"s25fl064p",      {0x01, 0x02, 0x16, 0x4d, 0x00}, 5, 256,  64 * 1024,   128, 0},
+  {L"s25fl128s_256k", {0x01, 0x20, 0x18, 0x4d, 0x00}, 5, 256, 256 * 1024,    64, 0},
+  {L"s25fl128s_64k",  {0x01, 0x20, 0x18, 0x4d, 0x01}, 5, 256,  64 * 1024,   256, 0},
+  {L"s25fl256s_256k", {0x01, 0x02, 0x19, 0x4d, 0x00}, 5, 256, 256 * 1024,   128, 0},
+  {L"s25fl256s_64k",  {0x01, 0x02, 0x19, 0x4d, 0x01}, 5, 256,  64 * 1024,   512, 0},
+  {L"s25fl512s_256k", {0x01, 0x02, 0x20, 0x4d, 0x00}, 5, 256, 256 * 1024,   256, 0},
+  {L"s25fl512s_64k",  {0x01, 0x02, 0x20, 0x4d, 0x01}, 5, 256,  64 * 1024,  1024, 0},
+  {L"s25fl512s_512k", {0x01, 0x02, 0x20, 0x4f, 0x00}, 5, 256, 256 * 1024,   256, 0},
+  /* STMICRO */
+  {L"m25p10",         {0x20, 0x20, 0x11}, 3, 256, 32 * 1024,     4, 0},
+  {L"m25p20",         {0x20, 0x20, 0x12}, 3, 256, 64 * 1024,     4, 0},
+  {L"m25p40",         {0x20, 0x20, 0x13}, 3, 256, 64 * 1024,     8, 0},
+  {L"m25p80",         {0x20, 0x20, 0x14}, 3, 256, 64 * 1024,    16, 0},
+  {L"m25p16",         {0x20, 0x20, 0x15}, 3, 256, 64 * 1024,    32, 0},
+  {L"m25pE16",        {0x20, 0x80, 0x15, 0x10, 0x00}, 5, 256, 64 * 1024, 32, 0},
+  {L"m25pX16",        {0x20, 0x71, 0x15, 0x10, 0x00}, 5, 256, 64 * 1024, 32, 0},
+  {L"m25p32",         {0x20, 0x20, 0x16}, 3, 256,  64 * 1024,    64, 0},
+  {L"m25p64",         {0x20, 0x20, 0x17}, 3, 256,  64 * 1024,   128, 0},
+  {L"m25p128",        {0x20, 0x20, 0x18}, 3, 256, 256 * 1024,    64, 0},
+  {L"m25pX64",        {0x20, 0x71, 0x17}, 3, 256,  64 * 1024,   128, NOR_FLASH_ERASE_4K},
+  {L"n25q016a",       {0x20, 0xbb, 0x15}, 3, 256,  64 * 1024,    32, NOR_FLASH_ERASE_4K},
+  {L"n25q32",         {0x20, 0xba, 0x16}, 3, 256,  64 * 1024,    64, NOR_FLASH_ERASE_4K},
+  {L"n25q32a",        {0x20, 0xbb, 0x16}, 3, 256,  64 * 1024,    64, NOR_FLASH_ERASE_4K},
+  {L"n25q64",         {0x20, 0xba, 0x17}, 3, 256,  64 * 1024,   128, NOR_FLASH_ERASE_4K},
+  {L"n25q64a",        {0x20, 0xbb, 0x17}, 3, 256,  64 * 1024,   128, NOR_FLASH_ERASE_4K},
+  {L"n25q128",        {0x20, 0xba, 0x18}, 3, 256,  64 * 1024,   256, 0},
+  {L"n25q128a",       {0x20, 0xbb, 0x18}, 3, 256,  64 * 1024,   256, 0},
+  {L"n25q256",        {0x20, 0xba, 0x19}, 3, 256,  64 * 1024,   512, NOR_FLASH_ERASE_4K},
+  {L"n25q256a",       {0x20, 0xbb, 0x19}, 3, 256,  64 * 1024,   512, NOR_FLASH_ERASE_4K},
+  {L"n25q512",        {0x20, 0xba, 0x20}, 3, 256,  64 * 1024,  1024, NOR_FLASH_WRITE_FSR | NOR_FLASH_ERASE_4K},
+  {L"n25q512a",       {0x20, 0xbb, 0x20}, 3, 256,  64 * 1024,  1024, NOR_FLASH_WRITE_FSR | NOR_FLASH_ERASE_4K},
+  {L"n25q1024",       {0x20, 0xba, 0x21}, 3, 256,  64 * 1024,  2048, NOR_FLASH_WRITE_FSR | NOR_FLASH_ERASE_4K},
+  {L"n25q1024a",      {0x20, 0xbb, 0x21}, 3, 256,  64 * 1024,  2048, NOR_FLASH_WRITE_FSR | NOR_FLASH_ERASE_4K},
+  {L"mt25qu02g",      {0x20, 0xbb, 0x22}, 3, 256,  64 * 1024,  4096, NOR_FLASH_WRITE_FSR | NOR_FLASH_ERASE_4K},
+  {L"mt25ql02g",      {0x20, 0xba, 0x22}, 3, 256,  64 * 1024,  4096, NOR_FLASH_WRITE_FSR | NOR_FLASH_ERASE_4K},
+  /* SST */
+  {L"sst25vf040b",    {0xbf, 0x25, 0x8d}, 3, 256,  64 * 1024,     8, NOR_FLASH_ERASE_4K},
+  {L"sst25vf080b",    {0xbf, 0x25, 0x8e}, 3, 256,  64 * 1024,    16, NOR_FLASH_ERASE_4K},
+  {L"sst25vf016b",    {0xbf, 0x25, 0x41}, 3, 256,  64 * 1024,    32, NOR_FLASH_ERASE_4K},
+  {L"sst25vf032b",    {0xbf, 0x25, 0x4a}, 3, 256,  64 * 1024,    64, NOR_FLASH_ERASE_4K},
+  {L"sst25vf064c",    {0xbf, 0x25, 0x4b}, 3, 256,  64 * 1024,   128, NOR_FLASH_ERASE_4K},
+  {L"sst25wf512",     {0xbf, 0x25, 0x01}, 3, 256,  64 * 1024,     1, NOR_FLASH_ERASE_4K},
+  {L"sst25wf010",     {0xbf, 0x25, 0x02}, 3, 256,  64 * 1024,     2, NOR_FLASH_ERASE_4K},
+  {L"sst25wf020",     {0xbf, 0x25, 0x03}, 3, 256,  64 * 1024,     4, NOR_FLASH_ERASE_4K},
+  {L"sst25wf040",     {0xbf, 0x25, 0x04}, 3, 256,  64 * 1024,     8, NOR_FLASH_ERASE_4K},
+  {L"sst25wf040b",    {0x62, 0x16, 0x13}, 3, 256,  64 * 1024,     8, NOR_FLASH_ERASE_4K},
+  {L"sst25wf080",     {0xbf, 0x25, 0x05}, 3, 256,  64 * 1024,    16, NOR_FLASH_ERASE_4K},
+  /* WINBOND */
+  {L"w25p80",         {0xef, 0x20, 0x14}, 3, 256,  64 * 1024,    16, 0},
+  {L"w25p16",         {0xef, 0x20, 0x15}, 3, 256,  64 * 1024,    32, 0},
+  {L"w25p32",         {0xef, 0x20, 0x16}, 3, 256,  64 * 1024,    64, 0},
+  {L"w25x40",         {0xef, 0x30, 0x13}, 3, 256,  64 * 1024,     8, NOR_FLASH_ERASE_4K},
+  {L"w25x16",         {0xef, 0x30, 0x15}, 3, 256,  64 * 1024,    32, NOR_FLASH_ERASE_4K},
+  {L"w25x32",         {0xef, 0x30, 0x16}, 3, 256,  64 * 1024,    64, NOR_FLASH_ERASE_4K},
+  {L"w25x64",         {0xef, 0x30, 0x17}, 3, 256,  64 * 1024,   128, NOR_FLASH_ERASE_4K},
+  {L"w25q80bl",       {0xef, 0x40, 0x14}, 3, 256,  64 * 1024,    16, NOR_FLASH_ERASE_4K},
+  {L"w25q16cl",       {0xef, 0x40, 0x15}, 3, 256,  64 * 1024,    32, NOR_FLASH_ERASE_4K},
+  {L"w25q32bv",       {0xef, 0x40, 0x16}, 3, 256,  64 * 1024,    64, NOR_FLASH_ERASE_4K},
+  {L"w25q64cv",       {0xef, 0x40, 0x17}, 3, 256,  64 * 1024,   128, NOR_FLASH_ERASE_4K},
+  {L"w25q128bv",      {0xef, 0x40, 0x18}, 3, 256,  64 * 1024,   256, NOR_FLASH_ERASE_4K},
+  {L"w25q256",        {0xef, 0x40, 0x19}, 3, 256,  64 * 1024,   512, NOR_FLASH_ERASE_4K},
+  {L"w25q80bw",       {0xef, 0x50, 0x14}, 3, 256,  64 * 1024,    16, NOR_FLASH_ERASE_4K},
+  {L"w25q16dw",       {0xef, 0x60, 0x15}, 3, 256,  64 * 1024,    32, NOR_FLASH_ERASE_4K},
+  {L"w25q32dw",       {0xef, 0x60, 0x16}, 3, 256,  64 * 1024,    64, NOR_FLASH_ERASE_4K},
+  {L"w25q64dw",       {0xef, 0x60, 0x17}, 3, 256,  64 * 1024,   128, NOR_FLASH_ERASE_4K},
+  {L"w25q128fw",      {0xef, 0x60, 0x18}, 3, 256,  64 * 1024,   256, NOR_FLASH_ERASE_4K},
+  {},  /* Empty entry to terminate the list */
+};
+
+/**
+  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
+  )
+{
+  CONST NOR_FLASH_INFO *TmpInfo;
+
+  /*
+   * Iterate over NorFlashIds table, in order to find matching entry.
+   */
+  TmpInfo = NorFlashIds;
+  for (; TmpInfo->Name != NULL; TmpInfo++) {
+    if (CompareMem (TmpInfo->Id, Id, TmpInfo->IdLen) == 0) {
+      break;
+    }
+  }
+
+  /*
+   * Matching entry was not found.
+   */
+  if (TmpInfo->Name == NULL) {
+    return EFI_NOT_FOUND;
+  }
+
+  /*
+   * Allocate and copy NOR flash information structure.
+   */
+  if (AllocateForRuntime) {
+    *FlashInfo = AllocateRuntimeCopyPool (sizeof (NOR_FLASH_INFO), TmpInfo);
+  } else {
+    *FlashInfo = AllocateCopyPool (sizeof (NOR_FLASH_INFO), TmpInfo);
+  }
+  if (FlashInfo == NULL) {
+    return EFI_OUT_OF_RESOURCES;
+  }
+
+  return EFI_SUCCESS;
+}
+
+/**
+  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
+  )
+{
+  UINTN EraseSize;
+
+  if (Info->Flags & NOR_FLASH_ERASE_4K) {
+    EraseSize = SIZE_4KB;
+  } else {
+    EraseSize = Info->SectorSize;
+  }
+
+  DEBUG ((DEBUG_ERROR,
+    "Detected %s SPI NOR flash with page size %d B, erase size %d KB, total %d MB\n",
+    Info->Name,
+    Info->PageSize,
+    EraseSize / 1024,
+    (Info->SectorSize * Info->SectorCount) / 1024 / 1024));
+}
diff --git a/EmbeddedPkg/Library/NorFlashInfoLib/NorFlashInfoLib.inf b/EmbeddedPkg/Library/NorFlashInfoLib/NorFlashInfoLib.inf
new file mode 100644
index 0000000..b4b3324
--- /dev/null
+++ b/EmbeddedPkg/Library/NorFlashInfoLib/NorFlashInfoLib.inf
@@ -0,0 +1,34 @@
+/** @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.
+*
+**/
+
+[Defines]
+  INF_VERSION                    = 0x00010019
+  BASE_NAME                      = NorFlashInfoLib
+  FILE_GUID                      = 6b639c7e-9b53-4e9f-89a3-2e711729709c
+  MODULE_TYPE                    = DXE_DRIVER
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = NorFlashInfoLib|DXE_DRIVER DXE_RUNTIME_DRIVER UEFI_APPLICATION
+
+[Sources]
+  NorFlashInfoLib.c
+
+[Packages]
+  EmbeddedPkg/EmbeddedPkg.dec
+  MdePkg/MdePkg.dec
+
+[LibraryClasses]
+  BaseLib
+  DebugLib
+  DxeServicesLib
+  MemoryAllocationLib
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH v3 1/1] EmbeddedPkg: Implement NorFlashInfoLib
  2017-11-03 17:55 [PATCH v3 1/1] EmbeddedPkg: Implement NorFlashInfoLib Marcin Wojtas
@ 2017-11-07 15:37 ` Leif Lindholm
  2017-11-07 15:45   ` Marcin Wojtas
  0 siblings, 1 reply; 5+ messages in thread
From: Leif Lindholm @ 2017-11-07 15:37 UTC (permalink / raw)
  To: Marcin Wojtas
  Cc: edk2-devel, feng.tian, michael.d.kinney, liming.gao,
	ard.biesheuvel, nadavh, neta, kostap, jinghua, jsd

On Fri, Nov 03, 2017 at 06:55:17PM +0100, Marcin Wojtas wrote:
> The SPI NOR flash drivers which base on ArmPlatformPkg's
> NorFlashDxe usually make use of static declarations of the
> flash instances with their type and parameters. As a result
> it implies hardcoding the exact way of flash handling, not to
> mention the code does not look very nice. Much better solution
> would be obtaining the flash ID and hence its description
> in runtime.
> 
> JEDEC compliant SPI NOR devices allow to obtain their IDs with
> READ_ID command (0x9f), which should return the vendor ID byte,
> followed by 2 to 4 following device ID bytes. Use this capability
> for implementing a NorFlashInfoLib that gives an access to the
> NOR flash description data, such as name, page size, sector
> (block) size and others, of more than 50 different models.
> The new library user should pass an output array from issuing
> READ_ID command to the NorFlashGetInfo () routine - if the
> match is found, an allocated (optionally for RT) pool with
> the flash description copy will be returned.
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Marcin Wojtas <mw@semihalf.com>
> 
> ==========================

Please, the separator is ---
The below does not belong in the commit message (but should be
included below --- for clarity).


I would however also like to fold in the following hunk, to enable
standalone building:

diff --git a/EmbeddedPkg/EmbeddedPkg.dsc b/EmbeddedPkg/EmbeddedPkg.dsc
index d7ee6a3018..bc19000e4b 100644
--- a/EmbeddedPkg/EmbeddedPkg.dsc
+++ b/EmbeddedPkg/EmbeddedPkg.dsc
@@ -282,6 +282,8 @@ [Components.common]

   EmbeddedPkg/Drivers/DtPlatformDxe/DtPlatformDxe.inf

+  EmbeddedPkg/Library/NorFlashInfoLib/NorFlashInfoLib.inf
+
 [Components.ARM]
    EmbeddedPkg/Drivers/Isp1761UsbDxe/Isp1761UsbDxe.inf

If you are OK with these changes:
Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
(do let me know)

/
    Leif


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH v3 1/1] EmbeddedPkg: Implement NorFlashInfoLib
  2017-11-07 15:37 ` Leif Lindholm
@ 2017-11-07 15:45   ` Marcin Wojtas
  2017-11-07 15:50     ` Leif Lindholm
  0 siblings, 1 reply; 5+ messages in thread
From: Marcin Wojtas @ 2017-11-07 15:45 UTC (permalink / raw)
  To: Leif Lindholm
  Cc: edk2-devel-01, Tian, Feng, Kinney, Michael D, Gao, Liming,
	Ard Biesheuvel, nadavh, Neta Zur Hershkovits, Kostya Porotchkin,
	Hua Jing, semihalf-dabros-jan

Hi Leif,

2017-11-07 16:37 GMT+01:00 Leif Lindholm <leif.lindholm@linaro.org>:
> On Fri, Nov 03, 2017 at 06:55:17PM +0100, Marcin Wojtas wrote:
>> The SPI NOR flash drivers which base on ArmPlatformPkg's
>> NorFlashDxe usually make use of static declarations of the
>> flash instances with their type and parameters. As a result
>> it implies hardcoding the exact way of flash handling, not to
>> mention the code does not look very nice. Much better solution
>> would be obtaining the flash ID and hence its description
>> in runtime.
>>
>> JEDEC compliant SPI NOR devices allow to obtain their IDs with
>> READ_ID command (0x9f), which should return the vendor ID byte,
>> followed by 2 to 4 following device ID bytes. Use this capability
>> for implementing a NorFlashInfoLib that gives an access to the
>> NOR flash description data, such as name, page size, sector
>> (block) size and others, of more than 50 different models.
>> The new library user should pass an output array from issuing
>> READ_ID command to the NorFlashGetInfo () routine - if the
>> match is found, an allocated (optionally for RT) pool with
>> the flash description copy will be returned.
>>
>> Contributed-under: TianoCore Contribution Agreement 1.1
>> Signed-off-by: Marcin Wojtas <mw@semihalf.com>
>>
>> ==========================
>
> Please, the separator is ---
> The below does not belong in the commit message (but should be
> included below --- for clarity).
>
>
> I would however also like to fold in the following hunk, to enable
> standalone building:
>
> diff --git a/EmbeddedPkg/EmbeddedPkg.dsc b/EmbeddedPkg/EmbeddedPkg.dsc
> index d7ee6a3018..bc19000e4b 100644
> --- a/EmbeddedPkg/EmbeddedPkg.dsc
> +++ b/EmbeddedPkg/EmbeddedPkg.dsc
> @@ -282,6 +282,8 @@ [Components.common]
>
>    EmbeddedPkg/Drivers/DtPlatformDxe/DtPlatformDxe.inf
>
> +  EmbeddedPkg/Library/NorFlashInfoLib/NorFlashInfoLib.inf
> +
>  [Components.ARM]
>     EmbeddedPkg/Drivers/Isp1761UsbDxe/Isp1761UsbDxe.inf
>
> If you are OK with these changes:
> Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
> (do let me know)
>

Thanks, I'm of course ok with the changes. Should I resubmit?

Best regards,
Marcin


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v3 1/1] EmbeddedPkg: Implement NorFlashInfoLib
  2017-11-07 15:45   ` Marcin Wojtas
@ 2017-11-07 15:50     ` Leif Lindholm
  2017-11-07 15:55       ` Marcin Wojtas
  0 siblings, 1 reply; 5+ messages in thread
From: Leif Lindholm @ 2017-11-07 15:50 UTC (permalink / raw)
  To: Marcin Wojtas
  Cc: edk2-devel-01, Tian, Feng, Kinney, Michael D, Gao, Liming,
	Ard Biesheuvel, nadavh, Neta Zur Hershkovits, Kostya Porotchkin,
	Hua Jing, semihalf-dabros-jan

On Tue, Nov 07, 2017 at 04:45:19PM +0100, Marcin Wojtas wrote:
> Hi Leif,
> 
> 2017-11-07 16:37 GMT+01:00 Leif Lindholm <leif.lindholm@linaro.org>:
> > On Fri, Nov 03, 2017 at 06:55:17PM +0100, Marcin Wojtas wrote:
> >> The SPI NOR flash drivers which base on ArmPlatformPkg's
> >> NorFlashDxe usually make use of static declarations of the
> >> flash instances with their type and parameters. As a result
> >> it implies hardcoding the exact way of flash handling, not to
> >> mention the code does not look very nice. Much better solution
> >> would be obtaining the flash ID and hence its description
> >> in runtime.
> >>
> >> JEDEC compliant SPI NOR devices allow to obtain their IDs with
> >> READ_ID command (0x9f), which should return the vendor ID byte,
> >> followed by 2 to 4 following device ID bytes. Use this capability
> >> for implementing a NorFlashInfoLib that gives an access to the
> >> NOR flash description data, such as name, page size, sector
> >> (block) size and others, of more than 50 different models.
> >> The new library user should pass an output array from issuing
> >> READ_ID command to the NorFlashGetInfo () routine - if the
> >> match is found, an allocated (optionally for RT) pool with
> >> the flash description copy will be returned.
> >>
> >> Contributed-under: TianoCore Contribution Agreement 1.1
> >> Signed-off-by: Marcin Wojtas <mw@semihalf.com>
> >>
> >> ==========================
> >
> > Please, the separator is ---
> > The below does not belong in the commit message (but should be
> > included below --- for clarity).
> >
> >
> > I would however also like to fold in the following hunk, to enable
> > standalone building:
> >
> > diff --git a/EmbeddedPkg/EmbeddedPkg.dsc b/EmbeddedPkg/EmbeddedPkg.dsc
> > index d7ee6a3018..bc19000e4b 100644
> > --- a/EmbeddedPkg/EmbeddedPkg.dsc
> > +++ b/EmbeddedPkg/EmbeddedPkg.dsc
> > @@ -282,6 +282,8 @@ [Components.common]
> >
> >    EmbeddedPkg/Drivers/DtPlatformDxe/DtPlatformDxe.inf
> >
> > +  EmbeddedPkg/Library/NorFlashInfoLib/NorFlashInfoLib.inf
> > +
> >  [Components.ARM]
> >     EmbeddedPkg/Drivers/Isp1761UsbDxe/Isp1761UsbDxe.inf
> >
> > If you are OK with these changes:
> > Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
> > (do let me know)
> 
> Thanks, I'm of course ok with the changes. Should I resubmit?

Nah, that's fine.

Pushed as 7046610163. (no that's not my phone number accidentally
pasted, it's a short hash containing no a-f)

/
    Leif


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v3 1/1] EmbeddedPkg: Implement NorFlashInfoLib
  2017-11-07 15:50     ` Leif Lindholm
@ 2017-11-07 15:55       ` Marcin Wojtas
  0 siblings, 0 replies; 5+ messages in thread
From: Marcin Wojtas @ 2017-11-07 15:55 UTC (permalink / raw)
  To: Leif Lindholm
  Cc: edk2-devel-01, Tian, Feng, Kinney, Michael D, Gao, Liming,
	Ard Biesheuvel, nadavh, Neta Zur Hershkovits, Kostya Porotchkin,
	Hua Jing, semihalf-dabros-jan

2017-11-07 16:50 GMT+01:00 Leif Lindholm <leif.lindholm@linaro.org>:
> On Tue, Nov 07, 2017 at 04:45:19PM +0100, Marcin Wojtas wrote:
>> Hi Leif,
>>
>> 2017-11-07 16:37 GMT+01:00 Leif Lindholm <leif.lindholm@linaro.org>:
>> > On Fri, Nov 03, 2017 at 06:55:17PM +0100, Marcin Wojtas wrote:
>> >> The SPI NOR flash drivers which base on ArmPlatformPkg's
>> >> NorFlashDxe usually make use of static declarations of the
>> >> flash instances with their type and parameters. As a result
>> >> it implies hardcoding the exact way of flash handling, not to
>> >> mention the code does not look very nice. Much better solution
>> >> would be obtaining the flash ID and hence its description
>> >> in runtime.
>> >>
>> >> JEDEC compliant SPI NOR devices allow to obtain their IDs with
>> >> READ_ID command (0x9f), which should return the vendor ID byte,
>> >> followed by 2 to 4 following device ID bytes. Use this capability
>> >> for implementing a NorFlashInfoLib that gives an access to the
>> >> NOR flash description data, such as name, page size, sector
>> >> (block) size and others, of more than 50 different models.
>> >> The new library user should pass an output array from issuing
>> >> READ_ID command to the NorFlashGetInfo () routine - if the
>> >> match is found, an allocated (optionally for RT) pool with
>> >> the flash description copy will be returned.
>> >>
>> >> Contributed-under: TianoCore Contribution Agreement 1.1
>> >> Signed-off-by: Marcin Wojtas <mw@semihalf.com>
>> >>
>> >> ==========================
>> >
>> > Please, the separator is ---
>> > The below does not belong in the commit message (but should be
>> > included below --- for clarity).
>> >
>> >
>> > I would however also like to fold in the following hunk, to enable
>> > standalone building:
>> >
>> > diff --git a/EmbeddedPkg/EmbeddedPkg.dsc b/EmbeddedPkg/EmbeddedPkg.dsc
>> > index d7ee6a3018..bc19000e4b 100644
>> > --- a/EmbeddedPkg/EmbeddedPkg.dsc
>> > +++ b/EmbeddedPkg/EmbeddedPkg.dsc
>> > @@ -282,6 +282,8 @@ [Components.common]
>> >
>> >    EmbeddedPkg/Drivers/DtPlatformDxe/DtPlatformDxe.inf
>> >
>> > +  EmbeddedPkg/Library/NorFlashInfoLib/NorFlashInfoLib.inf
>> > +
>> >  [Components.ARM]
>> >     EmbeddedPkg/Drivers/Isp1761UsbDxe/Isp1761UsbDxe.inf
>> >
>> > If you are OK with these changes:
>> > Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
>> > (do let me know)
>>
>> Thanks, I'm of course ok with the changes. Should I resubmit?
>
> Nah, that's fine.
>
> Pushed as 7046610163. (no that's not my phone number accidentally
> pasted, it's a short hash containing no a-f)
>

Thanks!


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2017-11-07 15:51 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-11-03 17:55 [PATCH v3 1/1] EmbeddedPkg: Implement NorFlashInfoLib Marcin Wojtas
2017-11-07 15:37 ` Leif Lindholm
2017-11-07 15:45   ` Marcin Wojtas
2017-11-07 15:50     ` Leif Lindholm
2017-11-07 15:55       ` Marcin Wojtas

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox