]> git.proxmox.com Git - mirror_edk2.git/blob - Vlv2TbltDevicePkg/PlatformInfoDxe/PlatformInfoDxe.c
Vlv2TbltDevicePkg:Signal EndOfDxe Event.
[mirror_edk2.git] / Vlv2TbltDevicePkg / PlatformInfoDxe / PlatformInfoDxe.c
1 /** @file
2
3 Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>
4
5 This program and the accompanying materials are licensed and made available under
6 the terms and conditions of the BSD License that accompanies this distribution.
7 The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php.
9
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.
12
13
14 Module Name:
15
16 PlatformInfoDxe.c
17
18 Abstract:
19 Platform Info driver to public platform related HOB data
20
21 --*/
22
23 #include "PlatformInfoDxe.h"
24
25 /**
26 Entry point for the driver.
27
28 This routine get the platform HOB data from PEI and publish
29 as Platform Info variable that can be accessed during boot service and
30 runtime.
31
32 @param ImageHandle Image Handle.
33 @param SystemTable EFI System Table.
34
35 @retval Status Function execution status.
36
37 **/
38 EFI_STATUS
39 EFIAPI
40 PlatformInfoInit (
41 IN EFI_HANDLE ImageHandle,
42 IN EFI_SYSTEM_TABLE *SystemTable
43 )
44 {
45 EFI_STATUS Status;
46 EFI_PLATFORM_INFO_HOB *PlatformInfoHobPtr;
47 EFI_PEI_HOB_POINTERS GuidHob;
48 EFI_PLATFORM_INFO_HOB TmpHob;
49 UINTN VarSize;
50 EFI_OS_SELECTION_HOB *OsSlectionHobPtr;
51 UINT8 Selection;
52 SYSTEM_CONFIGURATION SystemConfiguration;
53 UINT8 *LpssDataHobPtr;
54 UINT8 *LpssDataVarPtr;
55 UINTN i;
56
57 VarSize = sizeof(SYSTEM_CONFIGURATION);
58 Status = gRT->GetVariable(
59 NORMAL_SETUP_NAME,
60 &gEfiNormalSetupGuid,
61 NULL,
62 &VarSize,
63 &SystemConfiguration
64 );
65
66 if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) {
67 //The setup variable is corrupted
68 VarSize = sizeof(SYSTEM_CONFIGURATION);
69 Status = gRT->GetVariable(
70 L"SetupRecovery",
71 &gEfiNormalSetupGuid,
72 NULL,
73 &VarSize,
74 &SystemConfiguration
75 );
76 ASSERT_EFI_ERROR (Status);
77 }
78
79 VarSize = sizeof(Selection);
80 Status = gRT->GetVariable(
81 L"OsSelection",
82 &gOsSelectionVariableGuid,
83 NULL,
84 &VarSize,
85 &Selection
86 );
87
88 if (EFI_ERROR(Status)) {
89 Selection = SystemConfiguration.ReservedO;
90 Status = gRT->SetVariable (
91 L"OsSelection",
92 &gOsSelectionVariableGuid,
93 EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
94 sizeof(Selection),
95 &Selection
96 );
97 }
98
99 GuidHob.Raw = GetHobList ();
100 if (GuidHob.Raw != NULL) {
101 if ((GuidHob.Raw = GetNextGuidHob (&gOsSelectionVariableGuid, GuidHob.Raw)) != NULL) {
102 OsSlectionHobPtr = GET_GUID_HOB_DATA (GuidHob.Guid);
103
104 if (OsSlectionHobPtr->OsSelectionChanged) {
105 SystemConfiguration.ReservedO = OsSlectionHobPtr->OsSelection;
106
107 //
108 // Load Audio default configuration
109 //
110 SystemConfiguration.Lpe = OsSlectionHobPtr->Lpe;
111 SystemConfiguration.PchAzalia = OsSlectionHobPtr->PchAzalia;
112
113 //
114 // Load LPSS and SCC default configurations
115 //
116 LpssDataHobPtr = &OsSlectionHobPtr->LpssData.LpssPciModeEnabled;
117 LpssDataVarPtr = &SystemConfiguration.LpssPciModeEnabled;
118 for (i = 0; i < sizeof(EFI_PLATFORM_LPSS_DATA); i++) {
119 *LpssDataVarPtr = *LpssDataHobPtr;
120 LpssDataVarPtr++;
121 LpssDataHobPtr++;
122 }
123
124 SystemConfiguration.GOPEnable = TRUE;
125
126 Status = gRT->SetVariable (
127 NORMAL_SETUP_NAME,
128 &gEfiNormalSetupGuid,
129 EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,
130 sizeof(SYSTEM_CONFIGURATION),
131 &SystemConfiguration
132 );
133 ASSERT_EFI_ERROR (Status);
134 }
135 }
136 }
137
138 GuidHob.Raw = GetHobList ();
139 if (GuidHob.Raw == NULL) {
140 return EFI_NOT_FOUND;
141 }
142
143 if ((GuidHob.Raw = GetNextGuidHob (&gEfiPlatformInfoGuid, GuidHob.Raw)) != NULL) {
144 PlatformInfoHobPtr = GET_GUID_HOB_DATA (GuidHob.Guid);
145 VarSize = sizeof(EFI_PLATFORM_INFO_HOB);
146 Status = gRT->GetVariable(
147 L"PlatformInfo",
148 &gEfiVlv2VariableGuid,
149 NULL,
150 &VarSize,
151 &TmpHob
152 );
153
154 if (EFI_ERROR(Status) || CompareMem (&TmpHob, PlatformInfoHobPtr, VarSize)) {
155
156 //
157 // Write the Platform Info to volatile memory
158 //
159 Status = gRT->SetVariable(
160 L"PlatformInfo",
161 &gEfiVlv2VariableGuid,
162 EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,
163 sizeof(EFI_PLATFORM_INFO_HOB),
164 PlatformInfoHobPtr
165 );
166 if (EFI_ERROR(Status)) {
167 return Status;
168 }
169 }
170 }
171
172 return EFI_SUCCESS;
173 }
174