]>
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 | |
e7108d0e | 18 | STATIC CONST NOR_FLASH_INFO NorFlashIds[] = {\r |
70466101 | 19 | /* ATMEL */\r |
e7108d0e MK |
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 | |
70466101 | 30 | /* EON */\r |
e7108d0e MK |
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 | |
70466101 | 35 | /* GIGADEVICE */\r |
e7108d0e MK |
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 | |
70466101 | 38 | /* ISSI */\r |
e7108d0e MK |
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 | |
70466101 | 42 | /* MACRONIX */\r |
e7108d0e MK |
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 | |
54 | { L"mx66u1g45g", { 0xc2, 0x25, 0x3b }, 3, 256, 64 * 1024, 2048, 0 },\r | |
55 | { L"mx66l1g45g", { 0xc2, 0x20, 0x1b }, 3, 256, 64 * 1024, 2048, 0 },\r | |
70466101 | 56 | /* SPANSION */\r |
e7108d0e MK |
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 | |
70466101 | 74 | /* STMICRO */\r |
e7108d0e MK |
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 | |
70466101 | 101 | /* SST */\r |
e7108d0e MK |
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 | |
70466101 | 113 | /* WINBOND */\r |
e7108d0e MK |
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 | |
70466101 MW |
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 | |
e7108d0e | 154 | IN UINT8 *Id,\r |
70466101 | 155 | IN OUT NOR_FLASH_INFO **FlashInfo,\r |
e7108d0e | 156 | IN BOOLEAN AllocateForRuntime\r |
70466101 MW |
157 | )\r |
158 | {\r | |
e7108d0e | 159 | CONST NOR_FLASH_INFO *TmpInfo;\r |
70466101 MW |
160 | \r |
161 | /*\r | |
162 | * Iterate over NorFlashIds table, in order to find matching entry.\r | |
163 | */\r | |
164 | TmpInfo = NorFlashIds;\r | |
e7108d0e | 165 | for ( ; TmpInfo->Name != NULL; TmpInfo++) {\r |
70466101 MW |
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 | |
e7108d0e | 186 | \r |
70466101 MW |
187 | if (FlashInfo == NULL) {\r |
188 | return EFI_OUT_OF_RESOURCES;\r | |
189 | }\r | |
190 | \r | |
191 | return EFI_SUCCESS;\r | |
192 | }\r | |
193 | \r | |
194 | /**\r | |
195 | Print NOR flash information basing on data stored in\r | |
196 | the NOR_FLASH_INFO structure.\r | |
197 | \r | |
198 | @param[in] FlashInfo Pointer to NOR flash information structure\r | |
199 | \r | |
200 | **/\r | |
201 | VOID\r | |
202 | EFIAPI\r | |
203 | NorFlashPrintInfo (\r | |
204 | IN NOR_FLASH_INFO *Info\r | |
205 | )\r | |
206 | {\r | |
e7108d0e | 207 | UINTN EraseSize;\r |
70466101 MW |
208 | \r |
209 | if (Info->Flags & NOR_FLASH_ERASE_4K) {\r | |
210 | EraseSize = SIZE_4KB;\r | |
211 | } else {\r | |
212 | EraseSize = Info->SectorSize;\r | |
213 | }\r | |
214 | \r | |
e7108d0e MK |
215 | DEBUG ((\r |
216 | DEBUG_ERROR,\r | |
70466101 MW |
217 | "Detected %s SPI NOR flash with page size %d B, erase size %d KB, total %d MB\n",\r |
218 | Info->Name,\r | |
219 | Info->PageSize,\r | |
220 | EraseSize / 1024,\r | |
e7108d0e MK |
221 | (Info->SectorSize * Info->SectorCount) / 1024 / 1024\r |
222 | ));\r | |
70466101 | 223 | }\r |