]> git.proxmox.com Git - mirror_edk2.git/blame - EmbeddedPkg/Library/NorFlashInfoLib/NorFlashInfoLib.c
OvmfPkg/PlatformPei: list "Cmos.h" in the INF file
[mirror_edk2.git] / EmbeddedPkg / Library / NorFlashInfoLib / NorFlashInfoLib.c
CommitLineData
70466101
MW
1/** @file\r
2*\r
3* Copyright (c) 2017 Marvell International Ltd.\r
4*\r
5* This program and the accompanying materials\r
6* are licensed and made available under the terms and conditions of the BSD License\r
7* which accompanies this distribution. The full text of the license may be found at\r
8* http://opensource.org/licenses/bsd-license.php\r
9*\r
10* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12*\r
13**/\r
14\r
15#include <PiDxe.h>\r
16\r
17#include <Library/BaseLib.h>\r
18#include <Library/BaseMemoryLib.h>\r
19#include <Library/DebugLib.h>\r
20#include <Library/DxeServicesLib.h>\r
21#include <Library/MemoryAllocationLib.h>\r
22#include <Library/NorFlashInfoLib.h>\r
23\r
24STATIC CONST NOR_FLASH_INFO NorFlashIds[] = {\r
25 /* ATMEL */\r
26 {L"at45db011d", {0x1f, 0x22, 0x00}, 3, 256, 64 * 1024, 4, NOR_FLASH_ERASE_4K},\r
27 {L"at45db021d", {0x1f, 0x23, 0x00}, 3, 256, 64 * 1024, 8, NOR_FLASH_ERASE_4K},\r
28 {L"at45db041d", {0x1f, 0x24, 0x00}, 3, 256, 64 * 1024, 8, NOR_FLASH_ERASE_4K},\r
29 {L"at45db081d", {0x1f, 0x25, 0x00}, 3, 256, 64 * 1024, 16, NOR_FLASH_ERASE_4K},\r
30 {L"at45db161d", {0x1f, 0x26, 0x00}, 3, 256, 64 * 1024, 32, NOR_FLASH_ERASE_4K},\r
31 {L"at45db321d", {0x1f, 0x27, 0x00}, 3, 256, 64 * 1024, 64, NOR_FLASH_ERASE_4K},\r
32 {L"at45db641d", {0x1f, 0x28, 0x00}, 3, 256, 64 * 1024, 128, NOR_FLASH_ERASE_4K},\r
33 {L"at25df321a", {0x1f, 0x47, 0x01}, 3, 256, 64 * 1024, 64, NOR_FLASH_ERASE_4K},\r
34 {L"at25df321", {0x1f, 0x47, 0x00}, 3, 256, 64 * 1024, 64, NOR_FLASH_ERASE_4K},\r
35 {L"at26df081a", {0x1f, 0x45, 0x01}, 3, 256, 64 * 1024, 16, NOR_FLASH_ERASE_4K},\r
36 /* EON */\r
37 {L"en25q32b", {0x1c, 0x30, 0x16}, 3, 256, 64 * 1024, 64, 0},\r
38 {L"en25q64", {0x1c, 0x30, 0x17}, 3, 256, 64 * 1024, 128, NOR_FLASH_ERASE_4K},\r
39 {L"en25q128b", {0x1c, 0x30, 0x18}, 3, 256, 64 * 1024, 256, 0},\r
40 {L"en25s64", {0x1c, 0x38, 0x17}, 3, 256, 64 * 1024, 128, 0},\r
41 /* GIGADEVICE */\r
42 {L"gd25q64b", {0xc8, 0x40, 0x17}, 3, 256, 64 * 1024, 128, NOR_FLASH_ERASE_4K},\r
43 {L"gd25lq32", {0xc8, 0x60, 0x16}, 3, 256, 64 * 1024, 64, NOR_FLASH_ERASE_4K},\r
44 /* ISSI */\r
45 {L"is25lp032", {0x9d, 0x60, 0x16}, 3, 256, 64 * 1024, 64, 0},\r
46 {L"is25lp064", {0x9d, 0x60, 0x17}, 3, 256, 64 * 1024, 128, 0},\r
47 {L"is25lp128", {0x9d, 0x60, 0x18}, 3, 256, 64 * 1024, 256, 0},\r
48 /* MACRONIX */\r
49 {L"mx25l2006e", {0xc2, 0x20, 0x12}, 3, 256, 64 * 1024, 4, 0},\r
50 {L"mx25l4005", {0xc2, 0x20, 0x13}, 3, 256, 64 * 1024, 8, 0},\r
51 {L"mx25l8005", {0xc2, 0x20, 0x14}, 3, 256, 64 * 1024, 16, 0},\r
52 {L"mx25l1605d", {0xc2, 0x20, 0x15}, 3, 256, 64 * 1024, 32, 0},\r
53 {L"mx25l3205d", {0xc2, 0x20, 0x16}, 3, 256, 64 * 1024, 64, 0},\r
54 {L"mx25l6405d", {0xc2, 0x20, 0x17}, 3, 256, 64 * 1024, 128, 0},\r
55 {L"mx25l12805", {0xc2, 0x20, 0x18}, 3, 256, 64 * 1024, 256, 0},\r
56 {L"mx25l25635f", {0xc2, 0x20, 0x19}, 3, 256, 64 * 1024, 512, 0},\r
57 {L"mx25l51235f", {0xc2, 0x20, 0x1a}, 3, 256, 64 * 1024, 1024, 0},\r
58 {L"mx25l12855e", {0xc2, 0x26, 0x18}, 3, 256, 64 * 1024, 256, 0},\r
59 {L"mx66u51235f", {0xc2, 0x25, 0x3a}, 3, 256, 64 * 1024, 1024, 0},\r
ca094756 60 {L"mx66u1g45g", {0xc2, 0x25, 0x3b}, 3, 256, 64 * 1024, 2048, 0},\r
70466101
MW
61 {L"mx66l1g45g", {0xc2, 0x20, 0x1b}, 3, 256, 64 * 1024, 2048, 0},\r
62 /* SPANSION */\r
63 {L"s25fl008a", {0x01, 0x02, 0x13}, 3, 256, 64 * 1024, 16, 0},\r
64 {L"s25fl016a", {0x01, 0x02, 0x14}, 3, 256, 64 * 1024, 32, 0},\r
65 {L"s25fl032a", {0x01, 0x02, 0x15}, 3, 256, 64 * 1024, 64, 0},\r
66 {L"s25fl064a", {0x01, 0x02, 0x16}, 3, 256, 64 * 1024, 128, 0},\r
67 {L"s25fl116k", {0x01, 0x40, 0x15}, 3, 256, 64 * 1024, 128, 0},\r
68 {L"s25fl164k", {0x01, 0x40, 0x17, 0x01, 0x40}, 5, 256, 64 * 1024, 128, 0},\r
69 {L"s25fl128p_256k", {0x01, 0x20, 0x18, 0x03, 0x00}, 5, 256, 256 * 1024, 64, 0},\r
70 {L"s25fl128p_64k", {0x01, 0x20, 0x18, 0x03, 0x01}, 5, 256, 64 * 1024, 256, 0},\r
71 {L"s25fl032p", {0x01, 0x02, 0x15, 0x4d, 0x00}, 5, 256, 64 * 1024, 64, 0},\r
72 {L"s25fl064p", {0x01, 0x02, 0x16, 0x4d, 0x00}, 5, 256, 64 * 1024, 128, 0},\r
73 {L"s25fl128s_256k", {0x01, 0x20, 0x18, 0x4d, 0x00}, 5, 256, 256 * 1024, 64, 0},\r
74 {L"s25fl128s_64k", {0x01, 0x20, 0x18, 0x4d, 0x01}, 5, 256, 64 * 1024, 256, 0},\r
75 {L"s25fl256s_256k", {0x01, 0x02, 0x19, 0x4d, 0x00}, 5, 256, 256 * 1024, 128, 0},\r
76 {L"s25fl256s_64k", {0x01, 0x02, 0x19, 0x4d, 0x01}, 5, 256, 64 * 1024, 512, 0},\r
77 {L"s25fl512s_256k", {0x01, 0x02, 0x20, 0x4d, 0x00}, 5, 256, 256 * 1024, 256, 0},\r
78 {L"s25fl512s_64k", {0x01, 0x02, 0x20, 0x4d, 0x01}, 5, 256, 64 * 1024, 1024, 0},\r
79 {L"s25fl512s_512k", {0x01, 0x02, 0x20, 0x4f, 0x00}, 5, 256, 256 * 1024, 256, 0},\r
80 /* STMICRO */\r
81 {L"m25p10", {0x20, 0x20, 0x11}, 3, 256, 32 * 1024, 4, 0},\r
82 {L"m25p20", {0x20, 0x20, 0x12}, 3, 256, 64 * 1024, 4, 0},\r
83 {L"m25p40", {0x20, 0x20, 0x13}, 3, 256, 64 * 1024, 8, 0},\r
84 {L"m25p80", {0x20, 0x20, 0x14}, 3, 256, 64 * 1024, 16, 0},\r
85 {L"m25p16", {0x20, 0x20, 0x15}, 3, 256, 64 * 1024, 32, 0},\r
86 {L"m25pE16", {0x20, 0x80, 0x15, 0x10, 0x00}, 5, 256, 64 * 1024, 32, 0},\r
87 {L"m25pX16", {0x20, 0x71, 0x15, 0x10, 0x00}, 5, 256, 64 * 1024, 32, 0},\r
88 {L"m25p32", {0x20, 0x20, 0x16}, 3, 256, 64 * 1024, 64, 0},\r
89 {L"m25p64", {0x20, 0x20, 0x17}, 3, 256, 64 * 1024, 128, 0},\r
90 {L"m25p128", {0x20, 0x20, 0x18}, 3, 256, 256 * 1024, 64, 0},\r
91 {L"m25pX64", {0x20, 0x71, 0x17}, 3, 256, 64 * 1024, 128, NOR_FLASH_ERASE_4K},\r
92 {L"n25q016a", {0x20, 0xbb, 0x15}, 3, 256, 64 * 1024, 32, NOR_FLASH_ERASE_4K},\r
93 {L"n25q32", {0x20, 0xba, 0x16}, 3, 256, 64 * 1024, 64, NOR_FLASH_ERASE_4K},\r
94 {L"n25q32a", {0x20, 0xbb, 0x16}, 3, 256, 64 * 1024, 64, NOR_FLASH_ERASE_4K},\r
95 {L"n25q64", {0x20, 0xba, 0x17}, 3, 256, 64 * 1024, 128, NOR_FLASH_ERASE_4K},\r
96 {L"n25q64a", {0x20, 0xbb, 0x17}, 3, 256, 64 * 1024, 128, NOR_FLASH_ERASE_4K},\r
97 {L"n25q128", {0x20, 0xba, 0x18}, 3, 256, 64 * 1024, 256, 0},\r
98 {L"n25q128a", {0x20, 0xbb, 0x18}, 3, 256, 64 * 1024, 256, 0},\r
99 {L"n25q256", {0x20, 0xba, 0x19}, 3, 256, 64 * 1024, 512, NOR_FLASH_ERASE_4K},\r
100 {L"n25q256a", {0x20, 0xbb, 0x19}, 3, 256, 64 * 1024, 512, NOR_FLASH_ERASE_4K},\r
101 {L"n25q512", {0x20, 0xba, 0x20}, 3, 256, 64 * 1024, 1024, NOR_FLASH_WRITE_FSR | NOR_FLASH_ERASE_4K},\r
102 {L"n25q512a", {0x20, 0xbb, 0x20}, 3, 256, 64 * 1024, 1024, NOR_FLASH_WRITE_FSR | NOR_FLASH_ERASE_4K},\r
103 {L"n25q1024", {0x20, 0xba, 0x21}, 3, 256, 64 * 1024, 2048, NOR_FLASH_WRITE_FSR | NOR_FLASH_ERASE_4K},\r
104 {L"n25q1024a", {0x20, 0xbb, 0x21}, 3, 256, 64 * 1024, 2048, NOR_FLASH_WRITE_FSR | NOR_FLASH_ERASE_4K},\r
105 {L"mt25qu02g", {0x20, 0xbb, 0x22}, 3, 256, 64 * 1024, 4096, NOR_FLASH_WRITE_FSR | NOR_FLASH_ERASE_4K},\r
106 {L"mt25ql02g", {0x20, 0xba, 0x22}, 3, 256, 64 * 1024, 4096, NOR_FLASH_WRITE_FSR | NOR_FLASH_ERASE_4K},\r
107 /* SST */\r
108 {L"sst25vf040b", {0xbf, 0x25, 0x8d}, 3, 256, 64 * 1024, 8, NOR_FLASH_ERASE_4K},\r
109 {L"sst25vf080b", {0xbf, 0x25, 0x8e}, 3, 256, 64 * 1024, 16, NOR_FLASH_ERASE_4K},\r
110 {L"sst25vf016b", {0xbf, 0x25, 0x41}, 3, 256, 64 * 1024, 32, NOR_FLASH_ERASE_4K},\r
111 {L"sst25vf032b", {0xbf, 0x25, 0x4a}, 3, 256, 64 * 1024, 64, NOR_FLASH_ERASE_4K},\r
112 {L"sst25vf064c", {0xbf, 0x25, 0x4b}, 3, 256, 64 * 1024, 128, NOR_FLASH_ERASE_4K},\r
113 {L"sst25wf512", {0xbf, 0x25, 0x01}, 3, 256, 64 * 1024, 1, NOR_FLASH_ERASE_4K},\r
114 {L"sst25wf010", {0xbf, 0x25, 0x02}, 3, 256, 64 * 1024, 2, NOR_FLASH_ERASE_4K},\r
115 {L"sst25wf020", {0xbf, 0x25, 0x03}, 3, 256, 64 * 1024, 4, NOR_FLASH_ERASE_4K},\r
116 {L"sst25wf040", {0xbf, 0x25, 0x04}, 3, 256, 64 * 1024, 8, NOR_FLASH_ERASE_4K},\r
117 {L"sst25wf040b", {0x62, 0x16, 0x13}, 3, 256, 64 * 1024, 8, NOR_FLASH_ERASE_4K},\r
118 {L"sst25wf080", {0xbf, 0x25, 0x05}, 3, 256, 64 * 1024, 16, NOR_FLASH_ERASE_4K},\r
119 /* WINBOND */\r
120 {L"w25p80", {0xef, 0x20, 0x14}, 3, 256, 64 * 1024, 16, 0},\r
121 {L"w25p16", {0xef, 0x20, 0x15}, 3, 256, 64 * 1024, 32, 0},\r
122 {L"w25p32", {0xef, 0x20, 0x16}, 3, 256, 64 * 1024, 64, 0},\r
123 {L"w25x40", {0xef, 0x30, 0x13}, 3, 256, 64 * 1024, 8, NOR_FLASH_ERASE_4K},\r
124 {L"w25x16", {0xef, 0x30, 0x15}, 3, 256, 64 * 1024, 32, NOR_FLASH_ERASE_4K},\r
125 {L"w25x32", {0xef, 0x30, 0x16}, 3, 256, 64 * 1024, 64, NOR_FLASH_ERASE_4K},\r
126 {L"w25x64", {0xef, 0x30, 0x17}, 3, 256, 64 * 1024, 128, NOR_FLASH_ERASE_4K},\r
127 {L"w25q80bl", {0xef, 0x40, 0x14}, 3, 256, 64 * 1024, 16, NOR_FLASH_ERASE_4K},\r
128 {L"w25q16cl", {0xef, 0x40, 0x15}, 3, 256, 64 * 1024, 32, NOR_FLASH_ERASE_4K},\r
129 {L"w25q32bv", {0xef, 0x40, 0x16}, 3, 256, 64 * 1024, 64, NOR_FLASH_ERASE_4K},\r
130 {L"w25q64cv", {0xef, 0x40, 0x17}, 3, 256, 64 * 1024, 128, NOR_FLASH_ERASE_4K},\r
131 {L"w25q128bv", {0xef, 0x40, 0x18}, 3, 256, 64 * 1024, 256, NOR_FLASH_ERASE_4K},\r
132 {L"w25q256", {0xef, 0x40, 0x19}, 3, 256, 64 * 1024, 512, NOR_FLASH_ERASE_4K},\r
133 {L"w25q80bw", {0xef, 0x50, 0x14}, 3, 256, 64 * 1024, 16, NOR_FLASH_ERASE_4K},\r
134 {L"w25q16dw", {0xef, 0x60, 0x15}, 3, 256, 64 * 1024, 32, NOR_FLASH_ERASE_4K},\r
135 {L"w25q32dw", {0xef, 0x60, 0x16}, 3, 256, 64 * 1024, 64, NOR_FLASH_ERASE_4K},\r
136 {L"w25q64dw", {0xef, 0x60, 0x17}, 3, 256, 64 * 1024, 128, NOR_FLASH_ERASE_4K},\r
137 {L"w25q128fw", {0xef, 0x60, 0x18}, 3, 256, 64 * 1024, 256, NOR_FLASH_ERASE_4K},\r
138 {}, /* Empty entry to terminate the list */\r
139};\r
140\r
141/**\r
142 Return an allocated copy pool of the NOR flash information structure.\r
143\r
144 @param[in] Id Pointer to an array with JEDEC ID obtained\r
145 from the NOR flash with READ_ID command\r
146 (0x9f)\r
147 @param[in out] FlashInfo Pointer to NOR flash information structure\r
148 @param[in] AllocateForRuntime A flag specifying a type of a copy pool\r
149 allocation (TRUE for runtime, FALSE for\r
150 normal)\r
151\r
152 @retval EFI_SUCCESS Operation completed successfully\r
153 @retval EFI_NOT_FOUND No matching entry in NOR ID table found\r
154 @retval EFI_OUT_OF_RESOURCES No pool memory available\r
155\r
156**/\r
157EFI_STATUS\r
158EFIAPI\r
159NorFlashGetInfo (\r
160 IN UINT8 *Id,\r
161 IN OUT NOR_FLASH_INFO **FlashInfo,\r
162 IN BOOLEAN AllocateForRuntime\r
163 )\r
164{\r
165 CONST NOR_FLASH_INFO *TmpInfo;\r
166\r
167 /*\r
168 * Iterate over NorFlashIds table, in order to find matching entry.\r
169 */\r
170 TmpInfo = NorFlashIds;\r
171 for (; TmpInfo->Name != NULL; TmpInfo++) {\r
172 if (CompareMem (TmpInfo->Id, Id, TmpInfo->IdLen) == 0) {\r
173 break;\r
174 }\r
175 }\r
176\r
177 /*\r
178 * Matching entry was not found.\r
179 */\r
180 if (TmpInfo->Name == NULL) {\r
181 return EFI_NOT_FOUND;\r
182 }\r
183\r
184 /*\r
185 * Allocate and copy NOR flash information structure.\r
186 */\r
187 if (AllocateForRuntime) {\r
188 *FlashInfo = AllocateRuntimeCopyPool (sizeof (NOR_FLASH_INFO), TmpInfo);\r
189 } else {\r
190 *FlashInfo = AllocateCopyPool (sizeof (NOR_FLASH_INFO), TmpInfo);\r
191 }\r
192 if (FlashInfo == NULL) {\r
193 return EFI_OUT_OF_RESOURCES;\r
194 }\r
195\r
196 return EFI_SUCCESS;\r
197}\r
198\r
199/**\r
200 Print NOR flash information basing on data stored in\r
201 the NOR_FLASH_INFO structure.\r
202\r
203 @param[in] FlashInfo Pointer to NOR flash information structure\r
204\r
205**/\r
206VOID\r
207EFIAPI\r
208NorFlashPrintInfo (\r
209 IN NOR_FLASH_INFO *Info\r
210 )\r
211{\r
212 UINTN EraseSize;\r
213\r
214 if (Info->Flags & NOR_FLASH_ERASE_4K) {\r
215 EraseSize = SIZE_4KB;\r
216 } else {\r
217 EraseSize = Info->SectorSize;\r
218 }\r
219\r
220 DEBUG ((DEBUG_ERROR,\r
221 "Detected %s SPI NOR flash with page size %d B, erase size %d KB, total %d MB\n",\r
222 Info->Name,\r
223 Info->PageSize,\r
224 EraseSize / 1024,\r
225 (Info->SectorSize * Info->SectorCount) / 1024 / 1024));\r
226}\r