HI 1) I have concern on using " if ((Status & ~(0xF)) == (FSP_STATUS_RESET_REQUIRED_COLD & ~(0xF)))" According to FSP spec, only below reset status are defined. It means 0x40000009 are not in scope. I suggest we should use range check.
#define FSP_STATUS_RESET_REQUIRED_COLD 0x40000001 #define FSP_STATUS_RESET_REQUIRED_WARM 0x40000002 #define FSP_STATUS_RESET_REQUIRED_3 0x40000003 #define FSP_STATUS_RESET_REQUIRED_4 0x40000004 #define FSP_STATUS_RESET_REQUIRED_5 0x40000005 #define FSP_STATUS_RESET_REQUIRED_6 0x40000006 #define FSP_STATUS_RESET_REQUIRED_7 0x40000007 #define FSP_STATUS_RESET_REQUIRED_8 0x40000008 2) I am curious why we need introduce CallFspWrapperResetSystem, Can we just use ResetPpi in PEI phase, and gRT->ResetSystem in DXE phase? Thank you Yao Jiewen > -----Original Message----- > From: Yarlagadda, Satya P > Sent: Thursday, June 16, 2016 7:15 PM > To: [email protected] > Cc: Mudusuru, Giri P <[email protected]>; Yao, Jiewen > <[email protected]> > Subject: [PATCH] IntelFsp2WrapperPkg: Add support to handle ResetRequired > return Status from FSP > > As per FSP 2.0 spec, FSP shall not trigger system reset and instead it > shall return from the FSP API to the BL/Wrapper with the required reset > type. The changes are to handle the ResetRequired return code from FSP > APIs and provide lib interface for platform to trigger the actual reset. > > Cc: Giri P Mudusuru <[email protected]> > Cc: Jiewen Yao <[email protected]> > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Satya Yarlagadda <[email protected]> > --- > .../FspWrapperNotifyDxe/FspWrapperNotifyDxe.c | 16 > ++++++++++++++++ > .../FspWrapperNotifyDxe/FspWrapperNotifyDxe.inf | 1 + > IntelFsp2WrapperPkg/FspmWrapperPeim/FspmWrapperPeim.c | 5 > +++++ > IntelFsp2WrapperPkg/FspsWrapperPeim/FspsWrapperPeim.c | 5 +++++ > .../Include/Library/FspWrapperPlatformLib.h | 13 > +++++++++++++ > .../FspWrapperPlatformLibSample.c | 18 > +++++++++++++++++- > 6 files changed, 57 insertions(+), 1 deletion(-) > > diff --git > a/IntelFsp2WrapperPkg/FspWrapperNotifyDxe/FspWrapperNotifyDxe.c > b/IntelFsp2WrapperPkg/FspWrapperNotifyDxe/FspWrapperNotifyDxe.c > index 30c06b8..bc52221 100644 > --- a/IntelFsp2WrapperPkg/FspWrapperNotifyDxe/FspWrapperNotifyDxe.c > +++ b/IntelFsp2WrapperPkg/FspWrapperNotifyDxe/FspWrapperNotifyDxe.c > @@ -22,6 +22,7 @@ > #include <Library/BaseMemoryLib.h> > #include <Library/UefiLib.h> > #include <Library/FspWrapperApiLib.h> > +#include <Library/FspWrapperPlatformLib.h> > #include <Library/PerformanceLib.h> > #include <Library/HobLib.h> > > @@ -93,6 +94,11 @@ OnPciEnumerationComplete ( > PERF_START_EX(&gFspApiPerformanceGuid, "EventRec", NULL, 0, > 0x6000); > Status = CallFspNotifyPhase (&NotifyPhaseParams); > PERF_END_EX(&gFspApiPerformanceGuid, "EventRec", NULL, 0, 0x607F); > + // Reset the system if FSP API returned FSP_STATUS_RESET_REQUIRED > status > + if ((Status & ~(0xF)) == (FSP_STATUS_RESET_REQUIRED_COLD & ~(0xF))) { > + DEBUG ((DEBUG_INFO, "FSP NotifyPhase AfterPciEnumeration > requested reset 0x%x\n", Status)); > + CallFspWrapperResetSystem ((UINT32)Status); > + } > if (Status != EFI_SUCCESS) { > DEBUG((DEBUG_ERROR, "FSP NotifyPhase AfterPciEnumeration failed, > status: 0x%x\n", Status)); > } else { > @@ -130,6 +136,11 @@ OnReadyToBoot ( > PERF_START_EX(&gFspApiPerformanceGuid, "EventRec", NULL, 0, > 0x4000); > Status = CallFspNotifyPhase (&NotifyPhaseParams); > PERF_END_EX(&gFspApiPerformanceGuid, "EventRec", NULL, 0, 0x407F); > + // Reset the system if FSP API returned FSP_STATUS_RESET_REQUIRED > status > + if ((Status & ~(0xF)) == (FSP_STATUS_RESET_REQUIRED_COLD & ~(0xF))) { > + DEBUG ((DEBUG_INFO, "FSP NotifyPhase ReadyToBoot requested > reset 0x%x\n", Status)); > + CallFspWrapperResetSystem ((UINT32)Status); > + } > if (Status != EFI_SUCCESS) { > DEBUG((DEBUG_ERROR, "FSP NotifyPhase ReadyToBoot failed, status: > 0x%x\n", Status)); > } else { > @@ -179,6 +190,11 @@ OnEndOfFirmware ( > PERF_START_EX(&gFspApiPerformanceGuid, "EventRec", NULL, 0, > 0x2000); > Status = CallFspNotifyPhase (&NotifyPhaseParams); > PERF_END_EX(&gFspApiPerformanceGuid, "EventRec", NULL, 0, 0x207F); > + // Reset the system if FSP API returned FSP_STATUS_RESET_REQUIRED > status > + if ((Status & ~(0xF)) == (FSP_STATUS_RESET_REQUIRED_COLD & ~(0xF))) { > + DEBUG ((DEBUG_INFO, "FSP NotifyPhase EndOfFirmware requested > reset 0x%x\n", Status)); > + CallFspWrapperResetSystem ((UINT32)Status); > + } > if (Status != EFI_SUCCESS) { > DEBUG((DEBUG_ERROR, "FSP NotifyPhase EndOfFirmware failed, > status: 0x%x\n", Status)); > } else { > diff --git > a/IntelFsp2WrapperPkg/FspWrapperNotifyDxe/FspWrapperNotifyDxe.inf > b/IntelFsp2WrapperPkg/FspWrapperNotifyDxe/FspWrapperNotifyDxe.inf > index d8af0aa..f6cf4ad 100644 > --- a/IntelFsp2WrapperPkg/FspWrapperNotifyDxe/FspWrapperNotifyDxe.inf > +++ > b/IntelFsp2WrapperPkg/FspWrapperNotifyDxe/FspWrapperNotifyDxe.inf > @@ -44,6 +44,7 @@ > BaseMemoryLib > UefiLib > FspWrapperApiLib > + FspWrapperPlatformLib > PeCoffLib > CacheMaintenanceLib > DxeServicesLib > diff --git a/IntelFsp2WrapperPkg/FspmWrapperPeim/FspmWrapperPeim.c > b/IntelFsp2WrapperPkg/FspmWrapperPeim/FspmWrapperPeim.c > index 2eb3625..670636d 100644 > --- a/IntelFsp2WrapperPkg/FspmWrapperPeim/FspmWrapperPeim.c > +++ b/IntelFsp2WrapperPkg/FspmWrapperPeim/FspmWrapperPeim.c > @@ -88,6 +88,11 @@ PeiFspMemoryInit ( > PERF_START_EX(&gFspApiPerformanceGuid, "EventRec", NULL, > TimeStampCounterStart, 0xD000); > PERF_END_EX(&gFspApiPerformanceGuid, "EventRec", NULL, 0, > 0xD07F); > DEBUG ((DEBUG_INFO, "Total time spent executing > FspMemoryInitApi: %d millisecond\n", DivU64x32 (GetTimeInNanoSecond > (AsmReadTsc () - TimeStampCounterStart), 1000000))); > + // Reset the system if FSP API returned FSP_STATUS_RESET_REQUIRED > status > + if ((Status & ~(0xF)) == (FSP_STATUS_RESET_REQUIRED_COLD & ~(0xF))) { > + DEBUG ((DEBUG_INFO, "FspMemoryInitApi requested reset 0x%x\n", > Status)); > + CallFspWrapperResetSystem (Status); > + } > if (EFI_ERROR(Status)) { > DEBUG ((DEBUG_ERROR, "ERROR - Failed to execute > FspMemoryInitApi(), Status = %r\n", Status)); > } > diff --git a/IntelFsp2WrapperPkg/FspsWrapperPeim/FspsWrapperPeim.c > b/IntelFsp2WrapperPkg/FspsWrapperPeim/FspsWrapperPeim.c > index 9bc720f..32e0b63 100644 > --- a/IntelFsp2WrapperPkg/FspsWrapperPeim/FspsWrapperPeim.c > +++ b/IntelFsp2WrapperPkg/FspsWrapperPeim/FspsWrapperPeim.c > @@ -229,6 +229,11 @@ PeiMemoryDiscoveredNotify ( > Status = CallFspSiliconInit ((VOID *)FspsUpdDataPtr); > PERF_END_EX(&gFspApiPerformanceGuid, "EventRec", NULL, 0, 0x907F); > DEBUG ((DEBUG_INFO, "Total time spent executing FspSiliconInitApi: %d > millisecond\n", DivU64x32 (GetTimeInNanoSecond (AsmReadTsc () - > TimeStampCounterStart), 1000000))); > + // Reset the system if FSP API returned FSP_STATUS_RESET_REQUIRED > status > + if ((Status & ~(0xF)) == (FSP_STATUS_RESET_REQUIRED_COLD & ~(0xF))) { > + DEBUG ((DEBUG_INFO, "FspSiliconInitApi requested reset 0x%x\n", > Status)); > + CallFspWrapperResetSystem (Status); > + } > if (EFI_ERROR(Status)) { > DEBUG ((DEBUG_ERROR, "ERROR - Failed to execute > FspSiliconInitApi(), Status = %r\n", Status)); > } > diff --git a/IntelFsp2WrapperPkg/Include/Library/FspWrapperPlatformLib.h > b/IntelFsp2WrapperPkg/Include/Library/FspWrapperPlatformLib.h > index 30dc8df..44f975a 100644 > --- a/IntelFsp2WrapperPkg/Include/Library/FspWrapperPlatformLib.h > +++ b/IntelFsp2WrapperPkg/Include/Library/FspWrapperPlatformLib.h > @@ -70,4 +70,17 @@ GetS3MemoryInfo ( > OUT EFI_PHYSICAL_ADDRESS *S3PeiMemBase > ); > > +/** > + Perform platform related reset in FSP wrapper. > + > + @param[in] ResetType The type of reset the platform has to perform. > + > + @return Will reset the system with requested ResetType. > +**/ > +VOID > +EFIAPI > +CallFspWrapperResetSystem ( > + IN UINT32 ResetType > + ); > + > #endif > diff --git > a/IntelFsp2WrapperPkg/Library/BaseFspWrapperPlatformLibSample/FspWra > pperPlatformLibSample.c > b/IntelFsp2WrapperPkg/Library/BaseFspWrapperPlatformLibSample/FspWra > pperPlatformLibSample.c > index 9c1a84f..a5f8b99 100644 > --- > a/IntelFsp2WrapperPkg/Library/BaseFspWrapperPlatformLibSample/FspWra > pperPlatformLibSample.c > +++ > b/IntelFsp2WrapperPkg/Library/BaseFspWrapperPlatformLibSample/FspWra > pperPlatformLibSample.c > @@ -80,4 +80,20 @@ GetS3MemoryInfo ( > ) > { > return EFI_UNSUPPORTED; > -} > \ No newline at end of file > +} > + > +/** > + Perform platform related reset in FSP wrapper. > + > + @param[in] ResetType The type of reset the platform has to perform. > + > + @return Will reset the system with requested Reset type. > +**/ > +VOID > +EFIAPI > +CallFspWrapperResetSystem ( > + IN UINT32 ResetType > + ) > +{ > + return NULL; > +} > -- > 2.9.0.windows.1 _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

