]> git.proxmox.com Git - mirror_edk2.git/blob - QuarkPlatformPkg/Platform/Dxe/SaveMemoryConfig/SaveMemoryConfig.c
QuarkPlatformPkg: Add new package for Galileo boards
[mirror_edk2.git] / QuarkPlatformPkg / Platform / Dxe / SaveMemoryConfig / SaveMemoryConfig.c
1 /** @file
2 This is the driver that locates the MemoryConfigurationData HOB, if it
3 exists, and saves the data to nvRAM.
4
5 Copyright (c) 2013-2015 Intel Corporation.
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 <Library/DebugLib.h>
18 #include <Library/HobLib.h>
19 #include <Library/MemoryAllocationLib.h>
20 #include <Library/UefiBootServicesTableLib.h>
21 #include <Library/UefiRuntimeServicesTableLib.h>
22 #include <Library/BaseMemoryLib.h>
23 #include <Library/UefiDriverEntryPoint.h>
24
25 #include <Guid/MemoryConfigData.h>
26 #include <Guid/DebugMask.h>
27
28 EFI_STATUS
29 EFIAPI
30 SaveMemoryConfigEntryPoint (
31 IN EFI_HANDLE ImageHandle,
32 IN EFI_SYSTEM_TABLE *SystemTable
33 )
34 /*++
35
36 Routine Description:
37 This is the standard EFI driver point that detects whether there is a
38 MemoryConfigurationData HOB and, if so, saves its data to nvRAM.
39
40 Arguments:
41 ImageHandle - Handle for the image of this driver
42 SystemTable - Pointer to the EFI System Table
43
44 Returns:
45 EFI_SUCCESS - if the data is successfully saved or there was no data
46 EFI_NOT_FOUND - if the HOB list could not be located.
47 EFI_UNLOAD_IMAGE - It is not success
48
49 --*/
50 {
51 EFI_STATUS Status;
52 VOID *HobList;
53 EFI_HOB_GUID_TYPE *GuidHob;
54 VOID *HobData;
55 VOID *VariableData;
56 UINTN DataSize;
57 UINTN BufferSize;
58
59 DataSize = 0;
60 VariableData = NULL;
61 GuidHob = NULL;
62 HobList = NULL;
63 HobData = NULL;
64 Status = EFI_UNSUPPORTED;
65
66 //
67 // Get the HOB list. If it is not present, then ASSERT.
68 //
69 HobList = GetHobList ();
70 ASSERT (HobList != NULL);
71
72 //
73 // Search for the Memory Configuration GUID HOB. If it is not present, then
74 // there's nothing we can do. It may not exist on the update path.
75 //
76 GuidHob = GetNextGuidHob (&gEfiMemoryConfigDataGuid, HobList);
77 if (GuidHob != NULL) {
78 HobData = GET_GUID_HOB_DATA (GuidHob);
79 DataSize = GET_GUID_HOB_DATA_SIZE (GuidHob);
80 //
81 // Use the HOB to save Memory Configuration Data
82 //
83 BufferSize = DataSize;
84 VariableData = AllocatePool (BufferSize);
85 ASSERT (VariableData != NULL);
86 Status = gRT->GetVariable (
87 EFI_MEMORY_CONFIG_DATA_NAME,
88 &gEfiMemoryConfigDataGuid,
89 NULL,
90 &BufferSize,
91 VariableData
92 );
93 if (Status == EFI_BUFFER_TOO_SMALL) {
94 gBS->FreePool (VariableData);
95 VariableData = AllocatePool (BufferSize);
96 ASSERT (VariableData != NULL);
97 Status = gRT->GetVariable (
98 EFI_MEMORY_CONFIG_DATA_NAME,
99 &gEfiMemoryConfigDataGuid,
100 NULL,
101 &BufferSize,
102 VariableData
103 );
104 }
105
106 if (EFI_ERROR(Status) || BufferSize != DataSize || CompareMem (HobData, VariableData, DataSize) != 0) {
107 Status = gRT->SetVariable (
108 EFI_MEMORY_CONFIG_DATA_NAME,
109 &gEfiMemoryConfigDataGuid,
110 (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS),
111 DataSize,
112 HobData
113 );
114 ASSERT((Status == EFI_SUCCESS) || (Status == EFI_OUT_OF_RESOURCES));
115 }
116
117 gBS->FreePool (VariableData);
118 }
119
120 //
121 // This driver does not produce any protocol services, so always unload it.
122 //
123 return Status;
124 }