From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: None (no SPF record) identity=mailfrom; client-ip=2a00:1450:4010:c07::242; helo=mail-lf0-x242.google.com; envelope-from=mw@semihalf.com; receiver=edk2-devel@lists.01.org Received: from mail-lf0-x242.google.com (mail-lf0-x242.google.com [IPv6:2a00:1450:4010:c07::242]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 0DC842034A7D9 for ; Mon, 30 Oct 2017 13:26:51 -0700 (PDT) Received: by mail-lf0-x242.google.com with SMTP id r129so16465113lff.8 for ; Mon, 30 Oct 2017 13:30:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=semihalf-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id; bh=xp5RXSf/eDqKi72RVbkM5r7mL/q/o7+nneCsEkWyyQY=; b=WEjrFEuoEg0rnBhC+Ne8xD/spdDhe6yYythTqocBYaTFCBnuK+Zm6wBvf1JYOxKgxF LfZocurWfY6plEFl6+lHqiirrvG2RePNDtC+RScTpq/dkjuTTEQvV6k1BRrsFSz03eg+ r6fiEYqPP1tvxi5NRxRaYi4xvp0VK+b+J90QcL/EoQB8tkibgsoh1cGVcAUA0+ks7+0f z0a6AsdOJd90OrpcErx+jvvudUHlCY8IT8FvYBoALgKqw1eY+s+GO8Zvbnh6wDAQoPQ1 v6QFRDMxdfgD3eBpBgMZGEv83W8mpqqWfFXCCig+1nOq0WwX70+ZZU3+qgjPthKR6j7F vrTA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=xp5RXSf/eDqKi72RVbkM5r7mL/q/o7+nneCsEkWyyQY=; b=HnaFeiE/ndc5YRsleWQvBW5zwuLpN1XXI4pWhjAWPGqfz6M+cP2A0u9qmlS5H2iv9x 2jyl9LAMUH6+6aoLzsXOofhFrGqYTVttmGZkOwW5/VyiABc05PPZSVJqVe9aIZpcNkXY JlAuJnwzsTd0jgMnIgJq61332ShBOOaEIIXGyivxaLg0pUEB39u+m1MJIU7zZym42AXI l/bJcpLLvhvitm2V9bt86zPg0ColkmPo3YwKIT3FZPpYojGGtEIdYqCLfcNzMcW1jAgk kwLTT9heBLrX4pl8ACqM9aiSGxGF2XfG5YSfLzr+Egld1xCHxansFt01zbMPD5tVgQVt 812w== X-Gm-Message-State: AMCzsaXJtaZcqamqVw9AZmuYerynkaPp4qyHQ3ibtgG6N8fpE9nqN5Tp rZJqvaoiQxGUtOOeCHyiS/HXNbCAklQ= X-Google-Smtp-Source: ABhQp+SXzOaf/4UWMcZORUvFYhrJ7YMNg18KvcrCXWJR/lmJt7uqKo2S5zpcnL47pk+QKyO0/ZYTPw== X-Received: by 10.46.58.2 with SMTP id h2mr4012330lja.132.1509395439826; Mon, 30 Oct 2017 13:30:39 -0700 (PDT) Received: from gilgamesh.semihalf.com (31-172-191-173.noc.fibertech.net.pl. [31.172.191.173]) by smtp.gmail.com with ESMTPSA id n63sm3657194ljb.1.2017.10.30.13.30.38 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 30 Oct 2017 13:30:39 -0700 (PDT) From: Marcin Wojtas To: edk2-devel@lists.01.org Cc: feng.tian@intel.com, michael.d.kinney@intel.com, liming.gao@intel.com, leif.lindholm@linaro.org, ard.biesheuvel@linaro.org, nadavh@marvell.com, neta@marvell.com, kostap@marvell.com, jinghua@marvell.com, mw@semihalf.com, jsd@semihalf.com Date: Mon, 30 Oct 2017 21:30:25 +0100 Message-Id: <1509395425-15145-1-git-send-email-mw@semihalf.com> X-Mailer: git-send-email 2.7.4 Subject: [PATCH 1/1] EmbeddedPkg: Implement NorFlashLib X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 30 Oct 2017 20:26:52 -0000 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 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. Because JEDEC compliant SPI NOR devices allow to obtain their ID with READ_ID command (0x9f), implement a NorFlashLib that gives access to the NOR flash 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 issuing READ_ID command to the GetNorFlashInfo () routine - if the match is found, an allocated (optionally for RT) pool with the flash description will be returned. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Marcin Wojtas --- EmbeddedPkg/EmbeddedPkg.dec | 1 + EmbeddedPkg/Include/Library/NorFlashInfoLib.h | 84 ++++++++ EmbeddedPkg/Library/NorFlashInfoLib/NorFlashInfoLib.c | 225 ++++++++++++++++++++ EmbeddedPkg/Library/NorFlashInfoLib/NorFlashInfoLib.inf | 34 +++ 4 files changed, 344 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..ae0e45f --- /dev/null +++ b/EmbeddedPkg/Include/Library/NorFlashInfoLib.h @@ -0,0 +1,84 @@ +/** @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 + +#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 NF_ERASE_4K 1 << 0 /* Use 4096B erase blocks and CMD_ERASE_4K */ +#define NF_WRITE_FSR 1 << 1 /* Use flag status register for write */ +#define NF_4B_ADDR 1 << 2 /* Use 4B addressing */ +} NOR_FLASH_INFO; + +/** + Return a pool allocated copy of the NOR flash . + + @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 +GetNorFlashInfo ( + 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 +PrintNorFlashInfo ( + 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..2185163 --- /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 + +#include +#include +#include +#include +#include +#include + +static CONST NOR_FLASH_INFO NorFlashIds[] = { + /* ATMEL */ + {L"at45db011d", {0x1f, 0x22, 0x00}, 3, 256, 64 * 1024, 4, NF_ERASE_4K}, + {L"at45db021d", {0x1f, 0x23, 0x00}, 3, 256, 64 * 1024, 8, NF_ERASE_4K}, + {L"at45db041d", {0x1f, 0x24, 0x00}, 3, 256, 64 * 1024, 8, NF_ERASE_4K}, + {L"at45db081d", {0x1f, 0x25, 0x00}, 3, 256, 64 * 1024, 16, NF_ERASE_4K}, + {L"at45db161d", {0x1f, 0x26, 0x00}, 3, 256, 64 * 1024, 32, NF_ERASE_4K}, + {L"at45db321d", {0x1f, 0x27, 0x00}, 3, 256, 64 * 1024, 64, NF_ERASE_4K}, + {L"at45db641d", {0x1f, 0x28, 0x00}, 3, 256, 64 * 1024, 128, NF_ERASE_4K}, + {L"at25df321a", {0x1f, 0x47, 0x01}, 3, 256, 64 * 1024, 64, NF_ERASE_4K}, + {L"at25df321", {0x1f, 0x47, 0x00}, 3, 256, 64 * 1024, 64, NF_ERASE_4K}, + {L"at26df081a", {0x1f, 0x45, 0x01}, 3, 256, 64 * 1024, 16, NF_ERASE_4K}, + /* EON */ + {L"en25q32b", {0x1c, 0x30, 0x16}, 3, 256, 64 * 1024, 64, 0}, + {L"en25q64", {0x1c, 0x30, 0x17}, 3, 256, 64 * 1024, 128, NF_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, NF_ERASE_4K}, + {L"gd25lq32", {0xc8, 0x60, 0x16}, 3, 256, 64 * 1024, 64, NF_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, NF_ERASE_4K}, + {L"n25q016a", {0x20, 0xbb, 0x15}, 3, 256, 64 * 1024, 32, NF_ERASE_4K}, + {L"n25q32", {0x20, 0xba, 0x16}, 3, 256, 64 * 1024, 64, NF_ERASE_4K}, + {L"n25q32a", {0x20, 0xbb, 0x16}, 3, 256, 64 * 1024, 64, NF_ERASE_4K}, + {L"n25q64", {0x20, 0xba, 0x17}, 3, 256, 64 * 1024, 128, NF_ERASE_4K}, + {L"n25q64a", {0x20, 0xbb, 0x17}, 3, 256, 64 * 1024, 128, NF_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, NF_ERASE_4K}, + {L"n25q256a", {0x20, 0xbb, 0x19}, 3, 256, 64 * 1024, 512, NF_ERASE_4K}, + {L"n25q512", {0x20, 0xba, 0x20}, 3, 256, 64 * 1024, 1024, NF_WRITE_FSR | NF_ERASE_4K}, + {L"n25q512a", {0x20, 0xbb, 0x20}, 3, 256, 64 * 1024, 1024, NF_WRITE_FSR | NF_ERASE_4K}, + {L"n25q1024", {0x20, 0xba, 0x21}, 3, 256, 64 * 1024, 2048, NF_WRITE_FSR | NF_ERASE_4K}, + {L"n25q1024a", {0x20, 0xbb, 0x21}, 3, 256, 64 * 1024, 2048, NF_WRITE_FSR | NF_ERASE_4K}, + {L"mt25qu02g", {0x20, 0xbb, 0x22}, 3, 256, 64 * 1024, 4096, NF_WRITE_FSR | NF_ERASE_4K}, + {L"mt25ql02g", {0x20, 0xba, 0x22}, 3, 256, 64 * 1024, 4096, NF_WRITE_FSR | NF_ERASE_4K}, + /* SST */ + {L"sst25vf040b", {0xbf, 0x25, 0x8d}, 3, 256, 64 * 1024, 8, NF_ERASE_4K}, + {L"sst25vf080b", {0xbf, 0x25, 0x8e}, 3, 256, 64 * 1024, 16, NF_ERASE_4K}, + {L"sst25vf016b", {0xbf, 0x25, 0x41}, 3, 256, 64 * 1024, 32, NF_ERASE_4K}, + {L"sst25vf032b", {0xbf, 0x25, 0x4a}, 3, 256, 64 * 1024, 64, NF_ERASE_4K}, + {L"sst25vf064c", {0xbf, 0x25, 0x4b}, 3, 256, 64 * 1024, 128, NF_ERASE_4K}, + {L"sst25wf512", {0xbf, 0x25, 0x01}, 3, 256, 64 * 1024, 1, NF_ERASE_4K}, + {L"sst25wf010", {0xbf, 0x25, 0x02}, 3, 256, 64 * 1024, 2, NF_ERASE_4K}, + {L"sst25wf020", {0xbf, 0x25, 0x03}, 3, 256, 64 * 1024, 4, NF_ERASE_4K}, + {L"sst25wf040", {0xbf, 0x25, 0x04}, 3, 256, 64 * 1024, 8, NF_ERASE_4K}, + {L"sst25wf040b", {0x62, 0x16, 0x13}, 3, 256, 64 * 1024, 8, NF_ERASE_4K}, + {L"sst25wf080", {0xbf, 0x25, 0x05}, 3, 256, 64 * 1024, 16, NF_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, NF_ERASE_4K}, + {L"w25x16", {0xef, 0x30, 0x15}, 3, 256, 64 * 1024, 32, NF_ERASE_4K}, + {L"w25x32", {0xef, 0x30, 0x16}, 3, 256, 64 * 1024, 64, NF_ERASE_4K}, + {L"w25x64", {0xef, 0x30, 0x17}, 3, 256, 64 * 1024, 128, NF_ERASE_4K}, + {L"w25q80bl", {0xef, 0x40, 0x14}, 3, 256, 64 * 1024, 16, NF_ERASE_4K}, + {L"w25q16cl", {0xef, 0x40, 0x15}, 3, 256, 64 * 1024, 32, NF_ERASE_4K}, + {L"w25q32bv", {0xef, 0x40, 0x16}, 3, 256, 64 * 1024, 64, NF_ERASE_4K}, + {L"w25q64cv", {0xef, 0x40, 0x17}, 3, 256, 64 * 1024, 128, NF_ERASE_4K}, + {L"w25q128bv", {0xef, 0x40, 0x18}, 3, 256, 64 * 1024, 256, NF_ERASE_4K}, + {L"w25q256", {0xef, 0x40, 0x19}, 3, 256, 64 * 1024, 512, NF_ERASE_4K}, + {L"w25q80bw", {0xef, 0x50, 0x14}, 3, 256, 64 * 1024, 16, NF_ERASE_4K}, + {L"w25q16dw", {0xef, 0x60, 0x15}, 3, 256, 64 * 1024, 32, NF_ERASE_4K}, + {L"w25q32dw", {0xef, 0x60, 0x16}, 3, 256, 64 * 1024, 64, NF_ERASE_4K}, + {L"w25q64dw", {0xef, 0x60, 0x17}, 3, 256, 64 * 1024, 128, NF_ERASE_4K}, + {L"w25q128fw", {0xef, 0x60, 0x18}, 3, 256, 64 * 1024, 256, NF_ERASE_4K}, + {}, /* Empty entry to terminate the list */ +}; + +/** + Return a pool allocated copy of the NOR flash . + + @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 +GetNorFlashInfo ( + 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 +PrintNorFlashInfo ( + IN NOR_FLASH_INFO *Info + ) +{ + UINTN EraseSize; + + if (Info->Flags & NF_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