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