1 /** @file NorFlashDxe.h
3 Copyright (c) 2011-2012, ARM Ltd. All rights reserved.<BR>
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
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.
15 #ifndef __NOR_FLASH_DXE_H__
16 #define __NOR_FLASH_DXE_H__
22 #include <Protocol/BlockIo.h>
23 #include <Protocol/FirmwareVolumeBlock.h>
25 #include <Library/DebugLib.h>
26 #include <Library/IoLib.h>
27 #include <Library/NorFlashPlatformLib.h>
28 #include <Library/UefiLib.h>
30 #define NOR_FLASH_ERASE_RETRY 10
32 // Device access macros
33 // These are necessary because we use 2 x 16bit parts to make up 32bit data
35 #define HIGH_16_BITS 0xFFFF0000
36 #define LOW_16_BITS 0x0000FFFF
37 #define LOW_8_BITS 0x000000FF
39 #define FOLD_32BIT_INTO_16BIT(value) ( ( value >> 16 ) | ( value & LOW_16_BITS ) )
41 #define GET_LOW_BYTE(value) ( value & LOW_8_BITS )
42 #define GET_HIGH_BYTE(value) ( GET_LOW_BYTE( value >> 16 ) )
44 // Each command must be sent simultaneously to both chips,
45 // i.e. at the lower 16 bits AND at the higher 16 bits
46 #define CREATE_NOR_ADDRESS(BaseAddr,OffsetAddr) ((BaseAddr) + ((OffsetAddr) << 2))
47 #define CREATE_DUAL_CMD(Cmd) ( ( Cmd << 16) | ( Cmd & LOW_16_BITS) )
48 #define SEND_NOR_COMMAND(BaseAddr,Offset,Cmd) MmioWrite32 (CREATE_NOR_ADDRESS(BaseAddr,Offset), CREATE_DUAL_CMD(Cmd))
49 #define GET_NOR_BLOCK_ADDRESS(BaseAddr,Lba,LbaSize)( BaseAddr + (UINTN)((Lba) * LbaSize) )
51 // Status Register Bits
52 #define P30_SR_BIT_WRITE (BIT7 << 16 | BIT7)
53 #define P30_SR_BIT_ERASE_SUSPEND (BIT6 << 16 | BIT6)
54 #define P30_SR_BIT_ERASE (BIT5 << 16 | BIT5)
55 #define P30_SR_BIT_PROGRAM (BIT4 << 16 | BIT4)
56 #define P30_SR_BIT_VPP (BIT3 << 16 | BIT3)
57 #define P30_SR_BIT_PROGRAM_SUSPEND (BIT2 << 16 | BIT2)
58 #define P30_SR_BIT_BLOCK_LOCKED (BIT1 << 16 | BIT1)
59 #define P30_SR_BIT_BEFP (BIT0 << 16 | BIT0)
61 // Device Commands for Intel StrataFlash(R) Embedded Memory (P30) Family
63 // On chip buffer size for buffered programming operations
64 // There are 2 chips, each chip can buffer up to 32 (16-bit)words, and each word is 2 bytes.
65 // Therefore the total size of the buffer is 2 x 32 x 2 = 128 bytes
66 #define P30_MAX_BUFFER_SIZE_IN_BYTES ((UINTN)128)
67 #define P30_MAX_BUFFER_SIZE_IN_WORDS (P30_MAX_BUFFER_SIZE_IN_BYTES/((UINTN)4))
68 #define MAX_BUFFERED_PROG_ITERATIONS 10000000
69 #define BOUNDARY_OF_32_WORDS 0x7F
72 #define P30_CFI_ADDR_QUERY_UNIQUE_QRY 0x10
73 #define P30_CFI_ADDR_VENDOR_ID 0x13
76 #define CFI_QRY 0x00595251
79 #define P30_CMD_READ_DEVICE_ID 0x0090
80 #define P30_CMD_READ_STATUS_REGISTER 0x0070
81 #define P30_CMD_CLEAR_STATUS_REGISTER 0x0050
82 #define P30_CMD_READ_ARRAY 0x00FF
83 #define P30_CMD_READ_CFI_QUERY 0x0098
86 #define P30_CMD_WORD_PROGRAM_SETUP 0x0040
87 #define P30_CMD_ALTERNATE_WORD_PROGRAM_SETUP 0x0010
88 #define P30_CMD_BUFFERED_PROGRAM_SETUP 0x00E8
89 #define P30_CMD_BUFFERED_PROGRAM_CONFIRM 0x00D0
90 #define P30_CMD_BEFP_SETUP 0x0080
91 #define P30_CMD_BEFP_CONFIRM 0x00D0
94 #define P30_CMD_BLOCK_ERASE_SETUP 0x0020
95 #define P30_CMD_BLOCK_ERASE_CONFIRM 0x00D0
98 #define P30_CMD_PROGRAM_OR_ERASE_SUSPEND 0x00B0
99 #define P30_CMD_SUSPEND_RESUME 0x00D0
101 // BLOCK LOCKING / UNLOCKING Commands
102 #define P30_CMD_LOCK_BLOCK_SETUP 0x0060
103 #define P30_CMD_LOCK_BLOCK 0x0001
104 #define P30_CMD_UNLOCK_BLOCK 0x00D0
105 #define P30_CMD_LOCK_DOWN_BLOCK 0x002F
107 // PROTECTION Commands
108 #define P30_CMD_PROGRAM_PROTECTION_REGISTER_SETUP 0x00C0
110 // CONFIGURATION Commands
111 #define P30_CMD_READ_CONFIGURATION_REGISTER_SETUP 0x0060
112 #define P30_CMD_READ_CONFIGURATION_REGISTER 0x0003
114 #define NOR_FLASH_SIGNATURE SIGNATURE_32('n', 'o', 'r', '0')
115 #define INSTANCE_FROM_FVB_THIS(a) CR(a, NOR_FLASH_INSTANCE, FvbProtocol, NOR_FLASH_SIGNATURE)
116 #define INSTANCE_FROM_BLKIO_THIS(a) CR(a, NOR_FLASH_INSTANCE, BlockIoProtocol, NOR_FLASH_SIGNATURE)
118 typedef struct _NOR_FLASH_INSTANCE NOR_FLASH_INSTANCE
;
120 typedef EFI_STATUS (*NOR_FLASH_INITIALIZE
) (NOR_FLASH_INSTANCE
* Instance
);
123 VENDOR_DEVICE_PATH Vendor
;
124 EFI_DEVICE_PATH_PROTOCOL End
;
125 } NOR_FLASH_DEVICE_PATH
;
127 struct _NOR_FLASH_INSTANCE
{
132 NOR_FLASH_INITIALIZE Initialize
;
134 UINTN DeviceBaseAddress
;
135 UINTN RegionBaseAddress
;
139 EFI_BLOCK_IO_PROTOCOL BlockIoProtocol
;
140 EFI_BLOCK_IO_MEDIA Media
;
143 EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL FvbProtocol
;
145 NOR_FLASH_DEVICE_PATH DevicePath
;
149 NorFlashReadCfiData (
150 IN UINTN DeviceBaseAddress
,
152 IN UINT32 NumberOfBytes
,
157 NorFlashWriteBuffer (
158 IN NOR_FLASH_INSTANCE
*Instance
,
159 IN UINTN TargetAddress
,
160 IN UINTN BufferSizeInBytes
,
165 // BlockIO Protocol function EFI_BLOCK_IO_PROTOCOL.Reset
169 NorFlashBlockIoReset (
170 IN EFI_BLOCK_IO_PROTOCOL
*This
,
171 IN BOOLEAN ExtendedVerification
175 // BlockIO Protocol function EFI_BLOCK_IO_PROTOCOL.ReadBlocks
179 NorFlashBlockIoReadBlocks (
180 IN EFI_BLOCK_IO_PROTOCOL
*This
,
183 IN UINTN BufferSizeInBytes
,
188 // BlockIO Protocol function EFI_BLOCK_IO_PROTOCOL.WriteBlocks
192 NorFlashBlockIoWriteBlocks (
193 IN EFI_BLOCK_IO_PROTOCOL
*This
,
196 IN UINTN BufferSizeInBytes
,
201 // BlockIO Protocol function EFI_BLOCK_IO_PROTOCOL.FlushBlocks
205 NorFlashBlockIoFlushBlocks (
206 IN EFI_BLOCK_IO_PROTOCOL
*This
216 NorFlashFvbInitialize (
217 IN NOR_FLASH_INSTANCE
* Instance
223 IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL
*This
,
224 OUT EFI_FVB_ATTRIBUTES_2
*Attributes
230 IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL
*This
,
231 IN OUT EFI_FVB_ATTRIBUTES_2
*Attributes
236 FvbGetPhysicalAddress(
237 IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL
*This
,
238 OUT EFI_PHYSICAL_ADDRESS
*Address
244 IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL
*This
,
246 OUT UINTN
*BlockSize
,
247 OUT UINTN
*NumberOfBlocks
253 IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL
*This
,
256 IN OUT UINTN
*NumBytes
,
263 IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL
*This
,
266 IN OUT UINTN
*NumBytes
,
273 IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL
*This
,
282 NorFlashUnlockAndEraseSingleBlock (
283 IN NOR_FLASH_INSTANCE
*Instance
,
284 IN UINTN BlockAddress
288 NorFlashWriteSingleBlock (
289 IN NOR_FLASH_INSTANCE
*Instance
,
291 IN UINT32
*DataBuffer
,
292 IN UINT32 BlockSizeInWords
296 NorFlashWriteBlocks (
297 IN NOR_FLASH_INSTANCE
*Instance
,
299 IN UINTN BufferSizeInBytes
,
305 IN NOR_FLASH_INSTANCE
*Instance
,
307 IN UINTN BufferSizeInBytes
,
313 IN NOR_FLASH_INSTANCE
*Instance
316 #endif /* __NOR_FLASH_DXE_H__ */