]> git.proxmox.com Git - mirror_edk2.git/blame - UefiCpuPkg/CpuFeatures/CpuFeaturesDxe.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / UefiCpuPkg / CpuFeatures / CpuFeaturesDxe.c
CommitLineData
80c4b236
JF
1/** @file\r
2 CPU Features DXE driver to initialize CPU features.\r
3\r
7367cc6c 4 Copyright (c) 2017 - 2018, Intel Corporation. All rights reserved.<BR>\r
0acd8697 5 SPDX-License-Identifier: BSD-2-Clause-Patent\r
80c4b236
JF
6\r
7**/\r
8\r
9#include <PiDxe.h>\r
10\r
11#include <Library/BaseLib.h>\r
12#include <Library/DebugLib.h>\r
13#include <Library/UefiLib.h>\r
14#include <Library/UefiBootServicesTableLib.h>\r
15#include <Library/RegisterCpuFeaturesLib.h>\r
bf5a306a 16#include <Library/HobLib.h>\r
80c4b236
JF
17\r
18#include <Protocol/SmmConfiguration.h>\r
19#include <Guid/CpuFeaturesInitDone.h>\r
20\r
80c4b236
JF
21/**\r
22 Worker function to perform CPU feature initialization.\r
23\r
24**/\r
25VOID\r
26CpuFeaturesInitializeWorker (\r
27 VOID\r
28 )\r
29{\r
053e878b
MK
30 EFI_STATUS Status;\r
31 EFI_HANDLE Handle;\r
80c4b236
JF
32\r
33 CpuFeaturesDetect ();\r
34\r
35 CpuFeaturesInitialize ();\r
36\r
37 //\r
38 // Install CPU Features Init Done Protocol\r
39 //\r
40 Handle = NULL;\r
41 Status = gBS->InstallProtocolInterface (\r
42 &Handle,\r
43 &gEdkiiCpuFeaturesInitDoneGuid,\r
44 EFI_NATIVE_INTERFACE,\r
45 NULL\r
46 );\r
47 ASSERT_EFI_ERROR (Status);\r
48}\r
49\r
50/**\r
51 Event notification that initialize CPU features when gEfiSmmConfigurationProtocol installs.\r
52\r
53 @param[in] Event The Event that is being processed, not used.\r
54 @param[in] Context Event Context, not used.\r
55**/\r
56VOID\r
57EFIAPI\r
58SmmConfigurationEventNotify (\r
053e878b
MK
59 IN EFI_EVENT Event,\r
60 IN VOID *Context\r
80c4b236
JF
61 )\r
62{\r
053e878b
MK
63 EFI_STATUS Status;\r
64 EFI_SMM_CONFIGURATION_PROTOCOL *SmmConfiguration;\r
80c4b236
JF
65\r
66 //\r
67 // Make sure this notification is for this handler\r
68 //\r
69 Status = gBS->LocateProtocol (&gEfiSmmConfigurationProtocolGuid, NULL, (VOID **)&SmmConfiguration);\r
70 if (EFI_ERROR (Status)) {\r
71 return;\r
72 }\r
73\r
74 CpuFeaturesInitializeWorker ();\r
75}\r
76\r
77/**\r
78 CPU Features driver entry point function.\r
79\r
80 If PcdCpuFeaturesInitAfterSmmRelocation is TRUE, it will register one\r
81 SMM Configuration Protocol notify function to perform CPU features\r
82 initialization. Otherwise, it will perform CPU features initialization\r
83 directly.\r
84\r
85 @param ImageHandle Image handle this driver.\r
86 @param SystemTable Pointer to the System Table.\r
87\r
88 @retval EFI_SUCCESS CPU Features is initialized successfully.\r
89**/\r
90EFI_STATUS\r
91EFIAPI\r
92CpuFeaturesDxeInitialize (\r
053e878b
MK
93 IN EFI_HANDLE ImageHandle,\r
94 IN EFI_SYSTEM_TABLE *SystemTable\r
80c4b236
JF
95 )\r
96{\r
97 VOID *Registration;\r
bf5a306a
ED
98 EFI_STATUS Status;\r
99 EFI_HANDLE Handle;\r
100\r
101 if (GetFirstGuidHob (&gEdkiiCpuFeaturesInitDoneGuid) != NULL) {\r
102 //\r
7367cc6c
LG
103 // Try to find HOB first. This HOB exist means CPU features have\r
104 // been initialized by CpuFeaturesPei driver, just install\r
bf5a306a
ED
105 // gEdkiiCpuFeaturesInitDoneGuid.\r
106 //\r
107 Handle = NULL;\r
108 Status = gBS->InstallProtocolInterface (\r
109 &Handle,\r
110 &gEdkiiCpuFeaturesInitDoneGuid,\r
111 EFI_NATIVE_INTERFACE,\r
112 NULL\r
113 );\r
114 ASSERT_EFI_ERROR (Status);\r
115 return Status;\r
116 }\r
80c4b236
JF
117\r
118 if (PcdGetBool (PcdCpuFeaturesInitAfterSmmRelocation)) {\r
119 //\r
120 // Install notification callback on SMM Configuration Protocol\r
121 //\r
122 EfiCreateProtocolNotifyEvent (\r
123 &gEfiSmmConfigurationProtocolGuid,\r
124 TPL_CALLBACK,\r
125 SmmConfigurationEventNotify,\r
126 NULL,\r
127 &Registration\r
128 );\r
129 } else {\r
130 CpuFeaturesInitializeWorker ();\r
131 }\r
132\r
133 return EFI_SUCCESS;\r
134}\r