In PeiMpInitLib, save CPU MP Data pointer into one local Guided HOB.
In DxeMpInitLib, save CPU MP Data pointer into one global variable.
Add helper functions GetCpuMpData()/SaveCpuMpData().
v5:
1. Move CPU_INIT_MP_LIB_HOB_GUID from MpLib.c to MpLib.h to make
all C files visible.
Cc: Michael Kinney <michael.d.kinney@intel.com>
Cc: Feng Tian <feng.tian@intel.com>
Cc: Giri P Mudusuru <giri.p.mudusuru@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jeff Fan <jeff.fan@intel.com>
Reviewed-by: Michael Kinney <michael.d.kinney@intel.com>
Tested-by: Laszlo Ersek <lersek@redhat.com>
Tested-by: Michael Kinney <michael.d.kinney@intel.com>
**/\r
\r
#include "MpLib.h"\r
+CPU_MP_DATA *mCpuMpData = NULL;\r
+\r
+/**\r
+ Get the pointer to CPU MP Data structure.\r
+\r
+ @return The pointer to CPU MP Data structure.\r
+**/\r
+CPU_MP_DATA *\r
+GetCpuMpData (\r
+ VOID\r
+ )\r
+{\r
+ ASSERT (mCpuMpData != NULL);\r
+ return mCpuMpData;\r
+}\r
+\r
+/**\r
+ Save the pointer to CPU MP Data structure.\r
+\r
+ @param[in] CpuMpData The pointer to CPU MP Data structure will be saved.\r
+**/\r
+VOID\r
+SaveCpuMpData (\r
+ IN CPU_MP_DATA *CpuMpData\r
+ )\r
+{\r
+ mCpuMpData = CpuMpData;\r
+}\r
+\r
+/**\r
+ Initialize global data for MP support.\r
+\r
+ @param[in] CpuMpData The pointer to CPU MP Data structure.\r
+**/\r
+VOID\r
+InitMpGlobalData (\r
+ IN CPU_MP_DATA *CpuMpData\r
+ )\r
+{\r
+ SaveCpuMpData (CpuMpData);\r
+\r
+}\r
\r
/**\r
This service executes a caller provided function on all enabled APs.\r
\r
#include "MpLib.h"\r
\r
+EFI_GUID mCpuInitMpLibHobGuid = CPU_INIT_MP_LIB_HOB_GUID;\r
+\r
/**\r
Get the Application Processors state.\r
\r
//\r
MtrrGetAllMtrrs (&CpuMpData->MtrrTable);\r
\r
+\r
+ //\r
+ // Initialize global data for MP support\r
+ //\r
+ InitMpGlobalData (CpuMpData);\r
+\r
return EFI_SUCCESS;\r
}\r
\r
{\r
return EFI_UNSUPPORTED;\r
}\r
+/**\r
+ Get pointer to CPU MP Data structure from GUIDed HOB.\r
+\r
+ @return The pointer to CPU MP Data structure.\r
+**/\r
+CPU_MP_DATA *\r
+GetCpuMpDataFromGuidedHob (\r
+ VOID\r
+ )\r
+{\r
+ EFI_HOB_GUID_TYPE *GuidHob;\r
+ VOID *DataInHob;\r
+ CPU_MP_DATA *CpuMpData;\r
+\r
+ CpuMpData = NULL;\r
+ GuidHob = GetFirstGuidHob (&mCpuInitMpLibHobGuid);\r
+ if (GuidHob != NULL) {\r
+ DataInHob = GET_GUID_HOB_DATA (GuidHob);\r
+ CpuMpData = (CPU_MP_DATA *) (*(UINTN *) DataInHob);\r
+ }\r
+ return CpuMpData;\r
+}\r
#include <Library/MtrrLib.h>\r
#include <Library/HobLib.h>\r
\r
+#define CPU_INIT_MP_LIB_HOB_GUID \\r
+ { \\r
+ 0x58eb6a19, 0x3699, 0x4c68, { 0xa8, 0x36, 0xda, 0xcd, 0x8e, 0xdc, 0xad, 0x4a } \\r
+ }\r
+\r
//\r
// AP loop state when APs are in idle state\r
// It's value is the same with PcdCpuApLoopMode\r
CPU_AP_DATA *CpuData;\r
volatile MP_CPU_EXCHANGE_INFO *MpCpuExchangeInfo;\r
};\r
+\r
+extern EFI_GUID mCpuInitMpLibHobGuid;\r
+\r
/**\r
Assembly code to place AP into safe loop mode.\r
\r
OUT MP_ASSEMBLY_ADDRESS_MAP *AddressMap\r
);\r
\r
+/**\r
+ Get the pointer to CPU MP Data structure.\r
+\r
+ @return The pointer to CPU MP Data structure.\r
+**/\r
+CPU_MP_DATA *\r
+GetCpuMpData (\r
+ VOID\r
+ );\r
+\r
+/**\r
+ Save the pointer to CPU MP Data structure.\r
+\r
+ @param[in] CpuMpData The pointer to CPU MP Data structure will be saved.\r
+**/\r
+VOID\r
+SaveCpuMpData (\r
+ IN CPU_MP_DATA *CpuMpData\r
+ );\r
+\r
+/**\r
+ Initialize global data for MP support.\r
+\r
+ @param[in] CpuMpData The pointer to CPU MP Data structure.\r
+**/\r
+VOID\r
+InitMpGlobalData (\r
+ IN CPU_MP_DATA *CpuMpData\r
+ );\r
+\r
+/**\r
+ Get pointer to CPU MP Data structure from GUIDed HOB.\r
+\r
+ @return The pointer to CPU MP Data structure.\r
+**/\r
+CPU_MP_DATA *\r
+GetCpuMpDataFromGuidedHob (\r
+ VOID\r
+ );\r
+ \r
/**\r
Detect whether specified processor can find matching microcode patch and load it.\r
\r
\r
#include "MpLib.h"\r
\r
+/**\r
+ Get pointer to CPU MP Data structure.\r
+\r
+ @return The pointer to CPU MP Data structure.\r
+**/\r
+CPU_MP_DATA *\r
+GetCpuMpData (\r
+ VOID\r
+ )\r
+{\r
+ CPU_MP_DATA *CpuMpData;\r
+\r
+ CpuMpData = GetCpuMpDataFromGuidedHob ();\r
+ ASSERT (CpuMpData != NULL);\r
+ return CpuMpData;\r
+}\r
+\r
+/**\r
+ Save the pointer to CPU MP Data structure.\r
+\r
+ @param[in] CpuMpData The pointer to CPU MP Data structure will be saved.\r
+**/\r
+VOID\r
+SaveCpuMpData (\r
+ IN CPU_MP_DATA *CpuMpData\r
+ )\r
+{\r
+ UINT64 Data64;\r
+ //\r
+ // Build location of CPU MP DATA buffer in HOB\r
+ //\r
+ Data64 = (UINT64) (UINTN) CpuMpData;\r
+ BuildGuidDataHob (\r
+ &mCpuInitMpLibHobGuid,\r
+ (VOID *) &Data64,\r
+ sizeof (UINT64)\r
+ );\r
+}\r
+\r
+\r
+/**\r
+ Initialize global data for MP support.\r
+\r
+ @param[in] CpuMpData The pointer to CPU MP Data structure.\r
+**/\r
+VOID\r
+InitMpGlobalData (\r
+ IN CPU_MP_DATA *CpuMpData\r
+ )\r
+{\r
+\r
+ SaveCpuMpData (CpuMpData);\r
+}\r
+\r
/**\r
This service executes a caller provided function on all enabled APs.\r
\r