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