From 0e02ccfc4ed8424c41cd571783b3a80ee947567f Mon Sep 17 00:00:00 2001 From: jiangxin Date: Sun, 10 Apr 2022 21:50:15 -0400 Subject: [PATCH 02/11] UefiCpuPkg/LocalApicLib: Exclude second SendIpi sequence on HYGON hardware On HYGON processors the second SendIpi in the SendInitSipiSipi and SendInitSipiSipiAllExcludingSelf routines is not required, and may cause undesired side-effects during MP initialization. This patch leverages the StandardSignatureIsHygonGenuine check to exclude the second SendIpi and its associated MicroSecondDelay (200). Signed-off-by: Xin Jiang --- UefiCpuPkg/Library/BaseXApicLib/BaseXApicLib.c | 5 +++-- UefiCpuPkg/Library/BaseXApicX2ApicLib/BaseXApicX2ApicLib.c | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/UefiCpuPkg/Library/BaseXApicLib/BaseXApicLib.c b/UefiCpuPkg/Library/BaseXApicLib/BaseXApicLib.c index d56c627..6c035ee 100644 --- a/UefiCpuPkg/Library/BaseXApicLib/BaseXApicLib.c +++ b/UefiCpuPkg/Library/BaseXApicLib/BaseXApicLib.c @@ -22,6 +22,7 @@ #include #include #include +#include // // Library internal functions @@ -555,7 +556,7 @@ SendInitSipiSipi ( IcrLow.Bits.DeliveryMode = LOCAL_APIC_DELIVERY_MODE_STARTUP; IcrLow.Bits.Level = 1; SendIpi (IcrLow.Uint32, ApicId); - if (!StandardSignatureIsAuthenticAMD ()) { + if (!StandardSignatureIsAuthenticAMD () && !StandardSignatureIsHygonGenuine ()) { MicroSecondDelay (200); SendIpi (IcrLow.Uint32, ApicId); } @@ -581,7 +582,7 @@ SendInitSipiSipiAllExcludingSelf ( SendInitIpiAllExcludingSelf (); MicroSecondDelay (PcdGet32 (PcdCpuInitIpiDelayInMicroSeconds)); SendStartupIpiAllExcludingSelf (StartupRoutine); - if (!StandardSignatureIsAuthenticAMD ()) { + if (!StandardSignatureIsAuthenticAMD () && !StandardSignatureIsHygonGenuine ()) { MicroSecondDelay (200); SendStartupIpiAllExcludingSelf (StartupRoutine); } diff --git a/UefiCpuPkg/Library/BaseXApicX2ApicLib/BaseXApicX2ApicLib.c b/UefiCpuPkg/Library/BaseXApicX2ApicLib/BaseXApicX2ApicLib.c index aa4eb11..2fa614c 100644 --- a/UefiCpuPkg/Library/BaseXApicX2ApicLib/BaseXApicX2ApicLib.c +++ b/UefiCpuPkg/Library/BaseXApicX2ApicLib/BaseXApicX2ApicLib.c @@ -24,6 +24,7 @@ #include #include #include +#include // // Library internal functions @@ -794,7 +795,7 @@ SendInitSipiSipi ( IcrLow.Bits.DeliveryMode = LOCAL_APIC_DELIVERY_MODE_STARTUP; IcrLow.Bits.Level = 1; SendIpi (IcrLow.Uint32, ApicId); - if (!StandardSignatureIsAuthenticAMD ()) { + if (!StandardSignatureIsAuthenticAMD () && !StandardSignatureIsHygonGenuine ()) { MicroSecondDelay (200); SendIpi (IcrLow.Uint32, ApicId); } @@ -820,7 +821,7 @@ SendInitSipiSipiAllExcludingSelf ( SendInitIpiAllExcludingSelf (); MicroSecondDelay (PcdGet32 (PcdCpuInitIpiDelayInMicroSeconds)); SendStartupIpiAllExcludingSelf (StartupRoutine); - if (!StandardSignatureIsAuthenticAMD ()) { + if (!StandardSignatureIsAuthenticAMD () && !StandardSignatureIsHygonGenuine ()) { MicroSecondDelay (200); SendStartupIpiAllExcludingSelf (StartupRoutine); } -- 2.25.1