{\r
RETURN_STATUS Status;\r
MTRR_MEMORY_CACHE_TYPE CacheType;\r
+ EFI_STATUS MpStatus;\r
+ EFI_MP_SERVICES_PROTOCOL *MpService;\r
+ MTRR_SETTINGS MtrrSettings;\r
\r
if (!IsMtrrSupported ()) {\r
return EFI_UNSUPPORTED;\r
CacheType\r
);\r
\r
+ if (!RETURN_ERROR (Status)) {\r
+ MpStatus = gBS->LocateProtocol (\r
+ &gEfiMpServiceProtocolGuid,\r
+ NULL,\r
+ (VOID **)&MpService\r
+ );\r
+ //\r
+ // Synchronize the update with all APs\r
+ //\r
+ if (!EFI_ERROR (MpStatus)) {\r
+ MtrrGetAllMtrrs (&MtrrSettings);\r
+ MpStatus = MpService->StartupAllAPs (\r
+ MpService, // This\r
+ SetMtrrsFromBuffer, // Procedure\r
+ TRUE, // SingleThread\r
+ NULL, // WaitEvent\r
+ 0, // TimeoutInMicrosecsond\r
+ &MtrrSettings, // ProcedureArgument\r
+ NULL // FailedCpuList\r
+ );\r
+ ASSERT (MpStatus == EFI_SUCCESS || MpStatus == EFI_NOT_STARTED);\r
+ }\r
+ }\r
return (EFI_STATUS) Status;\r
}\r
\r
SendInitIpiAllExcludingSelf ();\r
}\r
\r
+/**\r
+ A minimal wrapper function that allows MtrrSetAllMtrrs() to be passed to\r
+ EFI_MP_SERVICES_PROTOCOL.StartupAllAPs() as Procedure.\r
+\r
+ @param[in] Buffer Pointer to an MTRR_SETTINGS object, to be passed to\r
+ MtrrSetAllMtrrs().\r
+**/\r
+VOID\r
+EFIAPI\r
+SetMtrrsFromBuffer (\r
+ IN VOID *Buffer\r
+ )\r
+{\r
+ MtrrSetAllMtrrs (Buffer);\r
+}\r
+\r
/**\r
Initialize Multi-processor support.\r
\r
)\r
{\r
EFI_STATUS Status;\r
+ MTRR_SETTINGS MtrrSettings;\r
UINTN Timeout;\r
\r
gMaxLogicalProcessorNumber = (UINTN) PcdGet32 (PcdCpuMaxLogicalProcessorNumber);\r
//\r
CollectBistDataFromHob ();\r
\r
+ //\r
+ // Synchronize MTRR settings to APs.\r
+ //\r
+ MtrrGetAllMtrrs (&MtrrSettings);\r
+ Status = mMpServicesTemplate.StartupAllAPs (\r
+ &mMpServicesTemplate, // This\r
+ SetMtrrsFromBuffer, // Procedure\r
+ TRUE, // SingleThread\r
+ NULL, // WaitEvent\r
+ 0, // TimeoutInMicrosecsond\r
+ &MtrrSettings, // ProcedureArgument\r
+ NULL // FailedCpuList\r
+ );\r
+ ASSERT (Status == EFI_SUCCESS || Status == EFI_NOT_STARTED);\r
+\r
Status = gBS->InstallMultipleProtocolInterfaces (\r
&mMpServiceHandle,\r
&gEfiMpServiceProtocolGuid, &mMpServicesTemplate,\r
IN UINT32 ProcessorId\r
);\r
\r
+/**\r
+ A minimal wrapper function that allows MtrrSetAllMtrrs() to be passed to\r
+ EFI_MP_SERVICES_PROTOCOL.StartupAllAPs() as Procedure.\r
+\r
+ @param[in] Buffer Pointer to an MTRR_SETTINGS object, to be passed to\r
+ MtrrSetAllMtrrs().\r
+**/\r
+VOID\r
+EFIAPI\r
+SetMtrrsFromBuffer (\r
+ IN VOID *Buffer\r
+ );\r
+\r
#endif // _CPU_MP_H_\r
\r