Hi Benjamin, Please see comments below inline.
Thanks, Nate > -----Original Message----- > From: Benjamin Doron <benjamin.doro...@gmail.com> > Sent: Tuesday, September 6, 2022 10:27 AM > To: devel@edk2.groups.io > Cc: Chiu, Chasel <chasel.c...@intel.com>; Chaganty, Rangasai V > <rangasai.v.chaga...@intel.com>; Oram, Isaac W > <isaac.w.o...@intel.com>; Desimone, Nathaniel L > <nathaniel.l.desim...@intel.com>; Sinha, Ankit <ankit.si...@intel.com> > Subject: [edk2-devel][edk2-platforms][PATCH v1 3/3] > KabylakeOpenBoardPkg/AspireVn7Dash572G: Hook-up HDMI debug port to > build > > HDMI port can be used with I2cHdmiDebugSerialPortLib, for debugging in all > phases. > > Cc: Chasel Chiu <chasel.c...@intel.com> > Cc: Sai Chaganty <rangasai.v.chaga...@intel.com> > Cc: Isaac Oram <isaac.w.o...@intel.com> > Cc: Nate DeSimone <nathaniel.l.desim...@intel.com> > Cc: Ankit Sinha <ankit.si...@intel.com> > Signed-off-by: Benjamin Doron <benjamin.doro...@gmail.com> > --- > .../AspireVn7Dash572G/OpenBoardPkg.dsc | 85 +++++++++++++++---- > .../AspireVn7Dash572G/OpenBoardPkg.fdf | 11 ++- > .../AspireVn7Dash572G/OpenBoardPkgPcd.dsc | 54 ++++++++++-- > 3 files changed, 121 insertions(+), 29 deletions(-) > > diff --git > a/Platform/Intel/KabylakeOpenBoardPkg/AspireVn7Dash572G/OpenBoardPkg.dsc > b/Platform/Intel/KabylakeOpenBoardPkg/AspireVn7Dash572G/OpenBoardPkg.dsc > index 261f141056f5..c71b7169a38a 100644 > --- a/Platform/Intel/KabylakeOpenBoardPkg/AspireVn7Dash572G/OpenBoardPkg.dsc > +++ b/Platform/Intel/KabylakeOpenBoardPkg/AspireVn7Dash572G/OpenBoardPkg.dsc > @@ -25,9 +25,10 @@ > # > # Debug logging > # > + DEFINE USE_HDMI_DEBUG_PORT = FALSE This build flag is redundant with PcdI2cHdmiDebugPortEnable. Please remove it. > DEFINE USE_PEI_SPI_LOGGING = FALSE > DEFINE USE_MEMORY_LOGGING = FALSE > - DEFINE RELEASE_LOGGING = ($(USE_PEI_SPI_LOGGING) || > $(USE_MEMORY_LOGGING)) > + DEFINE RELEASE_LOGGING = ($(USE_HDMI_DEBUG_PORT) || > $(USE_PEI_SPI_LOGGING) || $(USE_MEMORY_LOGGING)) This will turn into: !if gKabylakeOpenBoardPkgTokenSpaceGuid.PcdI2cHdmiDebugPortEnable == TRUE DEFINE RELEASE_LOGGING = TRUE !else DEFINE RELEASE_LOGGING = ($(USE_PEI_SPI_LOGGING) || $(USE_MEMORY_LOGGING)) !endif > DEFINE TESTING = TRUE > > PLATFORM_NAME = $(PLATFORM_PACKAGE) > @@ -205,6 +206,15 @@ > ####################################### > DebugLib|MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull.inf > > +!if $(USE_HDMI_DEBUG_PORT) == TRUE All of these would be replaced with: !if gKabylakeOpenBoardPkgTokenSpaceGuid.PcdI2cHdmiDebugPortEnable == TRUE > + DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf > + > + ####################################### > + # Board-specific/Silicon Package > + ####################################### > + > SerialPortLib|$(PLATFORM_BOARD_PACKAGE)/Library/I2cHdmiDebugSerialPortLib/SecI2cHdmiDebugSerialPortLib.inf > +!endif > + > ####################################### > # Platform Package > ####################################### > @@ -277,7 +287,7 @@ > # Edk2 Packages > ####################################### > # In-memory logging may require too many services for early core debug output > -!if $(USE_MEMORY_LOGGING) == TRUE > +!if ($(USE_MEMORY_LOGGING) == TRUE || $(USE_HDMI_DEBUG_PORT) == TRUE) !if ($(USE_MEMORY_LOGGING) == TRUE || gKabylakeOpenBoardPkgTokenSpaceGuid.PcdI2cHdmiDebugPortEnable == TRUE > > DebugLib|MdeModulePkg/Library/PeiDxeDebugLibReportStatusCode/PeiDxeDebugLibReportStatusCode.inf > !endif > > @@ -285,7 +295,7 @@ > ####################################### > # Edk2 Packages > ####################################### > -!if $(USE_MEMORY_LOGGING) == TRUE > +!if ($(USE_MEMORY_LOGGING) == TRUE || $(USE_HDMI_DEBUG_PORT) == TRUE) > > DebugLib|MdeModulePkg/Library/PeiDxeDebugLibReportStatusCode/PeiDxeDebugLibReportStatusCode.inf > !endif > > @@ -322,7 +332,7 @@ > ####################################### > # Edk2 Packages > ####################################### > -!if $(USE_MEMORY_LOGGING) == TRUE > +!if ($(USE_MEMORY_LOGGING) == TRUE || $(USE_HDMI_DEBUG_PORT) == TRUE) > > DebugLib|MdeModulePkg/Library/PeiDxeDebugLibReportStatusCode/PeiDxeDebugLibReportStatusCode.inf > !endif > > @@ -336,7 +346,7 @@ > # Edk2 Packages > ####################################### > # In-memory logging may require too many services for early core debug output > -!if $(USE_MEMORY_LOGGING) == TRUE > +!if ($(USE_MEMORY_LOGGING) == TRUE || $(USE_HDMI_DEBUG_PORT) == TRUE) > > DebugLib|MdeModulePkg/Library/PeiDxeDebugLibReportStatusCode/PeiDxeDebugLibReportStatusCode.inf > !endif > > @@ -344,7 +354,7 @@ > ####################################### > # Edk2 Packages > ####################################### > -!if $(USE_MEMORY_LOGGING) == TRUE > +!if ($(USE_MEMORY_LOGGING) == TRUE || $(USE_HDMI_DEBUG_PORT) == TRUE) > > DebugLib|MdeModulePkg/Library/PeiDxeDebugLibReportStatusCode/PeiDxeDebugLibReportStatusCode.inf > !endif > > @@ -363,7 +373,21 @@ > > TestPointCheckLib|$(PLATFORM_PACKAGE)/Test/Library/TestPointCheckLib/SmmTestPointCheckLib.inf > !endif > > -# TODO: DebugLib override for UEFI_DRIVER and UEFI_APPLICATION? > +[LibraryClasses.common.UEFI_DRIVER] > + ####################################### > + # Edk2 Packages > + ####################################### > +!if ($(USE_MEMORY_LOGGING) == TRUE || $(USE_HDMI_DEBUG_PORT) == TRUE) > + > DebugLib|MdeModulePkg/Library/PeiDxeDebugLibReportStatusCode/PeiDxeDebugLibReportStatusCode.inf > +!endif > + > +[LibraryClasses.common.UEFI_APPLICATION] > + ####################################### > + # Edk2 Packages > + ####################################### > +!if ($(USE_MEMORY_LOGGING) == TRUE || $(USE_HDMI_DEBUG_PORT) == TRUE) > + > DebugLib|MdeModulePkg/Library/PeiDxeDebugLibReportStatusCode/PeiDxeDebugLibReportStatusCode.inf > +!endif > > # TODO: Add and improve feature support > ####################################### > @@ -389,6 +413,9 @@ > !if $(USE_MEMORY_LOGGING) == TRUE > > SerialPortLib|MdeModulePkg/Library/PeiDxeSerialPortLibMem/PeiSerialPortLibMem.inf > !endif > +!endif > +!if $(USE_HDMI_DEBUG_PORT) == TRUE > + > SerialPortLib|$(PLATFORM_BOARD_PACKAGE)/Library/I2cHdmiDebugSerialPortLib/PeiI2cHdmiDebugSerialPortLib.inf > !endif > <PcdsFixedAtBuild> > > gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeUseSerial|$(RELEASE_LOGGING) > @@ -517,14 +544,24 @@ > ####################################### > # Edk2 Packages > ####################################### > + MdeModulePkg/Core/Dxe/DxeMain.inf { > + <LibraryClasses> > + # Can debug CpuExceptionHandlerLib > +!if $(USE_HDMI_DEBUG_PORT) == TRUE > + > SerialPortLib|$(PLATFORM_BOARD_PACKAGE)/Library/I2cHdmiDebugSerialPortLib/DxeI2cHdmiDebugSerialPortLib.inf > +!endif > + } I recommend doing this LibraryClass override more generally using a [LibraryClasses.common.DXE_CORE] instead of overriding this specific instance of DxeMain. > > MdeModulePkg/Universal/StatusCodeHandler/RuntimeDxe/StatusCodeHandlerRuntimeDxe.inf > { > <LibraryClasses> > DebugLib|MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull.inf > !if $(USE_MEMORY_LOGGING) == TRUE > > SerialPortLib|MdeModulePkg/Library/PeiDxeSerialPortLibMem/DxeSerialPortLibMem.inf > +!endif > +!if $(USE_HDMI_DEBUG_PORT) == TRUE > + > SerialPortLib|$(PLATFORM_BOARD_PACKAGE)/Library/I2cHdmiDebugSerialPortLib/RuntimeDxeI2cHdmiDebugSerialPortLib.inf > !endif > <PcdsFixedAtBuild> > - > gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeUseSerial|$(USE_MEMORY_LOGGING) > + > gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeUseSerial|($(USE_MEMORY_LOGGING) > || $(USE_HDMI_DEBUG_PORT)) > gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeMemorySize|512 > } > # TODO: Still requires a little more thought > @@ -533,9 +570,12 @@ > DebugLib|MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull.inf > !if $(USE_MEMORY_LOGGING) == TRUE > > SerialPortLib|MdeModulePkg/Library/PeiDxeSerialPortLibMem/SmmSerialPortLibMem.inf > +!endif > +!if $(USE_HDMI_DEBUG_PORT) == TRUE > + > SerialPortLib|$(PLATFORM_BOARD_PACKAGE)/Library/I2cHdmiDebugSerialPortLib/SmmI2cHdmiDebugSerialPortLib.inf > !endif > <PcdsFixedAtBuild> > - > gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeUseSerial|$(USE_MEMORY_LOGGING) > + > gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeUseSerial|($(USE_MEMORY_LOGGING) > || $(USE_HDMI_DEBUG_PORT)) > gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeMemorySize|512 > } > MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.inf > @@ -548,12 +588,24 @@ > MdeModulePkg/Universal/BdsDxe/BdsDxe.inf { > <LibraryClasses> > NULL|BoardModulePkg/Library/BdsPs2KbcLib/BdsPs2KbcLib.inf > +!if > gKabylakeOpenBoardPkgTokenSpaceGuid.PcdI2cHdmiDebugPortSerialTerminalEnable > == TRUE > + > NULL|BoardModulePkg/Library/BdsSerialPortTerminalLib/BdsSerialPortTerminalLib.inf > +!endif In the most recent version of my patch series, this has been replaced with the more generic: !if gMinPlatformPkgTokenSpaceGuid.PcdSerialTerminalEnable == TRUE NULL|MinPlatformPkg/Library/SerialPortTerminalLib/SerialPortTerminalLib.inf !endif Please do the same here. > } > +!if > gKabylakeOpenBoardPkgTokenSpaceGuid.PcdI2cHdmiDebugPortSerialTerminalEnable > == TRUE > + MdeModulePkg/Universal/SerialDxe/SerialDxe.inf { > + <LibraryClasses> > + DebugLib|MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull.inf > + > SerialPortLib|$(PLATFORM_BOARD_PACKAGE)/Library/I2cHdmiDebugSerialPortLib/DxeI2cHdmiDebugSerialPortLib.inf > + } > + MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf > +!endif > + > UefiCpuPkg/CpuDxe/CpuDxe.inf { > <LibraryClasses> > -!if $(USE_MEMORY_LOGGING) == TRUE > -# TODO/TEST > -# > SerialPortLib|MdeModulePkg/Library/PeiDxeSerialPortLibMem/DxeSerialPortLibMem.inf > + # Can debug CpuExceptionHandlerLib > +!if $(USE_HDMI_DEBUG_PORT) == TRUE > + > SerialPortLib|$(PLATFORM_BOARD_PACKAGE)/Library/I2cHdmiDebugSerialPortLib/DxeI2cHdmiDebugSerialPortLib.inf > !endif > } > > @@ -589,12 +641,9 @@ > <PcdsPatchableInModule> > gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80080046 > <LibraryClasses> > - !if $(TARGET) == DEBUG > - > DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf > - !endif > -!if $(USE_MEMORY_LOGGING) == TRUE > -# TODO/TEST > -# > SerialPortLib|MdeModulePkg/Library/PeiDxeSerialPortLibMem/SmmSerialPortLibMem.inf > + # Can debug CpuExceptionHandlerLib > +!if $(USE_HDMI_DEBUG_PORT) == TRUE > + > SerialPortLib|$(PLATFORM_BOARD_PACKAGE)/Library/I2cHdmiDebugSerialPortLib/SmmI2cHdmiDebugSerialPortLib.inf > !endif > } > !endif > diff --git > a/Platform/Intel/KabylakeOpenBoardPkg/AspireVn7Dash572G/OpenBoardPkg.fdf > b/Platform/Intel/KabylakeOpenBoardPkg/AspireVn7Dash572G/OpenBoardPkg.fdf > index 9eb37e7d230e..864d5561d7d8 100644 > --- a/Platform/Intel/KabylakeOpenBoardPkg/AspireVn7Dash572G/OpenBoardPkg.fdf > +++ b/Platform/Intel/KabylakeOpenBoardPkg/AspireVn7Dash572G/OpenBoardPkg.fdf > @@ -353,6 +353,10 @@ INF > MdeModulePkg/Universal/Console/GraphicsOutputDxe/GraphicsOutputDxe.inf > INF BoardModulePkg/LegacySioDxe/LegacySioDxe.inf > INF MdeModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2KeyboardDxe.inf > INF MdeModulePkg/Bus/Isa/Ps2MouseDxe/Ps2MouseDxe.inf > +!if > gKabylakeOpenBoardPkgTokenSpaceGuid.PcdI2cHdmiDebugPortSerialTerminalEnable > == TRUE > + INF MdeModulePkg/Universal/SerialDxe/SerialDxe.inf > + INF MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf > +!endif With the new PcdSerialTerminalEnable this should not be necessary anymore. MinPlatformPkg handles this with the included FDF files now. > INF BoardModulePkg/BoardBdsHookDxe/BoardBdsHookDxe.inf > > INF ShellPkg/Application/Shell/Shell.inf > @@ -584,12 +588,7 @@ INF > IntelSiliconPkg/Feature/VTd/IntelVTdDxe/IntelVTdDxe.inf > > !if gMinPlatformPkgTokenSpaceGuid.PcdBootToShellOnly == FALSE > > -INF $(PLATFORM_SI_PACKAGE)/Hsti/Dxe/HstiSiliconDxe.inf > - > -!endif > - > -!if gMinPlatformPkgTokenSpaceGuid.PcdBootToShellOnly == FALSE > - > +INF $(PLATFORM_SI_PACKAGE)/Hsti/Dxe/HstiSiliconDxe.inf > INF $(PLATFORM_PACKAGE)/Hsti/HstiIbvPlatformDxe/HstiIbvPlatformDxe.inf > > !if gMinPlatformPkgTokenSpaceGuid.PcdTpm2Enable == TRUE > diff --git > a/Platform/Intel/KabylakeOpenBoardPkg/AspireVn7Dash572G/OpenBoardPkgPcd.dsc > b/Platform/Intel/KabylakeOpenBoardPkg/AspireVn7Dash572G/OpenBoardPkgPcd.dsc > index a9d531a269a5..a4ea524e26bc 100644 > --- > a/Platform/Intel/KabylakeOpenBoardPkg/AspireVn7Dash572G/OpenBoardPkgPcd.dsc > +++ > b/Platform/Intel/KabylakeOpenBoardPkg/AspireVn7Dash572G/OpenBoardPkgPcd.dsc > @@ -228,7 +228,7 @@ > gEfiMdePkgTokenSpaceGuid.PcdReportStatusCodePropertyMask|0x07 > !else > gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x0 > - gEfiMdePkgTokenSpaceGuid.PcdReportStatusCodePropertyMask|0x3 > + gEfiMdePkgTokenSpaceGuid.PcdReportStatusCodePropertyMask|0x03 > !endif # $(RELEASE_LOGGING) > !else > # FIXME: More than just compiler optimisation is hooked to DEBUG builds. > @@ -264,6 +264,8 @@ > gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeUseMemory|FALSE > !if $(TARGET) == RELEASE > gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeUseSerial|FALSE > + # Determine RTS/CTS requirement There is no flow control in the HDMI DDC case since the I2C bus does not implement any flow control mechanisms. Therefore I think we can consider this comment resolved and always set the PCD to FALSE. > + gEfiMdeModulePkgTokenSpaceGuid.PcdSerialUseHardwareFlowControl|FALSE > !else > gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeUseSerial|TRUE > gEfiMdeModulePkgTokenSpaceGuid.PcdSerialUseHardwareFlowControl|FALSE > @@ -407,7 +409,37 @@ > # 3: DDC channel C > # 4: DDC channel D > # @Prompt DDC I2C channel to claim as the HDMI debug port > - gKabylakeOpenBoardPkgTokenSpaceGuid.PcdI2cHdmiDebugPortDdcI2cChannel|0x00 > #@todo - Set to correct value for VN7-572G > + gKabylakeOpenBoardPkgTokenSpaceGuid.PcdI2cHdmiDebugPortDdcI2cChannel|0x02 > + > + ## Enable usage the HDMI DDC channel as a debug port - Causes the BIOS > debug log > + # to be written to the HDMI DDC channel. > + # The value is defined as below. > + # FALSE: Do NOT use the HDMI DDC channel as a debug port > + # TRUE: Use the HDMI DDC channel as a debug port > + # @Prompt Enable usage the HDMI DDC channel as a debug port > + > gKabylakeOpenBoardPkgTokenSpaceGuid.PcdI2cHdmiDebugPortEnable|$(USE_HDMI_DEBUG_PORT) > + > + ## Enable usage the HDMI DDC channel as a serial terminal - Enables usage > of the > + # HDMI DDC channel to display BIOS Setup, UEFI Shell, etc. using a > terminal > + # emulator. Useful for cases where video is not operating correctly. > + # > + # The value is defined as below. > + # FALSE: Do NOT use the HDMI DDC channel as a debug port > + # TRUE: Use the HDMI DDC channel as a debug port > + # @Prompt Enable usage the HDMI DDC channel as a debug port > + > gKabylakeOpenBoardPkgTokenSpaceGuid.PcdI2cHdmiDebugPortSerialTerminalEnable|FALSE When you rebase up to latest, don't forget to include this from my most recent patch series: gMinPlatformPkgTokenSpaceGuid.PcdSerialTerminalEnable|gKabylakeOpenBoardPkgTokenSpaceGuid.PcdI2cHdmiDebugPortSerialTerminalEnable > + > + ## Indicates the type of terminal to use. > + # If PcdI2cHdmiDebugPortSerialTerminalEnable is TRUE, this PCD will be > used > + # to determine which terminal protocol to use. > + # 0 - PCANSI > + # 1 - VT100 > + # 2 - VT100+ > + # 3 - UTF8 > + # 4 - TTYTERM > + # @Prompt Default Terminal Type. > + # @ValidRange 0x80000001 | 0 - 4 > + gEfiMdePkgTokenSpaceGuid.PcdDefaultTerminalType|3 > > [PcdsFixedAtBuild.IA32] > ###################################### > @@ -433,7 +465,16 @@ > ###################################### > # Edk2 Configuration > ###################################### > - gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000046 # > 0x804800C7/0x806A15CF give useful information, but is very noisy > + # TODO: Dynamic in HII I have converted this TODO into a proper Bugzilla and assigned it to you: https://bugzilla.tianocore.org/show_bug.cgi?id=4056 Please delete this comment. > + gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000046 > +!if FALSE > + # Filtered DEBUG_POOL, DEBUG_PAGE, DEBUG_GCD and DEBUG_CACHE > + # - Unused: DEBUG_VARIABLE, DEBUG_BM and DEBUG_LOADFILE > + gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x804950CF > +!endif > +!if ($(TESTING) == TRUE && $(USE_HDMI_DEBUG_PORT) == FALSE) > + gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80400046 > +!endif > > ###################################### > # Silicon Configuration > @@ -446,9 +487,9 @@ > # Platform Configuration > ###################################### > !if $(TARGET) == DEBUG > - gMinPlatformPkgTokenSpaceGuid.PcdSecSerialPortDebugEnable|1 > + gMinPlatformPkgTokenSpaceGuid.PcdSecSerialPortDebugEnable|TRUE > !else > - gMinPlatformPkgTokenSpaceGuid.PcdSecSerialPortDebugEnable|0 > + gMinPlatformPkgTokenSpaceGuid.PcdSecSerialPortDebugEnable|FALSE > !endif > > [PcdsDynamicDefault] > @@ -528,6 +569,9 @@ > !else > > gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut|L"Timeout"|gEfiGlobalVariableGuid|0x0|5 > # Variable: L"Timeout" > !endif > +!if $(USE_HDMI_DEBUG_PORT) == TRUE > + > gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut|L"Timeout"|gEfiGlobalVariableGuid|0x0|15 > # Variable: L"Timeout" > +!endif > !if gMinPlatformPkgTokenSpaceGuid.PcdTpm2Enable == TRUE > > gEfiSecurityPkgTokenSpaceGuid.PcdTcgPhysicalPresenceInterfaceVer|L"TCG2_VERSION"|gTcg2ConfigFormSetGuid|0x0|"1.3"|NV,BS > > gEfiSecurityPkgTokenSpaceGuid.PcdTpm2AcpiTableRev|L"TCG2_VERSION"|gTcg2ConfigFormSetGuid|0x8|3|NV,BS > -- > 2.37.2 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#93619): https://edk2.groups.io/g/devel/message/93619 Mute This Topic: https://groups.io/mt/93506705/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-