-/** @file
- CPU Register Table Library definitions.
-
- Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
- This program and the accompanying materials
- are licensed and made available under the terms and conditions of the BSD License
- which accompanies this distribution. The full text of the license may be found at
- http://opensource.org/licenses/bsd-license.php
-
- THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
- WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#ifndef _REGISTER_CPU_FEATURES_H_
-#define _REGISTER_CPU_FEATURES_H_
-
-#include <Library/BaseLib.h>
-#include <Library/DebugLib.h>
-#include <Library/PcdLib.h>
-#include <Library/RegisterCpuFeaturesLib.h>
-#include <Library/BaseMemoryLib.h>
-#include <Library/MemoryAllocationLib.h>
-#include <Library/SynchronizationLib.h>
-#include <Library/IoLib.h>
-
-#include <AcpiCpuData.h>
-
-#define CPU_FEATURE_ENTRY_SIGNATURE SIGNATURE_32 ('C', 'F', 'E', 'S')
-
-#define CPU_FEATURE_NAME_SIZE 128
-
-typedef struct {
- REGISTER_CPU_FEATURE_INFORMATION CpuInfo;
- UINT8 *FeaturesSupportedMask;
- LIST_ENTRY OrderList;
-} CPU_FEATURES_INIT_ORDER;
-
-typedef struct {
- UINT32 Signature;
- LIST_ENTRY Link;
- UINT8 *FeatureMask;
- CHAR8 *FeatureName;
- CPU_FEATURE_GET_CONFIG_DATA GetConfigDataFunc;
- CPU_FEATURE_SUPPORT SupportFunc;
- CPU_FEATURE_INITIALIZE InitializeFunc;
- UINT8 *BeforeFeatureBitMask;
- UINT8 *AfterFeatureBitMask;
- VOID *ConfigData;
- BOOLEAN BeforeAll;
- BOOLEAN AfterAll;
-} CPU_FEATURES_ENTRY;
-
-typedef struct {
- UINTN FeaturesCount;
- UINT32 BitMaskSize;
- SPIN_LOCK MsrLock;
- SPIN_LOCK MemoryMappedLock;
- LIST_ENTRY FeatureList;
-
- CPU_FEATURES_INIT_ORDER *InitOrder;
- UINT8 *SupportPcds;
- UINT8 *CapabilityPcds;
- UINT8 *ConfigurationPcds;
- UINT8 *SettingPcds;
-
- CPU_REGISTER_TABLE *RegisterTable;
- CPU_REGISTER_TABLE *PreSmmRegisterTable;
- UINTN BspNumber;
-} CPU_FEATURES_DATA;
-
-#define CPU_FEATURE_ENTRY_FROM_LINK(a) \
- CR ( \
- (a), \
- CPU_FEATURES_ENTRY, \
- Link, \
- CPU_FEATURE_ENTRY_SIGNATURE \
- )
-
-/**
- Worker function to get CPU_FEATURES_DATA pointer.
-
- @return Pointer to CPU_FEATURES_DATA.
-**/
-CPU_FEATURES_DATA *
-GetCpuFeaturesData (
- VOID
- );
-
-/**
- Enlarges CPU register table for each processor.
-
- @param[in, out] RegisterTable Pointer processor's CPU register table
-**/
-VOID
-EnlargeRegisterTable (
- IN OUT CPU_REGISTER_TABLE *RegisterTable
- );
-
-/**
- Allocates ACPI NVS memory to save ACPI_CPU_DATA.
-
- @return Pointer to allocated ACPI_CPU_DATA.
-**/
-ACPI_CPU_DATA *
-AllocateAcpiCpuData (
- VOID
- );
-
-/**
- Worker function to return processor index.
-
- @return The processor index.
-**/
-UINTN
-GetProcessorIndex (
- VOID
- );
-
-/**
- Gets detailed MP-related information on the requested processor at the
- instant this call is made.
-
- @param[in] ProcessorNumber The handle number of processor.
- @param[out] ProcessorInfoBuffer A pointer to the buffer where information for
- the requested processor is deposited.
-
- @return Status of MpServices->GetProcessorInfo().
-**/
-EFI_STATUS
-GetProcessorInformation (
- IN UINTN ProcessorNumber,
- OUT EFI_PROCESSOR_INFORMATION *ProcessorInfoBuffer
- );
-
-/**
- Worker function to execute a caller provided function on all enabled APs.
-
- @param[in] Procedure A pointer to the function to be run on
- enabled APs of the system.
-**/
-VOID
-StartupAPsWorker (
- IN EFI_AP_PROCEDURE Procedure
- );
-
-/**
- Worker function to retrieve the number of logical processor in the platform.
-
- @param[out] NumberOfCpus Pointer to the total number of logical
- processors in the system, including the BSP
- and disabled APs.
- @param[out] NumberOfEnabledProcessors Pointer to the number of enabled logical
- processors that exist in system, including
- the BSP.
-**/
-VOID
-GetNumberOfProcessor (
- OUT UINTN *NumberOfCpus,
- OUT UINTN *NumberOfEnabledProcessors
- );
-
-/**
- Worker function to switch the requested AP to be the BSP from that point onward.
-
- @param[in] ProcessorNumber The handle number of AP that is to become the new BSP.
-**/
-VOID
-SwitchNewBsp (
- IN UINTN ProcessorNumber
- );
-
-/**
- Function that uses DEBUG() macros to display the contents of a a CPU feature bit mask.
-
- @param[in] FeatureMask A pointer to the CPU feature bit mask.
-**/
-VOID
-DumpCpuFeatureMask (
- IN UINT8 *FeatureMask
- );
-
-/**
- Dump CPU feature name or CPU feature bit mask.
-
- @param[in] CpuFeature Pointer to CPU_FEATURES_ENTRY
-**/
-VOID
-DumpCpuFeature (
- IN CPU_FEATURES_ENTRY *CpuFeature
- );
-
-#endif
+/** @file\r
+ CPU Register Table Library definitions.\r
+\r
+ Copyright (c) 2017 - 2020, Intel Corporation. All rights reserved.<BR>\r
+ SPDX-License-Identifier: BSD-2-Clause-Patent\r
+\r
+**/\r
+\r
+#ifndef _REGISTER_CPU_FEATURES_H_\r
+#define _REGISTER_CPU_FEATURES_H_\r
+#include <PiPei.h>\r
+#include <PiDxe.h>\r
+#include <Ppi/MpServices.h>\r
+#include <Protocol/MpService.h>\r
+\r
+#include <Library/BaseLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/PcdLib.h>\r
+#include <Library/RegisterCpuFeaturesLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#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
+#define CPU_FEATURE_ENTRY_SIGNATURE SIGNATURE_32 ('C', 'F', 'E', 'S')\r
+\r
+#define CPU_FEATURE_NAME_SIZE 128\r
+\r
+typedef struct {\r
+ REGISTER_CPU_FEATURE_INFORMATION CpuInfo;\r
+ UINT8 *FeaturesSupportedMask;\r
+ LIST_ENTRY OrderList;\r
+} CPU_FEATURES_INIT_ORDER;\r
+\r
+typedef struct {\r
+ UINT32 Signature;\r
+ LIST_ENTRY Link;\r
+ UINT8 *FeatureMask;\r
+ CHAR8 *FeatureName;\r
+ CPU_FEATURE_GET_CONFIG_DATA GetConfigDataFunc;\r
+ CPU_FEATURE_SUPPORT SupportFunc;\r
+ CPU_FEATURE_INITIALIZE InitializeFunc;\r
+ UINT8 *ThreadBeforeFeatureBitMask;\r
+ UINT8 *ThreadAfterFeatureBitMask;\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 MemoryMappedLock; // Spinlock used to program mmio\r
+ volatile UINT32 *CoreSemaphoreCount; // Semaphore containers used to program Core semaphore.\r
+ volatile UINT32 *PackageSemaphoreCount; // Semaphore containers used to program Package semaphore.\r
+} PROGRAM_CPU_REGISTER_FLAGS;\r
+\r
+typedef union {\r
+ EFI_MP_SERVICES_PROTOCOL *Protocol;\r
+ EFI_PEI_MP_SERVICES_PPI *Ppi;\r
+} MP_SERVICES;\r
+\r
+typedef struct {\r
+ UINTN FeaturesCount;\r
+ UINT32 BitMaskSize;\r
+ LIST_ENTRY FeatureList;\r
+\r
+ CPU_FEATURES_INIT_ORDER *InitOrder;\r
+ UINT8 *CapabilityPcd;\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
+\r
+ MP_SERVICES MpService;\r
+} CPU_FEATURES_DATA;\r
+\r
+#define CPU_FEATURE_ENTRY_FROM_LINK(a) \\r
+ CR ( \\r
+ (a), \\r
+ CPU_FEATURES_ENTRY, \\r
+ Link, \\r
+ CPU_FEATURE_ENTRY_SIGNATURE \\r
+ )\r
+\r
+/**\r
+ Worker function to get CPU_FEATURES_DATA pointer.\r
+\r
+ @return Pointer to CPU_FEATURES_DATA.\r
+**/\r
+CPU_FEATURES_DATA *\r
+GetCpuFeaturesData (\r
+ VOID\r
+ );\r
+\r
+/**\r
+ Worker function to return processor index.\r
+\r
+ @param CpuFeaturesData Cpu Feature Data structure.\r
+\r
+ @return The processor index.\r
+**/\r
+UINTN\r
+GetProcessorIndex (\r
+ IN CPU_FEATURES_DATA *CpuFeaturesData\r
+ );\r
+\r
+/**\r
+ Gets detailed MP-related information on the requested processor at the\r
+ instant this call is made.\r
+\r
+ @param[in] ProcessorNumber The handle number of processor.\r
+ @param[out] ProcessorInfoBuffer A pointer to the buffer where information for\r
+ the requested processor is deposited.\r
+\r
+ @return Status of MpServices->GetProcessorInfo().\r
+**/\r
+EFI_STATUS\r
+GetProcessorInformation (\r
+ IN UINTN ProcessorNumber,\r
+ OUT EFI_PROCESSOR_INFORMATION *ProcessorInfoBuffer\r
+ );\r
+\r
+/**\r
+ Worker function to execute a caller provided function on all enabled APs.\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
+StartupAllAPsWorker (\r
+ IN EFI_AP_PROCEDURE Procedure,\r
+ IN EFI_EVENT MpEvent\r
+ );\r
+\r
+/**\r
+ Worker function to retrieve the number of logical processor in the platform.\r
+\r
+ @param[out] NumberOfCpus Pointer to the total number of logical\r
+ processors in the system, including the BSP\r
+ and disabled APs.\r
+ @param[out] NumberOfEnabledProcessors Pointer to the number of enabled logical\r
+ processors that exist in system, including\r
+ the BSP.\r
+**/\r
+VOID\r
+GetNumberOfProcessor (\r
+ OUT UINTN *NumberOfCpus,\r
+ OUT UINTN *NumberOfEnabledProcessors\r
+ );\r
+\r
+/**\r
+ Worker function to switch the requested AP to be the BSP from that point onward.\r
+\r
+ @param[in] ProcessorNumber The handle number of AP that is to become the new BSP.\r
+**/\r
+VOID\r
+SwitchNewBsp (\r
+ IN UINTN ProcessorNumber\r
+ );\r
+\r
+/**\r
+ Function that uses DEBUG() macros to display the contents of a a CPU feature bit mask.\r
+\r
+ @param[in] FeatureMask A pointer to the CPU feature bit mask.\r
+ @param[in] BitMaskSize CPU feature bits mask buffer size.\r
+\r
+**/\r
+VOID\r
+DumpCpuFeatureMask (\r
+ IN UINT8 *FeatureMask,\r
+ IN UINT32 BitMaskSize\r
+ );\r
+\r
+/**\r
+ Dump CPU feature name or CPU feature bit mask.\r
+\r
+ @param[in] CpuFeature Pointer to CPU_FEATURES_ENTRY\r
+ @param[in] BitMaskSize CPU feature bits mask buffer size.\r
+\r
+**/\r
+VOID\r
+DumpCpuFeature (\r
+ IN CPU_FEATURES_ENTRY *CpuFeature,\r
+ IN UINT32 BitMaskSize\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
+ @param[in] NextCpuFeatureMask Pointer to next CPU feature Mask.\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
+ IN UINT8 *NextCpuFeatureMask\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
+ @param[in] FeatureList Pointer to CPU feature list.\r
+\r
+ @retval return the dependence result.\r
+**/\r
+CPU_FEATURE_DEPENDENCE_TYPE\r
+DetectNoneNeighborhoodFeatureScope (\r
+ IN CPU_FEATURES_ENTRY *CpuFeature,\r
+ IN BOOLEAN Before,\r
+ IN LIST_ENTRY *FeatureList\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
+/**\r
+ Worker function to get MP service pointer.\r
+\r
+ @return MP_SERVICES variable.\r
+**/\r
+MP_SERVICES\r
+GetMpService (\r
+ VOID\r
+ );\r
+\r
+#endif\r