From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 134.134.136.126, mailfrom: chasel.chiu@intel.com) Received: from mga18.intel.com (mga18.intel.com [134.134.136.126]) by groups.io with SMTP; Wed, 25 Sep 2019 02:53:13 -0700 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga106.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 25 Sep 2019 02:53:12 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.64,547,1559545200"; d="scan'208";a="203581476" Received: from kmsmsx157.gar.corp.intel.com ([172.21.138.134]) by fmsmga001.fm.intel.com with ESMTP; 25 Sep 2019 02:53:11 -0700 Received: from pgsmsx112.gar.corp.intel.com ([169.254.3.2]) by kmsmsx157.gar.corp.intel.com ([169.254.5.132]) with mapi id 14.03.0439.000; Wed, 25 Sep 2019 17:53:10 +0800 From: "Chiu, Chasel" To: "Kubacki, Michael A" , "devel@edk2.groups.io" CC: "Desimone, Nathaniel L" , "Sinha, Ankit" , Jeremy Soller Subject: Re: [edk2-platforms][PATCH V2 07/15] KabylakeOpenBoardPkg: Add PeiSerialPortLibSpiFlash Thread-Topic: [edk2-platforms][PATCH V2 07/15] KabylakeOpenBoardPkg: Add PeiSerialPortLibSpiFlash Thread-Index: AQHVcwPY06Zm8sHPqkC2P76yUwNsaqc8KANw Date: Wed, 25 Sep 2019 09:53:09 +0000 Message-ID: <3C3EFB470A303B4AB093197B6777CCEC504E21B3@PGSMSX112.gar.corp.intel.com> References: <20190924181248.12816-1-michael.a.kubacki@intel.com> <20190924181248.12816-8-michael.a.kubacki@intel.com> In-Reply-To: <20190924181248.12816-8-michael.a.kubacki@intel.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: dlp-product: dlpe-windows dlp-version: 11.2.0.6 dlp-reaction: no-action x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiM2YyYzA0ZjYtNGIxYy00MjM1LTlkNWUtMDE3MTBlMDEyODQzIiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX05UIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE3LjEwLjE4MDQuNDkiLCJUcnVzdGVkTGFiZWxIYXNoIjoiTTdYTTJBWjRoZkk5MkUwcHg5UGQ0MHAwMjBheTlSZVwvU1NEZmI3UkhRTUtNTW1WOW15Z2tYOTVOZWRpbkVHZW4ifQ== x-ctpclassification: CTP_NT x-originating-ip: [172.30.20.206] MIME-Version: 1.0 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Reviewed-by: Chasel Chiu > -----Original Message----- > From: Kubacki, Michael A > Sent: Wednesday, September 25, 2019 2:13 AM > To: devel@edk2.groups.io > Cc: Chiu, Chasel ; Desimone, Nathaniel L > ; Sinha, Ankit ; > Jeremy Soller > Subject: [edk2-platforms][PATCH V2 07/15] KabylakeOpenBoardPkg: Add > PeiSerialPortLibSpiFlash >=20 > REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3D2207 >=20 > PeiSerialPortLibSpiFlash is currently used for early boot closed chassis = debug > on production systems such as the System 76 Galago Pro laptop. This chang= e > moves the library to KabylakeOpenBoardPkg from ClevoOpenBoardPkg since > the Clevo package is being removes for code consolidation. >=20 > Cc: Chasel Chiu > Cc: Nate DeSimone > Cc: Ankit Sinha > Cc: Jeremy Soller > Signed-off-by: Michael Kubacki > --- > Platform/Intel/KabylakeOpenBoardPkg/OpenBoardPkg.dec > | 6 + >=20 > Platform/Intel/KabylakeOpenBoardPkg/Library/PeiSerialPortLibSpiFlash/PeiS > erialPortLibSpiFlash.inf | 50 +++ >=20 > Platform/Intel/KabylakeOpenBoardPkg/Library/PeiSerialPortLibSpiFlash/PeiS > erialPortLibSpiFlash.c | 320 ++++++++++++++++++++ > 3 files changed, 376 insertions(+) >=20 > 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 =3D > {0x72d1fff7, 0xa42a, 0x4219, {0xb9, 0x9 >=20 > gTianoLogoGuid =3D {0x7BB28B99, 0x61BB, > 0x11D5, {0x9A, 0x5D, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D}} >=20 > +gSpiFlashDebugHobGuid =3D {0xcaaaf418, 0x38a5, > 0x4d49, {0xbe, 0x74, 0xe6, 0x06, 0xe4, 0x02, 0x6d, 0x25}} > + > gTbtInfoHobGuid =3D {0x74a81eaa, 0x033c, > 0x4783, {0xbe, 0x2b, 0x84, 0x85, 0x74, 0xa6, 0x97, 0xb7}} >=20 > gPlatformModuleTokenSpaceGuid =3D {0x69d13bf0, 0xaf91, > 0x4d96, {0xaa, 0x9f, 0x21, 0x84, 0xc5, 0xce, 0x3b, 0xc0}} > @@ -65,6 +67,10 @@ > gBoardModuleTokenSpaceGuid.PcdSwSmiDTbtEnumerate|0xF7|UINT8|0x000 > 000110 >=20 >=20 > gBoardModuleTokenSpaceGuid.PcdSmcExtSmiBitPosition|0x01|UINT8|0x900 > 00015 >=20 > +gBoardModuleTokenSpaceGuid.PcdFlashNvDebugMessageBase|0x00000000 > |UINT32 > +|0x90000030 > +gBoardModuleTokenSpaceGuid.PcdFlashNvDebugMessageSize|0x00000000 > |UINT32 > +|0x90000031 > +gBoardModuleTokenSpaceGuid.PcdFlashNvDebugMessageOffset|0x000000 > 00|UINT > +32|0x90000032 > + > [PcdsDynamic] >=20 > # Board GPIO Table > diff --git > a/Platform/Intel/KabylakeOpenBoardPkg/Library/PeiSerialPortLibSpiFlash/Pe= i > SerialPortLibSpiFlash.inf > b/Platform/Intel/KabylakeOpenBoardPkg/Library/PeiSerialPortLibSpiFlash/Pe > iSerialPortLibSpiFlash.inf > new file mode 100644 > index 0000000000..ed93d0785f > --- /dev/null > +++ b/Platform/Intel/KabylakeOpenBoardPkg/Library/PeiSerialPortLibSpiFla > +++ sh/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 =3D 0x00010005 > + BASE_NAME =3D PeiSerialPortLibFlash > + FILE_GUID =3D > 35A3BA89-04BE-409C-A3CA-DEF6B510F80F > + VERSION_STRING =3D 1.1 > + MODULE_TYPE =3D PEIM > + LIBRARY_CLASS =3D SerialPortLib|PEIM PEI_CORE > +# > +# The following information is for reference only and not required by th= e > build tools. > +# > +# VALID_ARCHITECTURES =3D 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/Pe= i > SerialPortLibSpiFlash.c > b/Platform/Intel/KabylakeOpenBoardPkg/Library/PeiSerialPortLibSpiFlash/Pe > iSerialPortLibSpiFlash.c > new file mode 100644 > index 0000000000..0230149a38 > --- /dev/null > +++ b/Platform/Intel/KabylakeOpenBoardPkg/Library/PeiSerialPortLibSpiFla > +++ sh/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 =3D GetFirstGuidHob (&gSpiFlashDebugHobGuid); if (GuidHob > =3D=3D > + NULL) { > + return EFI_NOT_FOUND; > + } > + Context =3D GET_GUID_HOB_DATA (GuidHob); > + > + Status =3D PeiServicesLocatePpi ( > + &gPchSpiPpiGuid, > + 0, > + NULL, > + (VOID **) &PchSpiPpi > + ); > + if (EFI_ERROR (Status)) { > + return EFI_NOT_FOUND; > + } > + > + Context->PchSpiPpi =3D PchSpiPpi; > + > + return EFI_SUCCESS; > +} > + > +EFI_PEI_NOTIFY_DESCRIPTOR mSpiPpiNotifyList[] =3D { > + { > + (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 =3D NumberOfBytes; > + SourceBufferOffset =3D 0; > + > + NvMessageAreaSize =3D (UINT32) FixedPcdGet32 > + (PcdFlashNvDebugMessageSize); > + > + if (NumberOfBytes =3D=3D 0 || NvMessageAreaSize =3D=3D 0) { > + return 0; > + } > + GuidHob =3D GetFirstGuidHob (&gSpiFlashDebugHobGuid); if (GuidHob > =3D=3D > + NULL) { > + return 0; > + } > + Context =3D GET_GUID_HOB_DATA (GuidHob); if (Context =3D=3D NULL || > + Context->PchSpiPpi =3D=3D NULL || Context->CurrentWriteOffset >=3D > NvMessageAreaSize) { > + return 0; > + } > + > + if ((Context->CurrentWriteOffset + NumberOfBytes) / NvMessageAreaSize > > 0) { > + LinearOffset =3D (UINT32) (FixedPcdGet32 > (PcdFlashNvDebugMessageBase) - FixedPcdGet32 > (PcdFlashAreaBaseAddress)); > + Status =3D Context->PchSpiPpi->FlashErase ( > + Context->PchSpiPpi, > + FlashRegionBios, > + LinearOffset, > + NvMessageAreaSize > + ); > + if (!EFI_ERROR (Status)) { > + Context->CurrentWriteOffset =3D 0; > + } else { > + return 0; > + } > + } > + > + if (NumberOfBytes > NvMessageAreaSize) { > + BytesWritten =3D NvMessageAreaSize; > + SourceBufferOffset =3D NumberOfBytes - NvMessageAreaSize; } > + > + LinearOffset =3D (FixedPcdGet32 (PcdFlashNvDebugMessageBase) + > + Context->CurrentWriteOffset) - FixedPcdGet32 > + (PcdFlashAreaBaseAddress); > + > + Status =3D Context->PchSpiPpi->FlashWrite ( > + Context->PchSpiPpi, > + FlashRegionBios, > + LinearOffset, > + BytesWritten, > + (UINT8 *) > &Buffer[SourceBufferOffset] > + ); > + if (!EFI_ERROR (Status)) { > + Context->CurrentWriteOffset +=3D 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 FA= LSE 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 =3D (SPI_FLASH_DEBUG_CONTEXT *) BuildGuidHob > + (&gSpiFlashDebugHobGuid, sizeof (SPI_FLASH_DEBUG_CONTEXT)); if > (Context =3D=3D NULL) { > + return EFI_DEVICE_ERROR; > + } > + ZeroMem ((VOID *) Context, sizeof (SPI_FLASH_DEBUG_CONTEXT)); > + > + Status =3D PeiServicesNotifyPpi (&mSpiPpiNotifyList[0]); if (EFI_ERRO= R > + (Status)) { > + return EFI_DEVICE_ERROR; > + } > + > + // > + // Perform silicon specific initialization required to enable write to= SPI > flash. > + // > + Status =3D SpiServiceInit (); > + if (EFI_ERROR (Status)) { > + Status =3D EFI_DEVICE_ERROR; > + } > + > + return Status; > +} > -- > 2.16.2.windows.1