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