]> git.proxmox.com Git - mirror_edk2.git/blob - IntelFrameworkModulePkg/Universal/FirmwareVolume/FwVolDxe/FwVolAttrib.c
IntelFrameworkModulePkg: Clean up source files
[mirror_edk2.git] / IntelFrameworkModulePkg / Universal / FirmwareVolume / FwVolDxe / FwVolAttrib.c
1 /** @file
2
3 Implements get/set firmware volume attributes.
4
5 Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
6
7 This program and the accompanying materials
8 are licensed and made available under the terms and conditions
9 of the BSD License which accompanies this distribution. The
10 full text of the license may be found at
11 http://opensource.org/licenses/bsd-license.php
12
13 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
14 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15
16 **/
17
18 #include "FwVolDriver.h"
19
20 /**
21 Retrieves attributes, insures positive polarity of attribute bits, returns
22 resulting attributes in output parameter.
23
24 @param This Calling context
25 @param Attributes output buffer which contains attributes
26
27 @retval EFI_SUCCESS Successfully got volume attributes
28
29 **/
30 EFI_STATUS
31 EFIAPI
32 FvGetVolumeAttributes (
33 IN CONST EFI_FIRMWARE_VOLUME2_PROTOCOL *This,
34 OUT EFI_FV_ATTRIBUTES *Attributes
35 )
36 {
37 EFI_STATUS Status;
38 FV_DEVICE *FvDevice;
39 EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *Fvb;
40 EFI_FVB_ATTRIBUTES_2 FvbAttributes;
41
42 FvDevice = FV_DEVICE_FROM_THIS (This);
43 Fvb = FvDevice->Fvb;
44
45 //
46 // First get the Firmware Volume Block Attributes
47 //
48 Status = Fvb->GetAttributes (Fvb, &FvbAttributes);
49 FvbAttributes &= 0xfffff0ff;
50
51 *Attributes = FvbAttributes;
52 *Attributes |= EFI_FV2_WRITE_POLICY_RELIABLE;
53 return Status;
54 }
55
56 /**
57 Sets current attributes for volume.
58
59 @param This Calling context
60 @param Attributes On input, FvAttributes is a pointer to
61 an EFI_FV_ATTRIBUTES containing the
62 desired firmware volume settings. On
63 successful return, it contains the new
64 settings of the firmware volume. On
65 unsuccessful return, FvAttributes is not
66 modified and the firmware volume
67 settings are not changed.
68
69 @retval EFI_SUCCESS The requested firmware volume attributes
70 were set and the resulting
71 EFI_FV_ATTRIBUTES is returned in
72 FvAttributes.
73 @retval EFI_ACCESS_DENIED Atrribute is locked down.
74 @retval EFI_INVALID_PARAMETER Atrribute is not valid.
75
76 **/
77 EFI_STATUS
78 EFIAPI
79 FvSetVolumeAttributes (
80 IN CONST EFI_FIRMWARE_VOLUME2_PROTOCOL *This,
81 IN OUT EFI_FV_ATTRIBUTES *Attributes
82 )
83 {
84 EFI_STATUS Status;
85 FV_DEVICE *FvDevice;
86 EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *Fvb;
87 EFI_FVB_ATTRIBUTES_2 OldFvbAttributes;
88 EFI_FVB_ATTRIBUTES_2 NewFvbAttributes;
89 UINT64 NewStatus;
90 UINT32 Capabilities;
91
92 FvDevice = FV_DEVICE_FROM_THIS (This);
93 Fvb = FvDevice->Fvb;
94
95 //
96 // First get the current Volume Attributes
97 //
98 Status = Fvb->GetAttributes (
99 Fvb,
100 &OldFvbAttributes
101 );
102
103 if ((OldFvbAttributes & EFI_FVB2_LOCK_STATUS) != 0) {
104 return EFI_ACCESS_DENIED;
105 }
106 //
107 // Only status attributes can be updated.
108 //
109 Capabilities = OldFvbAttributes & EFI_FVB2_CAPABILITIES;
110 NewStatus = (*Attributes) & EFI_FVB2_STATUS;
111
112 //
113 // Test read disable
114 //
115 if ((Capabilities & EFI_FVB2_READ_DISABLED_CAP) == 0) {
116 if ((NewStatus & EFI_FVB2_READ_STATUS) == 0) {
117 return EFI_INVALID_PARAMETER;
118 }
119 }
120 //
121 // Test read enable
122 //
123 if ((Capabilities & EFI_FVB2_READ_ENABLED_CAP) == 0) {
124 if ((NewStatus & EFI_FVB2_READ_STATUS) != 0) {
125 return EFI_INVALID_PARAMETER;
126 }
127 }
128 //
129 // Test write disable
130 //
131 if ((Capabilities & EFI_FVB2_WRITE_DISABLED_CAP) == 0) {
132 if ((NewStatus & EFI_FVB2_WRITE_STATUS) == 0) {
133 return EFI_INVALID_PARAMETER;
134 }
135 }
136 //
137 // Test write enable
138 //
139 if ((Capabilities & EFI_FVB2_WRITE_ENABLED_CAP) == 0) {
140 if ((NewStatus & EFI_FVB2_WRITE_STATUS) != 0) {
141 return EFI_INVALID_PARAMETER;
142 }
143 }
144 //
145 // Test lock
146 //
147 if ((Capabilities & EFI_FVB2_LOCK_CAP) == 0) {
148 if ((NewStatus & EFI_FVB2_LOCK_STATUS) != 0) {
149 return EFI_INVALID_PARAMETER;
150 }
151 }
152
153 NewFvbAttributes = OldFvbAttributes & (0xFFFFFFFF & (~EFI_FVB2_STATUS));
154 NewFvbAttributes |= NewStatus;
155 Status = Fvb->SetAttributes (
156 Fvb,
157 &NewFvbAttributes
158 );
159
160 if (EFI_ERROR (Status)) {
161 return Status;
162 }
163
164 *Attributes = 0;
165
166 This->GetVolumeAttributes (
167 This,
168 Attributes
169 );
170
171 return EFI_SUCCESS;
172 }
173
174 /**
175 Return information of type InformationType for the requested firmware
176 volume.
177
178 @param This Pointer to EFI_FIRMWARE_VOLUME2_PROTOCOL.
179 @param InformationType InformationType for requested.
180 @param BufferSize On input, size of Buffer.On output, the amount of
181 data returned in Buffer.
182 @param Buffer A poniter to the data buffer to return.
183
184 @return EFI_UNSUPPORTED Could not get.
185
186 **/
187 EFI_STATUS
188 EFIAPI
189 FvGetVolumeInfo (
190 IN CONST EFI_FIRMWARE_VOLUME2_PROTOCOL *This,
191 IN CONST EFI_GUID *InformationType,
192 IN OUT UINTN *BufferSize,
193 OUT VOID *Buffer
194 )
195 {
196 return EFI_UNSUPPORTED;
197 }
198
199 /**
200 Set information with InformationType into the requested firmware volume.
201
202 @param This Pointer to EFI_FIRMWARE_VOLUME2_PROTOCOL.
203 @param InformationType InformationType for requested.
204 @param BufferSize Size of Buffer data.
205 @param Buffer A poniter to the data buffer to be set.
206
207 @retval EFI_UNSUPPORTED Could not set.
208
209 **/
210 EFI_STATUS
211 EFIAPI
212 FvSetVolumeInfo (
213 IN CONST EFI_FIRMWARE_VOLUME2_PROTOCOL *This,
214 IN CONST EFI_GUID *InformationType,
215 IN UINTN BufferSize,
216 IN CONST VOID *Buffer
217 )
218 {
219 return EFI_UNSUPPORTED;
220 }