1 /** @file
2 *
3 * Copyright (c) 2011-2015, ARM Limited. All rights reserved.
4 * Copyright (c) 2015, Hisilicon Limited. All rights reserved.
5 * Copyright (c) 2015, Linaro Limited. All rights reserved.
6 *
7 * This program and the accompanying materials
8 * are licensed and made available under the terms and conditions of the BSD License
9 * which accompanies this distribution. The full text of the license may be found at
10 * http://opensource.org/licenses/bsd-license.php
11 *
12 * THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
14 *
15 **/
16
17 #include "FlashFvbDxe.h"
18
19 //
20 // BlockIO Protocol function EFI_BLOCK_IO_PROTOCOL.ReadBlocks
21 //
22 EFI_STATUS
23 EFIAPI
FlashBlockIoReadBlocks(IN EFI_BLOCK_IO_PROTOCOL * This,IN UINT32 MediaId,IN EFI_LBA Lba,IN UINTN BufferSizeInBytes,OUT VOID * Buffer)24 FlashBlockIoReadBlocks (
25 IN EFI_BLOCK_IO_PROTOCOL* This,
26 IN UINT32 MediaId,
27 IN EFI_LBA Lba,
28 IN UINTN BufferSizeInBytes,
29 OUT VOID* Buffer
30 )
31 {
32 FLASH_INSTANCE* Instance;
33 EFI_STATUS Status;
34
35 Instance = INSTANCE_FROM_BLKIO_THIS(This);
36
37 DEBUG ((EFI_D_INFO, "FlashBlockIoReadBlocks(MediaId=0x%x, Lba=%ld, BufferSize=0x%x bytes (%d kB), BufferPtr @ 0x%08x)\n", MediaId, Lba, BufferSizeInBytes, Buffer));
38
39 if ( !This->Media->MediaPresent )
40 {
41 Status = EFI_NO_MEDIA;
42 }
43 else if ( This->Media->MediaId != MediaId )
44 {
45 Status = EFI_MEDIA_CHANGED;
46 }
47 else
48 {
49 Status = FlashReadBlocks (Instance, Lba, BufferSizeInBytes, Buffer);
50 }
51
52 return Status;
53 }
54
55 //
56 // BlockIO Protocol function EFI_BLOCK_IO_PROTOCOL.WriteBlocks
57 //
58 EFI_STATUS
59 EFIAPI
FlashBlockIoWriteBlocks(IN EFI_BLOCK_IO_PROTOCOL * This,IN UINT32 MediaId,IN EFI_LBA Lba,IN UINTN BufferSizeInBytes,IN VOID * Buffer)60 FlashBlockIoWriteBlocks (
61 IN EFI_BLOCK_IO_PROTOCOL* This,
62 IN UINT32 MediaId,
63 IN EFI_LBA Lba,
64 IN UINTN BufferSizeInBytes,
65 IN VOID* Buffer
66 )
67 {
68 FLASH_INSTANCE* Instance;
69 EFI_STATUS Status;
70
71 Instance = INSTANCE_FROM_BLKIO_THIS(This);
72
73 DEBUG ((EFI_D_INFO, "FlashBlockIoWriteBlocks(MediaId=0x%x, Lba=%ld, BufferSize=0x%x bytes (%d kB), BufferPtr @ 0x%08x)\n", MediaId, Lba, BufferSizeInBytes, Buffer));
74
75 if ( !This->Media->MediaPresent )
76 {
77 Status = EFI_NO_MEDIA;
78 }
79 else if ( This->Media->MediaId != MediaId )
80 {
81 Status = EFI_MEDIA_CHANGED;
82 }
83 else if ( This->Media->ReadOnly )
84 {
85 Status = EFI_WRITE_PROTECTED;
86 }
87 else
88 {
89 Status = FlashWriteBlocks (Instance, Lba, BufferSizeInBytes, Buffer);
90 }
91
92 return Status;
93 }
94
95 //
96 // BlockIO Protocol function EFI_BLOCK_IO_PROTOCOL.FlushBlocks
97 //
98 EFI_STATUS
99 EFIAPI
FlashBlockIoFlushBlocks(IN EFI_BLOCK_IO_PROTOCOL * This)100 FlashBlockIoFlushBlocks (
101 IN EFI_BLOCK_IO_PROTOCOL* This
102 )
103 {
104 // No Flush required for the NOR Flash driver
105 // because cache operations are not permitted.
106
107 // Nothing to do so just return without error
108 return EFI_SUCCESS;
109 }
110