ArmPlatformPkg/NorFlashDxe: prepare for devicepath format change
[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 #pragma pack (1)
126 typedef struct {
127 VENDOR_DEVICE_PATH Vendor;
128 EFI_DEVICE_PATH_PROTOCOL End;
129 } NOR_FLASH_DEVICE_PATH;
130 #pragma pack ()
131
132 struct _NOR_FLASH_INSTANCE {
133 UINT32 Signature;
134 EFI_HANDLE Handle;
135
136 UINTN DeviceBaseAddress;
137 UINTN RegionBaseAddress;
138 UINTN Size;
139 EFI_LBA StartLba;
140
141 EFI_BLOCK_IO_PROTOCOL BlockIoProtocol;
142 EFI_BLOCK_IO_MEDIA Media;
143 EFI_DISK_IO_PROTOCOL DiskIoProtocol;
144
145 EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL FvbProtocol;
146 VOID* ShadowBuffer;
147
148 NOR_FLASH_DEVICE_PATH DevicePath;
149 };
150
151 EFI_STATUS
152 NorFlashReadCfiData (
153 IN UINTN DeviceBaseAddress,
154 IN UINTN CFI_Offset,
155 IN UINT32 NumberOfBytes,
156 OUT UINT32 *Data
157 );
158
159 EFI_STATUS
160 NorFlashWriteBuffer (
161 IN NOR_FLASH_INSTANCE *Instance,
162 IN UINTN TargetAddress,
163 IN UINTN BufferSizeInBytes,
164 IN UINT32 *Buffer
165 );
166
167 //
168 // BlockIO Protocol function EFI_BLOCK_IO_PROTOCOL.Reset
169 //
170 EFI_STATUS
171 EFIAPI
172 NorFlashBlockIoReset (
173 IN EFI_BLOCK_IO_PROTOCOL *This,
174 IN BOOLEAN ExtendedVerification
175 );
176
177 //
178 // BlockIO Protocol function EFI_BLOCK_IO_PROTOCOL.ReadBlocks
179 //
180 EFI_STATUS
181 EFIAPI
182 NorFlashBlockIoReadBlocks (
183 IN EFI_BLOCK_IO_PROTOCOL *This,
184 IN UINT32 MediaId,
185 IN EFI_LBA Lba,
186 IN UINTN BufferSizeInBytes,
187 OUT VOID *Buffer
188 );
189
190 //
191 // BlockIO Protocol function EFI_BLOCK_IO_PROTOCOL.WriteBlocks
192 //
193 EFI_STATUS
194 EFIAPI
195 NorFlashBlockIoWriteBlocks (
196 IN EFI_BLOCK_IO_PROTOCOL *This,
197 IN UINT32 MediaId,
198 IN EFI_LBA Lba,
199 IN UINTN BufferSizeInBytes,
200 IN VOID *Buffer
201 );
202
203 //
204 // BlockIO Protocol function EFI_BLOCK_IO_PROTOCOL.FlushBlocks
205 //
206 EFI_STATUS
207 EFIAPI
208 NorFlashBlockIoFlushBlocks (
209 IN EFI_BLOCK_IO_PROTOCOL *This
210 );
211
212 //
213 // DiskIO Protocol function EFI_DISK_IO_PROTOCOL.ReadDisk
214 //
215 EFI_STATUS
216 EFIAPI
217 NorFlashDiskIoReadDisk (
218 IN EFI_DISK_IO_PROTOCOL *This,
219 IN UINT32 MediaId,
220 IN UINT64 Offset,
221 IN UINTN BufferSize,
222 OUT VOID *Buffer
223 );
224
225 //
226 // DiskIO Protocol function EFI_DISK_IO_PROTOCOL.WriteDisk
227 //
228 EFI_STATUS
229 EFIAPI
230 NorFlashDiskIoWriteDisk (
231 IN EFI_DISK_IO_PROTOCOL *This,
232 IN UINT32 MediaId,
233 IN UINT64 Offset,
234 IN UINTN BufferSize,
235 IN VOID *Buffer
236 );
237
238 //
239 // NorFlashFvbDxe.c
240 //
241
242 EFI_STATUS
243 EFIAPI
244 NorFlashFvbInitialize (
245 IN NOR_FLASH_INSTANCE* Instance
246 );
247
248 EFI_STATUS
249 EFIAPI
250 FvbGetAttributes(
251 IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This,
252 OUT EFI_FVB_ATTRIBUTES_2 *Attributes
253 );
254
255 EFI_STATUS
256 EFIAPI
257 FvbSetAttributes(
258 IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This,
259 IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes
260 );
261
262 EFI_STATUS
263 EFIAPI
264 FvbGetPhysicalAddress(
265 IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This,
266 OUT EFI_PHYSICAL_ADDRESS *Address
267 );
268
269 EFI_STATUS
270 EFIAPI
271 FvbGetBlockSize(
272 IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This,
273 IN EFI_LBA Lba,
274 OUT UINTN *BlockSize,
275 OUT UINTN *NumberOfBlocks
276 );
277
278 EFI_STATUS
279 EFIAPI
280 FvbRead(
281 IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This,
282 IN EFI_LBA Lba,
283 IN UINTN Offset,
284 IN OUT UINTN *NumBytes,
285 IN OUT UINT8 *Buffer
286 );
287
288 EFI_STATUS
289 EFIAPI
290 FvbWrite(
291 IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This,
292 IN EFI_LBA Lba,
293 IN UINTN Offset,
294 IN OUT UINTN *NumBytes,
295 IN UINT8 *Buffer
296 );
297
298 EFI_STATUS
299 EFIAPI
300 FvbEraseBlocks(
301 IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This,
302 ...
303 );
304
305 //
306 // NorFlashDxe.c
307 //
308
309 EFI_STATUS
310 NorFlashUnlockAndEraseSingleBlock (
311 IN NOR_FLASH_INSTANCE *Instance,
312 IN UINTN BlockAddress
313 );
314
315 EFI_STATUS
316 NorFlashWriteSingleBlock (
317 IN NOR_FLASH_INSTANCE *Instance,
318 IN EFI_LBA Lba,
319 IN UINTN Offset,
320 IN OUT UINTN *NumBytes,
321 IN UINT8 *Buffer
322 );
323
324 EFI_STATUS
325 NorFlashWriteBlocks (
326 IN NOR_FLASH_INSTANCE *Instance,
327 IN EFI_LBA Lba,
328 IN UINTN BufferSizeInBytes,
329 IN VOID *Buffer
330 );
331
332 EFI_STATUS
333 NorFlashReadBlocks (
334 IN NOR_FLASH_INSTANCE *Instance,
335 IN EFI_LBA Lba,
336 IN UINTN BufferSizeInBytes,
337 OUT VOID *Buffer
338 );
339
340 EFI_STATUS
341 NorFlashRead (
342 IN NOR_FLASH_INSTANCE *Instance,
343 IN EFI_LBA Lba,
344 IN UINTN Offset,
345 IN UINTN BufferSizeInBytes,
346 OUT VOID *Buffer
347 );
348
349 EFI_STATUS
350 NorFlashWrite (
351 IN NOR_FLASH_INSTANCE *Instance,
352 IN EFI_LBA Lba,
353 IN UINTN Offset,
354 IN OUT UINTN *NumBytes,
355 IN UINT8 *Buffer
356 );
357
358 EFI_STATUS
359 NorFlashReset (
360 IN NOR_FLASH_INSTANCE *Instance
361 );
362
363 #endif /* __NOR_FLASH_DXE_H__ */