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