From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=2a00:1450:400c:c09::22b; helo=mail-wm0-x22b.google.com; envelope-from=leif.lindholm@linaro.org; receiver=edk2-devel@lists.01.org Received: from mail-wm0-x22b.google.com (mail-wm0-x22b.google.com [IPv6:2a00:1450:400c:c09::22b]) (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 3C9F12034A87A for ; Tue, 31 Oct 2017 21:24:19 -0700 (PDT) Received: by mail-wm0-x22b.google.com with SMTP id b189so2482212wmd.4 for ; Tue, 31 Oct 2017 21:28:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=uXDwdX73zOq7Xzjga14roEWdRMZjKerQvOZgJajHo40=; b=itp5tg55TEql+B6+BKAWmeP7XdfOv7tf26SQdPMaNEjg0hWNWiTcMx0Dju17v6ok+T prUBS+pvwHdR414ptZZsPRPmyMO+f3obEwp1oEG04PmCu46DHxhWyJl0XYuXrurA9+Yl cGV0jpEMiSi5IzL0d1LpymSvn+GM1giTVeJq8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=uXDwdX73zOq7Xzjga14roEWdRMZjKerQvOZgJajHo40=; b=lyKMTVkEbkcqxQnqtGedZvdNAnq+oieAPlAw1+xgIiX/8ChWMuTghUPa+R3R2nbngY 2gtbT1mjjJO/IavEDYK11JrxjME+ucLfcuyrv1UayxT9B9wlndkzSWBq1+ZSxHIeMeVh EDnWal26/qTOzXim3firaYHtEXgcwWyR8xrseLcQxA1FZ/suOzchRsFK7uH3wY80WgRF ws+rtgzo4Dfa6Cnj19hTUj4EiuvMGIqhuQhoTvu5NGLoY9NBIPaHE2SamwfFCwd3Ou86 ca/EieodbtcLoMjVkqHZwWYx2sQVDMp1vw5FMdY67gSIfBlyIJwtSSEfFPecPB39uVKf VD/w== X-Gm-Message-State: AMCzsaWhWotV/yrz6waieftRNOmCh/8D9v1IrPoFsFcdpxbnxXSL6YP0 R2a7gUpDYDukeZvPT91MnfjV+g== X-Google-Smtp-Source: ABhQp+S3fklv7YdW3VH0i/jdQtWbysnacTqrqfFs6hcb/lu6AAEqZAkbQIlVNrTV0tskaFdGRqNtRQ== X-Received: by 10.28.94.3 with SMTP id s3mr3822959wmb.78.1509510489873; Tue, 31 Oct 2017 21:28:09 -0700 (PDT) Received: from bivouac.eciton.net (bivouac.eciton.net. [2a00:1098:0:86:1000:23:0:2]) by smtp.gmail.com with ESMTPSA id j21sm3207963wre.86.2017.10.31.21.28.08 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 31 Oct 2017 21:28:08 -0700 (PDT) Date: Wed, 1 Nov 2017 04:28:07 +0000 From: Leif Lindholm To: Marcin Wojtas Cc: edk2-devel@lists.01.org, feng.tian@intel.com, michael.d.kinney@intel.com, liming.gao@intel.com, ard.biesheuvel@linaro.org, nadavh@marvell.com, neta@marvell.com, kostap@marvell.com, jinghua@marvell.com, jsd@semihalf.com Message-ID: <20171101042807.znjpyacqzdymgp5w@bivouac.eciton.net> References: <1509446342-1618-1-git-send-email-mw@semihalf.com> MIME-Version: 1.0 In-Reply-To: <1509446342-1618-1-git-send-email-mw@semihalf.com> User-Agent: NeoMutt/20170113 (1.7.2) Subject: Re: [PATCH v2 1/1] EmbeddedPkg: Implement NorFlashInfoLib 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: Wed, 01 Nov 2017 04:24:19 -0000 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Tue, Oct 31, 2017 at 11:39:02AM +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. > > Because JEDEC compliant SPI NOR devices allow to obtain their ID > with READ_ID command (0x9f), implement a NorFlashInfoLib that gives > an 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 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 > > ========================================= > Patch available in the github: > https://github.com/MarvellEmbeddedProcessors/edk2/commits/norlib-upstream-r20171031 > > 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) > > --- > 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..e28c169 > --- /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__ Please also fold in the vendor name defines somewhere in this file, (as NOR_FLASH_*). > + > +#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 NOR_FLASH_ERASE_4K (1 << 0) /* Use 4096B erase blocks and CMD_ERASE_4K */ > +#define NOR_FLASH_WRITE_FSR (1 << 1) /* Use flag status register for write */ > +#define NOR_FLASH_4B_ADDR (1 << 2) /* Use 4B addressing */ > +} NOR_FLASH_INFO; > + > +/** > + 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..326c4c1 > --- /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[] = { STATIC CONST NOR_FLASH_INFO mNorFlashIds[] = { (Sorry, didn't spot when looking at v1.) Otherwise, this looks fine to me. / Leif > + /* 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 >