1. I agree. Due to the total debug message length in PEI, I thought this could be added as a future enhancement. I will come back to it soon. 2. Not at the moment. There is an increasing need for a "common board package". PeiSerialPortLibSpiFlash is abstracted with the PCH_SPI_PPI and SpiLib in a way it could be used across generations. If such a package is made this could be moved there.
> -----Original Message----- > From: Desimone, Nathaniel L > Sent: Sunday, March 31, 2019 10:54 PM > To: Kubacki, Michael A <michael.a.kuba...@intel.com>; edk2- > de...@lists.01.org > Cc: Sinha, Ankit <ankit.si...@intel.com>; Chiu, Chasel > <chasel.c...@intel.com>; Gao, Liming <liming....@intel.com>; Kinney, > Michael D <michael.d.kin...@intel.com> > Subject: RE: [edk2-platforms][PATCH v1 3/3] ClevoOpenBoardPkg/N1xxWU: > Write PEI debug messages to SPI flash > > Look's good. I have a couple of comments, but they are not blocking: > > 1. It would be nice if this library worked more like a circular buffer when > erasing previous debug messages from flash. Basically, instead of clearing the > entire debug region, only clear 4KB blocks at a time as they are needed. That > way you will always have at least NvMessageAreaSize - 4KB worth of debug > message to look back when trying to debug issues. > > 2. It seems like this library would also be useful for other Kaby Lake boards > (KabylakeOpenBoardPkg for example) is there any "shared Kaby Lake package" > that we could put this in where both could use it? > > Reviewed-by: Nate DeSimone <nathaniel.l.desim...@intel.com> > > -----Original Message----- > From: Kubacki, Michael A > Sent: Sunday, March 31, 2019 4:28 PM > To: edk2-devel@lists.01.org > Cc: Sinha, Ankit <ankit.si...@intel.com>; Desimone, Nathaniel L > <nathaniel.l.desim...@intel.com>; Chiu, Chasel <chasel.c...@intel.com>; > Gao, Liming <liming....@intel.com>; Kinney, Michael D > <michael.d.kin...@intel.com> > Subject: [edk2-platforms][PATCH v1 3/3] ClevoOpenBoardPkg/N1xxWU: Write > PEI debug messages to SPI flash > > Adds a new SerialPortLib instance to the ClevoOpenBoardPkg to support > writing debug messages to a dedicated area on SPI flash. This is to enable > closed chassis debug support on the system. > > DXE and later phases after memory initialization are expected to use USB > debug. > > Cc: Ankit Sinha <mailto:ankit.si...@intel.com> > Cc: Nate DeSimone <mailto:nathaniel.l.desim...@intel.com> > Cc: Chasel Chiu <mailto:chasel.c...@intel.com> > Cc: Liming Gao <mailto:liming....@intel.com> > Cc: Michael D Kinney <mailto:michael.d.kin...@intel.com> > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Michael Kubacki <mailto:michael.a.kuba...@intel.com> > --- > Platform/Intel/ClevoOpenBoardPkg/OpenBoardPkg.dec | 5 + > .../ClevoOpenBoardPkg/N1xxWU/OpenBoardPkg.dsc | 20 +- > .../ClevoOpenBoardPkg/N1xxWU/OpenBoardPkg.fdf | 4 + > .../PeiSerialPortLibSpiFlash.inf | 56 ++++ > .../PeiSerialPortLibSpiFlash.c | 326 > +++++++++++++++++++++ > 5 files changed, 407 insertions(+), 4 deletions(-) create mode 100644 > Platform/Intel/ClevoOpenBoardPkg/Library/PeiSerialPortLibSpiFlash/PeiSerialP > ortLibSpiFlash.inf > create mode 100644 > Platform/Intel/ClevoOpenBoardPkg/Library/PeiSerialPortLibSpiFlash/PeiSerialP > ortLibSpiFlash.c > > diff --git a/Platform/Intel/ClevoOpenBoardPkg/OpenBoardPkg.dec > b/Platform/Intel/ClevoOpenBoardPkg/OpenBoardPkg.dec > index 87bbfb2240..aa457e64db 100644 > --- a/Platform/Intel/ClevoOpenBoardPkg/OpenBoardPkg.dec > +++ b/Platform/Intel/ClevoOpenBoardPkg/OpenBoardPkg.dec > @@ -30,6 +30,7 @@ Features\Tbt\Include > [Guids] > gBoardModuleTokenSpaceGuid = {0x72d1fff7, 0xa42a, 0x4219, {0xb9, > 0x95, 0x5a, 0x67, 0x53, 0x6e, 0xa4, 0x2a}} > gTianoLogoGuid = {0x7BB28B99, 0x61BB, 0x11D5, {0x9A, > 0x5D, > 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D}} > +gSpiFlashDebugHobGuid = {0xcaaaf418, 0x38a5, 0x4d49, {0xbe, > 0x74, 0xe6, 0x06, 0xe4, 0x02, 0x6d, 0x25}} > gTbtInfoHobGuid = {0x74a81eaa, 0x033c, 0x4783, {0xbe, > 0x2b, > 0x84, 0x85, 0x74, 0xa6, 0x97, 0xb7}} > gPlatformModuleTokenSpaceGuid = {0x69d13bf0, 0xaf91, 0x4d96, {0xaa, > 0x9f, 0x21, 0x84, 0xc5, 0xce, 0x3b, 0xc0}} > > @@ -64,6 +65,10 @@ > gBoardModuleTokenSpaceGuid.PcdSwSmiDTbtEnumerate|0xF7|UINT8|0x000 > 000110 > > > gBoardModuleTokenSpaceGuid.PcdSmcExtSmiBitPosition|0x01|UINT8|0x9000 > 0015 > > +gBoardModuleTokenSpaceGuid.PcdFlashNvDebugMessageBase|0x00000000| > UINT32 > +|0x90000030 > +gBoardModuleTokenSpaceGuid.PcdFlashNvDebugMessageSize|0x00000000| > UINT32 > +|0x90000031 > +gBoardModuleTokenSpaceGuid.PcdFlashNvDebugMessageOffset|0x00000000 > |UINT > +32|0x90000032 > + > [PcdsDynamic] > > # Board GPIO Table > diff --git a/Platform/Intel/ClevoOpenBoardPkg/N1xxWU/OpenBoardPkg.dsc > b/Platform/Intel/ClevoOpenBoardPkg/N1xxWU/OpenBoardPkg.dsc > index 2116c48fc0..c43a30de34 100644 > --- a/Platform/Intel/ClevoOpenBoardPkg/N1xxWU/OpenBoardPkg.dsc > +++ b/Platform/Intel/ClevoOpenBoardPkg/N1xxWU/OpenBoardPkg.dsc > @@ -116,10 +116,18 @@ > # > !include $(PLATFORM_SI_PACKAGE)/SiPkgCommonLib.dsc > > +[LibraryClasses.IA32.SEC] > + > +SerialPortLib|MdePkg/Library/BaseSerialPortLibNull/BaseSerialPortLibNul > +l.inf > + DebugLib|MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull.inf > + > +TestPointCheckLib|$(PLATFORM_PACKAGE)/Test/Library/TestPointCheckLib/S > e > +cTestPointCheckLib.inf > + > +SecBoardInitLib|$(PLATFORM_PACKAGE)/PlatformInit/Library/SecBoardInitLi > +bNull/SecBoardInitLibNull.inf > + > [LibraryClasses.IA32] > # > # PEI phase common > # > + > + SerialPortLib|$(PLATFORM_BOARD_PACKAGE)/Library/PeiSerialPortLibSpiFla > + sh/PeiSerialPortLibSpiFlash.inf > + > DebugLib|MdeModulePkg/Library/PeiDxeDebugLibReportStatusCode/PeiDxeD > eb > + ugLibReportStatusCode.inf > > FspWrapperPlatformLib|$(PLATFORM_PACKAGE)/FspWrapper/Library/PeiFsp > WrapperPlatformLib/PeiFspWrapperPlatformLib.inf > !if $(TARGET) == DEBUG > > TestPointCheckLib|$(PLATFORM_PACKAGE)/Test/Library/TestPointCheckLib/P > eiTestPointCheckLib.inf > @@ -138,10 +146,6 @@ > # > !include $(PLATFORM_SI_PACKAGE)/SiPkgPeiLib.dsc > > -[LibraryClasses.IA32.SEC] > - > TestPointCheckLib|$(PLATFORM_PACKAGE)/Test/Library/TestPointCheckLib/Se > cTestPointCheckLib.inf > - > SecBoardInitLib|$(PLATFORM_PACKAGE)/PlatformInit/Library/SecBoardInitLib > Null/SecBoardInitLibNull.inf > - > [LibraryClasses.X64] > # > # DXE phase common > @@ -185,6 +189,14 @@ > # > !include $(PLATFORM_PACKAGE)/Include/Dsc/CorePeiInclude.dsc > > + # > + # Core > + # > + > MdeModulePkg/Universal/StatusCodeHandler/Pei/StatusCodeHandlerPei.inf { > + <LibraryClasses> > + DebugLib|MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull.inf > + } > + > # > # FSP wrapper SEC Core > # > diff --git a/Platform/Intel/ClevoOpenBoardPkg/N1xxWU/OpenBoardPkg.fdf > b/Platform/Intel/ClevoOpenBoardPkg/N1xxWU/OpenBoardPkg.fdf > index 95c1758ff3..7f3e965c75 100644 > --- a/Platform/Intel/ClevoOpenBoardPkg/N1xxWU/OpenBoardPkg.fdf > +++ b/Platform/Intel/ClevoOpenBoardPkg/N1xxWU/OpenBoardPkg.fdf > @@ -136,6 +136,10 @@ > gMinPlatformPkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareOffset|gEfiMde > ModulePkgTo > > gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase|gEfiMde > ModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize > #NV_FTW_SPARE > > +gBoardModuleTokenSpaceGuid.PcdFlashNvDebugMessageOffset|gBoardMod > uleTok > +enSpaceGuid.PcdFlashNvDebugMessageSize > +gBoardModuleTokenSpaceGuid.PcdFlashNvDebugMessageBase|gBoardModu > leToken > +SpaceGuid.PcdFlashNvDebugMessageSize > +#DEBUG_MESSAGE_AREA > + > > gMinPlatformPkgTokenSpaceGuid.PcdFlashFvAdvancedOffset|gMinPlatformPk > gTokenSpaceGuid.PcdFlashFvAdvancedSize > > gMinPlatformPkgTokenSpaceGuid.PcdFlashFvAdvancedBase|gMinPlatformPkg > TokenSpaceGuid.PcdFlashFvAdvancedSize > FV = FvAdvanced > diff --git > a/Platform/Intel/ClevoOpenBoardPkg/Library/PeiSerialPortLibSpiFlash/PeiSeri > alPortLibSpiFlash.inf > b/Platform/Intel/ClevoOpenBoardPkg/Library/PeiSerialPortLibSpiFlash/PeiSeri > alPortLibSpiFlash.inf > new file mode 100644 > index 0000000000..c22201e033 > --- /dev/null > +++ b/Platform/Intel/ClevoOpenBoardPkg/Library/PeiSerialPortLibSpiFlash/ > +++ PeiSerialPortLibSpiFlash.inf > @@ -0,0 +1,56 @@ > +### @file > +# Component description file for Serial I/O Port library to write to SPI > flash. > +# > +# Copyright (c) 2019, 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. > +# > +## > + > +[Defines] > + INF_VERSION = 0x00010005 > + BASE_NAME = PeiSerialPortLibFlash > + FILE_GUID = 35A3BA89-04BE-409C-A3CA-DEF6B510F80F > + VERSION_STRING = 1.1 > + MODULE_TYPE = PEIM > + LIBRARY_CLASS = SerialPortLib|PEIM PEI_CORE > +# > +# The following information is for reference only and not required by the > build tools. > +# > +# VALID_ARCHITECTURES = IA32 X64 IPF > +# > + > +[LibraryClasses] > + BaseLib > + BaseMemoryLib > + HobLib > + PcdLib > + PeiServicesLib > + SpiLib > + > +[Packages] > + MdePkg/MdePkg.dec > + MdeModulePkg/MdeModulePkg.dec > + MinPlatformPkg/MinPlatformPkg.dec > + KabylakeSiliconPkg/SiPkg.dec > + ClevoOpenBoardPkg/OpenBoardPkg.dec > + > +[Sources] > + PeiSerialPortLibSpiFlash.c > + > +[Ppis] > + gPchSpiPpiGuid > + > +[Guids] > + gSpiFlashDebugHobGuid > + > +[Pcd] > + gMinPlatformPkgTokenSpaceGuid.PcdFlashAreaBaseAddress ## > CONSUMES > + gBoardModuleTokenSpaceGuid.PcdFlashNvDebugMessageBase ## > CONSUMES > + gBoardModuleTokenSpaceGuid.PcdFlashNvDebugMessageSize ## > CONSUMES > diff --git > a/Platform/Intel/ClevoOpenBoardPkg/Library/PeiSerialPortLibSpiFlash/PeiSeri > alPortLibSpiFlash.c > b/Platform/Intel/ClevoOpenBoardPkg/Library/PeiSerialPortLibSpiFlash/PeiSeri > alPortLibSpiFlash.c > new file mode 100644 > index 0000000000..e36ff8bff8 > --- /dev/null > +++ b/Platform/Intel/ClevoOpenBoardPkg/Library/PeiSerialPortLibSpiFlash/ > +++ PeiSerialPortLibSpiFlash.c > @@ -0,0 +1,326 @@ > +/** @file > + Serial I/O Port library implementation for output to SPI flash > + > +Copyright (c) 2019, 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 that 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. > + > +**/ > + > +#include <Base.h> > +#include <Ppi/Spi.h> > +#include <Library/BaseLib.h> > +#include <Library/BaseMemoryLib.h> > +#include <Library/HobLib.h> > +#include <Library/PcdLib.h> > +#include <Library/PeiServicesLib.h> > +#include <Library/SerialPortLib.h> > +#include <Library/SpiLib.h> > + > +typedef struct { > + PCH_SPI_PPI *PchSpiPpi; > + UINT32 CurrentWriteOffset; > +} SPI_FLASH_DEBUG_CONTEXT; > + > +/** > + Update reference to the most recent PCH SPI PPI installed > + > + @param PeiServices An indirect pointer to the EFI_PEI_SERVICES table > published by the PEI Foundation > + @param NotifyDescriptor Address of the notification descriptor data > structure. > + @param Ppi Address of the PPI that was installed. > + > + @retval EFI_SUCCESS Successfully update the PCH SPI PPI reference > + @retval EFI_NOT_FOUND An error occurred locating a required interface > + @retval EFI_NOT_SUPPORTED > + > +**/ > +EFI_STATUS > +EFIAPI > +SpiPpiNotifyCallback ( > + IN EFI_PEI_SERVICES **PeiServices, > + IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor, > + IN VOID *Ppi > + ) > +{ > + EFI_STATUS Status; > + EFI_HOB_GUID_TYPE *GuidHob; > + PCH_SPI_PPI *PchSpiPpi; > + SPI_FLASH_DEBUG_CONTEXT *Context; > + > + GuidHob = GetFirstGuidHob (&gSpiFlashDebugHobGuid); if (GuidHob == > + NULL) { > + return EFI_NOT_FOUND; > + } > + Context = GET_GUID_HOB_DATA (GuidHob); > + > + Status = PeiServicesLocatePpi ( > + &gPchSpiPpiGuid, > + 0, > + NULL, > + (VOID **) &PchSpiPpi > + ); > + if (EFI_ERROR (Status)) { > + return EFI_NOT_FOUND; > + } > + > + Context->PchSpiPpi = PchSpiPpi; > + > + return EFI_SUCCESS; > +} > + > +EFI_PEI_NOTIFY_DESCRIPTOR mSpiPpiNotifyList[] = { > + { > + (EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK | > EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST), > + &gPchSpiPpiGuid, > + SpiPpiNotifyCallback > + } > +}; > + > +/** > + Common function to write trace data to a chosen debug interface like > + UART Serial device, USB Serial device or Trace Hub device > + > + @param Buffer Point of data buffer which need to be writed. > + @param NumberOfBytes Number of output bytes which are cached in > Buffer. > + > +**/ > +UINTN > +EFIAPI > +SerialPortWrite ( > + IN UINT8 *Buffer, > + IN UINTN NumberOfBytes > + ) > +{ > + EFI_STATUS Status; > + EFI_HOB_GUID_TYPE *GuidHob; > + SPI_FLASH_DEBUG_CONTEXT *Context; > + UINT32 BytesWritten; > + UINT32 SourceBufferOffset; > + UINT32 NvMessageAreaSize; > + UINT32 LinearOffset; > + > + BytesWritten = NumberOfBytes; > + SourceBufferOffset = 0; > + > + NvMessageAreaSize = (UINT32) FixedPcdGet32 > + (PcdFlashNvDebugMessageSize); > + > + if (NumberOfBytes == 0 || NvMessageAreaSize == 0) { > + return 0; > + } > + GuidHob = GetFirstGuidHob (&gSpiFlashDebugHobGuid); if (GuidHob == > + NULL) { > + return 0; > + } > + Context = GET_GUID_HOB_DATA (GuidHob); if (Context == NULL || > + Context->PchSpiPpi == NULL || Context->CurrentWriteOffset >= > + Context->NvMessageAreaSize) { > + return 0; > + } > + > + if ((Context->CurrentWriteOffset + NumberOfBytes) / NvMessageAreaSize > > 0) { > + LinearOffset = (UINT32) (FixedPcdGet32 (PcdFlashNvDebugMessageBase) - > FixedPcdGet32 (PcdFlashAreaBaseAddress)); > + Status = Context->PchSpiPpi->FlashErase ( > + Context->PchSpiPpi, > + FlashRegionBios, > + LinearOffset, > + NvMessageAreaSize > + ); > + if (!EFI_ERROR (Status)) { > + Context->CurrentWriteOffset = 0; > + } else { > + return 0; > + } > + } > + > + if (NumberOfBytes > NvMessageAreaSize) { > + BytesWritten = NvMessageAreaSize; > + SourceBufferOffset = NumberOfBytes - NvMessageAreaSize; } > + > + LinearOffset = (FixedPcdGet32 (PcdFlashNvDebugMessageBase) + > + Context->CurrentWriteOffset) - FixedPcdGet32 > + (PcdFlashAreaBaseAddress); > + > + Status = Context->PchSpiPpi->FlashWrite ( > + Context->PchSpiPpi, > + FlashRegionBios, > + LinearOffset, > + BytesWritten, > + (UINT8 *) &Buffer[SourceBufferOffset] > + ); > + if (!EFI_ERROR (Status)) { > + Context->CurrentWriteOffset += BytesWritten; > + return BytesWritten; > + } > + > + return 0; > +} > + > +/** > + Common function to Read data from UART serial device, USB serial device > and save the datas in buffer. > + > + @param Buffer Point of data buffer which need to be writed. > + @param NumberOfBytes Number of output bytes which are cached in > Buffer. > + > + @retval 0 Read data failed, no data is to be read. > + @retval >0 Actual number of bytes read from debug device. > + > +**/ > +UINTN > +EFIAPI > +SerialPortRead ( > + OUT UINT8 *Buffer, > + IN UINTN NumberOfBytes > +) > +{ > + return 0; > +} > + > +/** > + Polls a serial device to see if there is any data waiting to be read. > + > + Polls a serial device to see if there is any data waiting to be read. > + If there is data waiting to be read from the serial device, then TRUE is > returned. > + If there is no data waiting to be read from the serial device, then FALSE > is > returned. > + > + @retval TRUE Data is waiting to be read from the serial device. > + @retval FALSE There is no data waiting to be read from the > serial > device. > + > +**/ > +BOOLEAN > +EFIAPI > +SerialPortPoll ( > + VOID > + ) > +{ > + return FALSE; > +} > + > +/** > + Sets the control bits on a serial device. > + > + @param Control Sets the bits of Control that are settable. > + > + @retval RETURN_SUCCESS The new control bits were set on the serial > device. > + @retval RETURN_UNSUPPORTED The serial device does not support this > operation. > + @retval RETURN_DEVICE_ERROR The serial device is not functioning > correctly. > + > +**/ > +RETURN_STATUS > +EFIAPI > +SerialPortSetControl ( > + IN UINT32 Control > + ) > +{ > + return EFI_UNSUPPORTED; > +} > + > +/** > + Retrieve the status of the control bits on a serial device. > + > + @param Control A pointer to return the current control > signals > from the serial device. > + > + @retval RETURN_SUCCESS The control bits were read from the serial > device. > + @retval RETURN_UNSUPPORTED The serial device does not support this > operation. > + @retval RETURN_DEVICE_ERROR The serial device is not functioning > correctly. > + > +**/ > +RETURN_STATUS > +EFIAPI > +SerialPortGetControl ( > + OUT UINT32 *Control > + ) > +{ > + return EFI_UNSUPPORTED; > +} > + > +/** > + Sets the baud rate, receive FIFO depth, transmit/receice time out, > +parity, > + data bits, and stop bits on a serial device. > + > + @param BaudRate The requested baud rate. A BaudRate value of 0 > will use the > + device's default interface speed. > + On output, the value actually set. > + @param ReveiveFifoDepth The requested depth of the FIFO on the receive > side of the > + serial interface. A ReceiveFifoDepth value of 0 > will use > + the device's default FIFO depth. > + On output, the value actually set. > + @param Timeout The requested time out for a single character in > microseconds. > + This timeout applies to both the transmit and > receive side > of the > + interface. A Timeout value of 0 will use the > device's default > time > + out value. > + On output, the value actually set. > + @param Parity The type of parity to use on this serial device. > A > Parity value of > + DefaultParity will use the device's default > parity value. > + On output, the value actually set. > + @param DataBits The number of data bits to use on the serial > device. > A DataBits > + vaule of 0 will use the device's default data > bit setting. > + On output, the value actually set. > + @param StopBits The number of stop bits to use on this serial > device. > A StopBits > + value of DefaultStopBits will use the device's > default > number of > + stop bits. > + On output, the value actually set. > + > + @retval RETURN_SUCCESS The new attributes were set on the serial > device. > + @retval RETURN_UNSUPPORTED The serial device does not support > this operation. > + @retval RETURN_INVALID_PARAMETER One or more of the attributes has > an unsupported value. > + @retval RETURN_DEVICE_ERROR The serial device is not functioning > correctly. > + > +**/ > +RETURN_STATUS > +EFIAPI > +SerialPortSetAttributes ( > + IN OUT UINT64 *BaudRate, > + IN OUT UINT32 *ReceiveFifoDepth, > + IN OUT UINT32 *Timeout, > + IN OUT EFI_PARITY_TYPE *Parity, > + IN OUT UINT8 *DataBits, > + IN OUT EFI_STOP_BITS_TYPE *StopBits > + ) > +{ > + return EFI_UNSUPPORTED; > +} > + > +/** > + Initialize the serial device hardware. > + > + If no initialization is required, then return RETURN_SUCCESS. > + If the serial device was successfully initialized, then return > RETURN_SUCCESS. > + If the serial device could not be initialized, then return > RETURN_DEVICE_ERROR. > + > + @retval RETURN_SUCCESS The serial device was initialized. > + @retval RETURN_DEVICE_ERROR The serial device could not be initialized. > + > +**/ > +RETURN_STATUS > +EFIAPI > +SerialPortInitialize ( > + VOID > + ) > +{ > + EFI_STATUS Status; > + SPI_FLASH_DEBUG_CONTEXT *Context; > + > + Context = (SPI_FLASH_DEBUG_CONTEXT *) BuildGuidHob > + (&gSpiFlashDebugHobGuid, sizeof (SPI_FLASH_DEBUG_CONTEXT)); if > (Context == NULL) { > + return EFI_DEVICE_ERROR; > + } > + ZeroMem ((VOID *) Context, sizeof (SPI_FLASH_DEBUG_CONTEXT)); > + > + Status = PeiServicesNotifyPpi (&mSpiPpiNotifyList[0]); if (EFI_ERROR > + (Status)) { > + return EFI_DEVICE_ERROR; > + } > + > + // > + // Perform silicon specific initialization required to enable write to SPI > flash. > + // > + Status = SpiServiceInit (); > + if (EFI_ERROR (Status)) { > + Status = EFI_DEVICE_ERROR; > + } > + > + return Status; > +} > -- > 2.16.2.windows.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel