#include <Library/MemoryAllocationLib.h>\r
#include <Library/SynchronizationLib.h>\r
#include <Library/IoLib.h>\r
+#include <Library/LocalApicLib.h>\r
\r
#include <AcpiCpuData.h>\r
\r
CPU_FEATURE_INITIALIZE InitializeFunc;\r
UINT8 *BeforeFeatureBitMask;\r
UINT8 *AfterFeatureBitMask;\r
+ UINT8 *CoreBeforeFeatureBitMask;\r
+ UINT8 *CoreAfterFeatureBitMask;\r
+ UINT8 *PackageBeforeFeatureBitMask;\r
+ UINT8 *PackageAfterFeatureBitMask;\r
VOID *ConfigData;\r
BOOLEAN BeforeAll;\r
BOOLEAN AfterAll;\r
} CPU_FEATURES_ENTRY;\r
\r
+//\r
+// Flags used when program the register.\r
+//\r
+typedef struct {\r
+ volatile UINTN ConsoleLogLock; // Spinlock used to control console.\r
+ volatile UINTN MemoryMappedLock; // Spinlock used to program mmio\r
+ volatile UINT32 *SemaphoreCount; // Semaphore used to program semaphore.\r
+} PROGRAM_CPU_REGISTER_FLAGS;\r
+\r
typedef struct {\r
UINTN FeaturesCount;\r
UINT32 BitMaskSize;\r
- SPIN_LOCK MsrLock;\r
- SPIN_LOCK MemoryMappedLock;\r
LIST_ENTRY FeatureList;\r
\r
CPU_FEATURES_INIT_ORDER *InitOrder;\r
UINT8 *ConfigurationPcd;\r
UINT8 *SettingPcd;\r
\r
+ UINT32 NumberOfCpus;\r
+ ACPI_CPU_DATA *AcpiCpuData;\r
+\r
CPU_REGISTER_TABLE *RegisterTable;\r
CPU_REGISTER_TABLE *PreSmmRegisterTable;\r
UINTN BspNumber;\r
+\r
+ PROGRAM_CPU_REGISTER_FLAGS CpuFlags;\r
} CPU_FEATURES_DATA;\r
\r
#define CPU_FEATURE_ENTRY_FROM_LINK(a) \\r
\r
@param[in] Procedure A pointer to the function to be run on\r
enabled APs of the system.\r
+ @param[in] MpEvent A pointer to the event to be used later\r
+ to check whether procedure has done.\r
**/\r
VOID\r
StartupAPsWorker (\r
- IN EFI_AP_PROCEDURE Procedure\r
+ IN EFI_AP_PROCEDURE Procedure,\r
+ IN EFI_EVENT MpEvent\r
);\r
\r
/**\r
IN CPU_FEATURES_ENTRY *CpuFeature\r
);\r
\r
+/**\r
+ Return feature dependence result.\r
+\r
+ @param[in] CpuFeature Pointer to CPU feature.\r
+ @param[in] Before Check before dependence or after.\r
+\r
+ @retval return the dependence result.\r
+**/\r
+CPU_FEATURE_DEPENDENCE_TYPE\r
+DetectFeatureScope (\r
+ IN CPU_FEATURES_ENTRY *CpuFeature,\r
+ IN BOOLEAN Before\r
+ );\r
+\r
+/**\r
+ Programs registers for the calling processor.\r
+\r
+ @param[in,out] Buffer The pointer to private data buffer.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+SetProcessorRegister (\r
+ IN OUT VOID *Buffer\r
+ );\r
+\r
+/**\r
+ Return ACPI_CPU_DATA data.\r
+\r
+ @return Pointer to ACPI_CPU_DATA data.\r
+**/\r
+ACPI_CPU_DATA *\r
+GetAcpiCpuData (\r
+ VOID\r
+ );\r
+\r
#endif\r