From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: mx.groups.io; dkim=pass header.i=@messagingengine.com header.s=fm3 header.b=onmuACBE; spf=permerror, err=too many SPF records (domain: system76.com, ip: 66.111.4.26, mailfrom: jeremy@system76.com) Received: from out2-smtp.messagingengine.com (out2-smtp.messagingengine.com [66.111.4.26]) by groups.io with SMTP; Mon, 23 Sep 2019 15:37:43 -0700 Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailout.nyi.internal (Postfix) with ESMTP id 8F49421B34; Mon, 23 Sep 2019 18:37:42 -0400 (EDT) Received: from imap2 ([10.202.2.52]) by compute1.internal (MEProxy); Mon, 23 Sep 2019 18:37:42 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to:x-me-proxy :x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm3; bh=cVENtN gI4rUOcEErjVDu3pOigarMrnFtxN5chnffouA=; b=onmuACBEmMxQvmBGM7CpJ8 tcUjDwq5MU/PiYxg8nCJcY6TwvxC6xPN1O9wCeo+4PYFK1pzynw+qcaKeWS+s0N3 l02rq9BtoANUFjiJFmAR3dEvcUQ3LRXE2tPkImL8xjSGNS2urULRzo/Lq0Ps7tzF LJmhGLytTCtYv/mX+90SZ48+VVN53k90qdmf3LaOWrpOrJGW0QEU+0YqhoQzb9yY zwwmXAd7v9UynWc5KdkvWkuaCa0gzVhPpDqZ0JWnYll3l0dq9C+Q7NGXmzDcuZqT V6R9BDkhTObSP9VPk47m+WFHHkGpxRQH22zTHFAcNe7Ti1XPArFMphah8xBkkyWw == X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedufedrvdelgdduvdcutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenuc fjughrpefofgggkfgjfhffhffvufgtsehttdertderreejnecuhfhrohhmpedflfgvrhgv mhihucfuohhllhgvrhdfuceojhgvrhgvmhihsehshihsthgvmhejiedrtghomheqnecuff homhgrihhnpehtihgrnhhotghorhgvrdhorhhgnecurfgrrhgrmhepmhgrihhlfhhrohhm pehjvghrvghmhiesshihshhtvghmjeeirdgtohhmnecuvehluhhsthgvrhfuihiivgepfe X-ME-Proxy: Received: by mailuser.nyi.internal (Postfix, from userid 501) id 366ECE00A5; Mon, 23 Sep 2019 18:37:42 -0400 (EDT) X-Mailer: MessagingEngine.com Webmail Interface User-Agent: Cyrus-JMAP/3.1.7-238-g170a812-fmstable-20190913v1 Mime-Version: 1.0 Message-Id: <9e3b915e-5b44-4d93-8907-f3890bfe4434@www.fastmail.com> In-Reply-To: <20190920184030.6148-8-michael.a.kubacki@intel.com> References: <20190920184030.6148-1-michael.a.kubacki@intel.com> <20190920184030.6148-8-michael.a.kubacki@intel.com> Date: Mon, 23 Sep 2019 16:37:21 -0600 From: "Jeremy Soller" To: "Michael A Kubacki" , devel@edk2.groups.io Cc: "Chasel Chiu" , "Nathaniel L Desimone" , "Ankit Sinha" Subject: Re: [edk2-platforms][PATCH V1 07/12] KabylakeOpenBoardPkg: Add PeiSerialPortLibSpiFlash Content-Type: text/plain Reviewed-by: Jeremy Soller On Fri, Sep 20, 2019, at 12:40 PM, Michael Kubacki wrote: > REF:https://bugzilla.tianocore.org/show_bug.cgi?id=2207 > > PeiSerialPortLibSpiFlash is currently used for early boot closed > chassis debug on production systems such as the System 76 Galago Pro > laptop. This change moves the library to KabylakeOpenBoardPkg from > ClevoOpenBoardPkg since the Clevo package is being removes for > code consolidation. > > Cc: Chasel Chiu > Cc: Nate DeSimone > Cc: Ankit Sinha > Cc: Jeremy Soller > Signed-off-by: Michael Kubacki > --- > Platform/Intel/KabylakeOpenBoardPkg/OpenBoardPkg.dec > | 6 + > > Platform/Intel/KabylakeOpenBoardPkg/Library/PeiSerialPortLibSpiFlash/PeiSerialPortLibSpiFlash.inf | 50 +++ > > Platform/Intel/KabylakeOpenBoardPkg/Library/PeiSerialPortLibSpiFlash/PeiSerialPortLibSpiFlash.c | 320 ++++++++++++++++++++ > 3 files changed, 376 insertions(+) > > diff --git a/Platform/Intel/KabylakeOpenBoardPkg/OpenBoardPkg.dec > b/Platform/Intel/KabylakeOpenBoardPkg/OpenBoardPkg.dec > index 68977d081e..383c34537d 100644 > --- a/Platform/Intel/KabylakeOpenBoardPkg/OpenBoardPkg.dec > +++ b/Platform/Intel/KabylakeOpenBoardPkg/OpenBoardPkg.dec > @@ -29,6 +29,8 @@ gBoardModuleTokenSpaceGuid = {0x72d1fff7, > 0xa42a, 0x4219, {0xb9, 0x9 > > 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}} > @@ -65,6 +67,10 @@ > gBoardModuleTokenSpaceGuid.PcdSwSmiDTbtEnumerate|0xF7|UINT8|0x000000110 > > gBoardModuleTokenSpaceGuid.PcdSmcExtSmiBitPosition|0x01|UINT8|0x90000015 > > +gBoardModuleTokenSpaceGuid.PcdFlashNvDebugMessageBase|0x00000000|UINT32|0x90000030 > +gBoardModuleTokenSpaceGuid.PcdFlashNvDebugMessageSize|0x00000000|UINT32|0x90000031 > +gBoardModuleTokenSpaceGuid.PcdFlashNvDebugMessageOffset|0x00000000|UINT32|0x90000032 > + > [PcdsDynamic] > > # Board GPIO Table > diff --git > a/Platform/Intel/KabylakeOpenBoardPkg/Library/PeiSerialPortLibSpiFlash/PeiSerialPortLibSpiFlash.inf b/Platform/Intel/KabylakeOpenBoardPkg/Library/PeiSerialPortLibSpiFlash/PeiSerialPortLibSpiFlash.inf > new file mode 100644 > index 0000000000..ed93d0785f > --- /dev/null > +++ > b/Platform/Intel/KabylakeOpenBoardPkg/Library/PeiSerialPortLibSpiFlash/PeiSerialPortLibSpiFlash.inf > @@ -0,0 +1,50 @@ > +### @file > +# Component description file for Serial I/O Port library to write to > SPI flash. > +# > +# Copyright (c) 2019, Intel Corporation. All rights reserved.
> +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[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 > + KabylakeOpenBoardPkg/OpenBoardPkg.dec > + > +[Sources] > + PeiSerialPortLibSpiFlash.c > + > +[Ppis] > + gPchSpiPpiGuid > + > +[Guids] > + gSpiFlashDebugHobGuid > + > +[Pcd] > + gMinPlatformPkgTokenSpaceGuid.PcdFlashAreaBaseAddress ## > CONSUMES > + gBoardModuleTokenSpaceGuid.PcdFlashNvDebugMessageBase ## > CONSUMES > + gBoardModuleTokenSpaceGuid.PcdFlashNvDebugMessageSize ## > CONSUMES > diff --git > a/Platform/Intel/KabylakeOpenBoardPkg/Library/PeiSerialPortLibSpiFlash/PeiSerialPortLibSpiFlash.c b/Platform/Intel/KabylakeOpenBoardPkg/Library/PeiSerialPortLibSpiFlash/PeiSerialPortLibSpiFlash.c > new file mode 100644 > index 0000000000..0230149a38 > --- /dev/null > +++ > b/Platform/Intel/KabylakeOpenBoardPkg/Library/PeiSerialPortLibSpiFlash/PeiSerialPortLibSpiFlash.c > @@ -0,0 +1,320 @@ > +/** @file > + Serial I/O Port library implementation for output to SPI flash > + > +Copyright (c) 2019, Intel Corporation. All rights reserved.
> +SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +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 >= 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 > >