]> git.proxmox.com Git - mirror_edk2.git/blob - ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashDxe.h
ArmPlatformPkg: enable use of authenticated variables in NorFlashDxe
[mirror_edk2.git] / ArmPlatformPkg / Drivers / NorFlashDxe / NorFlashDxe.h
1 /** @file NorFlashDxe.h
2
3 Copyright (c) 2011 - 2014, ARM Ltd. All rights reserved.<BR>
4
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
9
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12
13 **/
14
15 #ifndef __NOR_FLASH_DXE_H__
16 #define __NOR_FLASH_DXE_H__
17
18
19 #include <Base.h>
20 #include <PiDxe.h>
21
22 #include <Guid/EventGroup.h>
23
24 #include <Protocol/BlockIo.h>
25 #include <Protocol/DiskIo.h>
26 #include <Protocol/FirmwareVolumeBlock.h>
27
28 #include <Library/DebugLib.h>
29 #include <Library/IoLib.h>
30 #include <Library/NorFlashPlatformLib.h>
31 #include <Library/UefiLib.h>
32 #include <Library/UefiRuntimeLib.h>
33
34 #define NOR_FLASH_ERASE_RETRY 10
35
36 // Device access macros
37 // These are necessary because we use 2 x 16bit parts to make up 32bit data
38
39 #define HIGH_16_BITS 0xFFFF0000
40 #define LOW_16_BITS 0x0000FFFF
41 #define LOW_8_BITS 0x000000FF
42
43 #define FOLD_32BIT_INTO_16BIT(value) ( ( value >> 16 ) | ( value & LOW_16_BITS ) )
44
45 #define GET_LOW_BYTE(value) ( value & LOW_8_BITS )
46 #define GET_HIGH_BYTE(value) ( GET_LOW_BYTE( value >> 16 ) )
47
48 // Each command must be sent simultaneously to both chips,
49 // i.e. at the lower 16 bits AND at the higher 16 bits
50 #define CREATE_NOR_ADDRESS(BaseAddr,OffsetAddr) ((BaseAddr) + ((OffsetAddr) << 2))
51 #define CREATE_DUAL_CMD(Cmd) ( ( Cmd << 16) | ( Cmd & LOW_16_BITS) )
52 #define SEND_NOR_COMMAND(BaseAddr,Offset,Cmd) MmioWrite32 (CREATE_NOR_ADDRESS(BaseAddr,Offset), CREATE_DUAL_CMD(Cmd))
53 #define GET_NOR_BLOCK_ADDRESS(BaseAddr,Lba,LbaSize)( BaseAddr + (UINTN)((Lba) * LbaSize) )
54
55 // Status Register Bits
56 #define P30_SR_BIT_WRITE (BIT7 << 16 | BIT7)
57 #define P30_SR_BIT_ERASE_SUSPEND (BIT6 << 16 | BIT6)
58 #define P30_SR_BIT_ERASE (BIT5 << 16 | BIT5)
59 #define P30_SR_BIT_PROGRAM (BIT4 << 16 | BIT4)
60 #define P30_SR_BIT_VPP (BIT3 << 16 | BIT3)
61 #define P30_SR_BIT_PROGRAM_SUSPEND (BIT2 << 16 | BIT2)
62 #define P30_SR_BIT_BLOCK_LOCKED (BIT1 << 16 | BIT1)
63 #define P30_SR_BIT_BEFP (BIT0 << 16 | BIT0)
64
65 // Device Commands for Intel StrataFlash(R) Embedded Memory (P30) Family
66
67 // On chip buffer size for buffered programming operations
68 // There are 2 chips, each chip can buffer up to 32 (16-bit)words, and each word is 2 bytes.
69 // Therefore the total size of the buffer is 2 x 32 x 2 = 128 bytes
70 #define P30_MAX_BUFFER_SIZE_IN_BYTES ((UINTN)128)
71 #define P30_MAX_BUFFER_SIZE_IN_WORDS (P30_MAX_BUFFER_SIZE_IN_BYTES/((UINTN)4))
72 #define MAX_BUFFERED_PROG_ITERATIONS 10000000
73 #define BOUNDARY_OF_32_WORDS 0x7F
74
75 // CFI Addresses
76 #define P30_CFI_ADDR_QUERY_UNIQUE_QRY 0x10
77 #define P30_CFI_ADDR_VENDOR_ID 0x13
78
79 // CFI Data
80 #define CFI_QRY 0x00595251
81
82 // READ Commands
83 #define P30_CMD_READ_DEVICE_ID 0x0090
84 #define P30_CMD_READ_STATUS_REGISTER 0x0070
85 #define P30_CMD_CLEAR_STATUS_REGISTER 0x0050
86 #define P30_CMD_READ_ARRAY 0x00FF
87 #define P30_CMD_READ_CFI_QUERY 0x0098
88
89 // WRITE Commands
90 #define P30_CMD_WORD_PROGRAM_SETUP 0x0040
91 #define P30_CMD_ALTERNATE_WORD_PROGRAM_SETUP 0x0010
92 #define P30_CMD_BUFFERED_PROGRAM_SETUP 0x00E8
93 #define P30_CMD_BUFFERED_PROGRAM_CONFIRM 0x00D0
94 #define P30_CMD_BEFP_SETUP 0x0080
95 #define P30_CMD_BEFP_CONFIRM 0x00D0
96
97 // ERASE Commands
98 #define P30_CMD_BLOCK_ERASE_SETUP 0x0020
99 #define P30_CMD_BLOCK_ERASE_CONFIRM 0x00D0
100
101 // SUSPEND Commands
102 #define P30_CMD_PROGRAM_OR_ERASE_SUSPEND 0x00B0
103 #define P30_CMD_SUSPEND_RESUME 0x00D0
104
105 // BLOCK LOCKING / UNLOCKING Commands
106 #define P30_CMD_LOCK_BLOCK_SETUP 0x0060
107 #define P30_CMD_LOCK_BLOCK 0x0001
108 #define P30_CMD_UNLOCK_BLOCK 0x00D0
109 #define P30_CMD_LOCK_DOWN_BLOCK 0x002F
110
111 // PROTECTION Commands
112 #define P30_CMD_PROGRAM_PROTECTION_REGISTER_SETUP 0x00C0
113
114 // CONFIGURATION Commands
115 #define P30_CMD_READ_CONFIGURATION_REGISTER_SETUP 0x0060
116 #define P30_CMD_READ_CONFIGURATION_REGISTER 0x0003
117
118 #define NOR_FLASH_SIGNATURE SIGNATURE_32('n', 'o', 'r', '0')
119 #define INSTANCE_FROM_FVB_THIS(a) CR(a, NOR_FLASH_INSTANCE, FvbProtocol, NOR_FLASH_SIGNATURE)
120 #define INSTANCE_FROM_BLKIO_THIS(a) CR(a, NOR_FLASH_INSTANCE, BlockIoProtocol, NOR_FLASH_SIGNATURE)
121 #define INSTANCE_FROM_DISKIO_THIS(a) CR(a, NOR_FLASH_INSTANCE, DiskIoProtocol, NOR_FLASH_SIGNATURE)
122
123 typedef struct _NOR_FLASH_INSTANCE NOR_FLASH_INSTANCE;
124
125 typedef EFI_STATUS (*NOR_FLASH_INITIALIZE) (NOR_FLASH_INSTANCE* Instance);
126
127 typedef struct {
128 VENDOR_DEVICE_PATH Vendor;
129 EFI_DEVICE_PATH_PROTOCOL End;
130 } NOR_FLASH_DEVICE_PATH;
131
132 struct _NOR_FLASH_INSTANCE {
133 UINT32 Signature;
134 EFI_HANDLE Handle;
135
136 BOOLEAN Initialized;
137 NOR_FLASH_INITIALIZE Initialize;
138
139 UINTN DeviceBaseAddress;
140 UINTN RegionBaseAddress;
141 UINTN Size;
142 EFI_LBA StartLba;
143
144 EFI_BLOCK_IO_PROTOCOL BlockIoProtocol;
145 EFI_BLOCK_IO_MEDIA Media;
146 EFI_DISK_IO_PROTOCOL DiskIoProtocol;
147
148 BOOLEAN SupportFvb;
149 EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL FvbProtocol;
150 VOID* ShadowBuffer;
151
152 NOR_FLASH_DEVICE_PATH DevicePath;
153 };
154
155 extern CONST EFI_GUID* CONST mNorFlashVariableGuid;
156
157 EFI_STATUS
158 NorFlashReadCfiData (
159 IN UINTN DeviceBaseAddress,
160 IN UINTN CFI_Offset,
161 IN UINT32 NumberOfBytes,
162 OUT UINT32 *Data
163 );
164
165 EFI_STATUS
166 NorFlashWriteBuffer (
167 IN NOR_FLASH_INSTANCE *Instance,
168 IN UINTN TargetAddress,
169 IN UINTN BufferSizeInBytes,
170 IN UINT32 *Buffer
171 );
172
173 //
174 // BlockIO Protocol function EFI_BLOCK_IO_PROTOCOL.Reset
175 //
176 EFI_STATUS
177 EFIAPI
178 NorFlashBlockIoReset (
179 IN EFI_BLOCK_IO_PROTOCOL *This,
180 IN BOOLEAN ExtendedVerification
181 );
182
183 //
184 // BlockIO Protocol function EFI_BLOCK_IO_PROTOCOL.ReadBlocks
185 //
186 EFI_STATUS
187 EFIAPI
188 NorFlashBlockIoReadBlocks (
189 IN EFI_BLOCK_IO_PROTOCOL *This,
190 IN UINT32 MediaId,
191 IN EFI_LBA Lba,
192 IN UINTN BufferSizeInBytes,
193 OUT VOID *Buffer
194 );
195
196 //
197 // BlockIO Protocol function EFI_BLOCK_IO_PROTOCOL.WriteBlocks
198 //
199 EFI_STATUS
200 EFIAPI
201 NorFlashBlockIoWriteBlocks (
202 IN EFI_BLOCK_IO_PROTOCOL *This,
203 IN UINT32 MediaId,
204 IN EFI_LBA Lba,
205 IN UINTN BufferSizeInBytes,
206 IN VOID *Buffer
207 );
208
209 //
210 // BlockIO Protocol function EFI_BLOCK_IO_PROTOCOL.FlushBlocks
211 //
212 EFI_STATUS
213 EFIAPI
214 NorFlashBlockIoFlushBlocks (
215 IN EFI_BLOCK_IO_PROTOCOL *This
216 );
217
218 //
219 // DiskIO Protocol function EFI_DISK_IO_PROTOCOL.ReadDisk
220 //
221 EFI_STATUS
222 EFIAPI
223 NorFlashDiskIoReadDisk (
224 IN EFI_DISK_IO_PROTOCOL *This,
225 IN UINT32 MediaId,
226 IN UINT64 Offset,
227 IN UINTN BufferSize,
228 OUT VOID *Buffer
229 );
230
231 //
232 // DiskIO Protocol function EFI_DISK_IO_PROTOCOL.WriteDisk
233 //
234 EFI_STATUS
235 EFIAPI
236 NorFlashDiskIoWriteDisk (
237 IN EFI_DISK_IO_PROTOCOL *This,
238 IN UINT32 MediaId,
239 IN UINT64 Offset,
240 IN UINTN BufferSize,
241 IN VOID *Buffer
242 );
243
244 //
245 // NorFlashFvbDxe.c
246 //
247
248 EFI_STATUS
249 EFIAPI
250 NorFlashFvbInitialize (
251 IN NOR_FLASH_INSTANCE* Instance
252 );
253
254 EFI_STATUS
255 EFIAPI
256 FvbGetAttributes(
257 IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This,
258 OUT EFI_FVB_ATTRIBUTES_2 *Attributes
259 );
260
261 EFI_STATUS
262 EFIAPI
263 FvbSetAttributes(
264 IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This,
265 IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes
266 );
267
268 EFI_STATUS
269 EFIAPI
270 FvbGetPhysicalAddress(
271 IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This,
272 OUT EFI_PHYSICAL_ADDRESS *Address
273 );
274
275 EFI_STATUS
276 EFIAPI
277 FvbGetBlockSize(
278 IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This,
279 IN EFI_LBA Lba,
280 OUT UINTN *BlockSize,
281 OUT UINTN *NumberOfBlocks
282 );
283
284 EFI_STATUS
285 EFIAPI
286 FvbRead(
287 IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This,
288 IN EFI_LBA Lba,
289 IN UINTN Offset,
290 IN OUT UINTN *NumBytes,
291 IN OUT UINT8 *Buffer
292 );
293
294 EFI_STATUS
295 EFIAPI
296 FvbWrite(
297 IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This,
298 IN EFI_LBA Lba,
299 IN UINTN Offset,
300 IN OUT UINTN *NumBytes,
301 IN UINT8 *Buffer
302 );
303
304 EFI_STATUS
305 EFIAPI
306 FvbEraseBlocks(
307 IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This,
308 ...
309 );
310
311 //
312 // NorFlashDxe.c
313 //
314
315 EFI_STATUS
316 NorFlashUnlockAndEraseSingleBlock (
317 IN NOR_FLASH_INSTANCE *Instance,
318 IN UINTN BlockAddress
319 );
320
321 EFI_STATUS
322 NorFlashWriteSingleBlock (
323 IN NOR_FLASH_INSTANCE *Instance,
324 IN EFI_LBA Lba,
325 IN UINTN Offset,
326 IN OUT UINTN *NumBytes,
327 IN UINT8 *Buffer
328 );
329
330 EFI_STATUS
331 NorFlashWriteBlocks (
332 IN NOR_FLASH_INSTANCE *Instance,
333 IN EFI_LBA Lba,
334 IN UINTN BufferSizeInBytes,
335 IN VOID *Buffer
336 );
337
338 EFI_STATUS
339 NorFlashReadBlocks (
340 IN NOR_FLASH_INSTANCE *Instance,
341 IN EFI_LBA Lba,
342 IN UINTN BufferSizeInBytes,
343 OUT VOID *Buffer
344 );
345
346 EFI_STATUS
347 NorFlashRead (
348 IN NOR_FLASH_INSTANCE *Instance,
349 IN EFI_LBA Lba,
350 IN UINTN Offset,
351 IN UINTN BufferSizeInBytes,
352 OUT VOID *Buffer
353 );
354
355 EFI_STATUS
356 NorFlashWrite (
357 IN NOR_FLASH_INSTANCE *Instance,
358 IN EFI_LBA Lba,
359 IN UINTN Offset,
360 IN OUT UINTN *NumBytes,
361 IN UINT8 *Buffer
362 );
363
364 EFI_STATUS
365 NorFlashReset (
366 IN NOR_FLASH_INSTANCE *Instance
367 );
368
369 #endif /* __NOR_FLASH_DXE_H__ */